y = 94/2-35

        通过前面两篇文章的讲解,我们了解了等号左边变量的概念,等号右边数据类型的概念,在这一篇,我们来了解一下等号本身以及相关的运算符。此外,本章开始建议读者自行运行程序,自行做任何感兴趣的修改来探索Python的特性,加深理解。

一、运算符

        对变量和值进行操作的就是运算符。

1)算术运算符

        这一部分就是前文我们在鸡兔同笼的编程例子中遇到的,加(“+”)减(“-”)乘(“*”)除(“/”)。他们的基础用法与日常的数学算式完全相同。此外,数学计算里的取余运算对应到Python里符号是“%”,整除是“//”,求幂是“**”。这些符号虽然不常见但它们的用法与前面的加减乘除完全一样。

y = 1 + 2
print(y)

y = y - 3 
print(y)

y = y *4
print(y)

y = y /5
print(y)

x = y % 10
print(x)

x = y // 10
print(x)

x = y ** 2
print(x)

        在数学运算中我们还有一个重要的内容是括号,数学算式里,括号内的算式会被优先计算。Python也对此提供了一模一样的功能。

y = 1 + 2 - 3 *4 /5
print(y)

y = (1 + 2 - 3) *4 /5
print(y)

            除了这些数学上的功能外,值得介绍的是“+”在Python中具有拼接功能。

txt = "文本1"
print(txt)

txt = txt + "文本2"
print(txt)

        运行代码后我们可以在输出结果里看到txt的内容从“文本1”变成了“文本1文本2”,字符串“文本1”和字符串“文本2”按照顺序拼接在了一起。各位读者这里可能有些疑惑,经过拼接后字符串明明改变了,但是前文我们介绍的时候字符串的特点是不可变。为什么会有这种矛盾?在这里,我们首先要区分的是,变量与变量内存储的值的区别。变量只是一个空间,值则是这个这个空间的住客。当我们使用print()打印变量的时候,查询的是变量内的住客。第一句,“文本1”这串字符串住进了变量空间里,所以打印了“文本1”。第三句,“文本1”和“文本2”被拼接在了一起,创建出了一个新的值“文本1文本2”,住进了变量空间里并覆盖掉了前一个值,所以打印的是新住客“文本1文本2”。并不是字符串发生了改变,而是新的字符串被创造了出来,替代了原字符串住进了变量空间里。

        在面对非数值类型的数据时,“+”的作用恒为拼接。

lst1 = [1, 2, 3]
lst2 = [4, 5, 6]

print(lst1 + lst2)

        就像这里,我们创建了两个长度为3的列表,列表中每个元素均为整数型数字。但是即便其中每一个元素都可以进行数学上的加运算对他们使用“+”的效果依然是拼接。当然,这其实很好理解,列表只是一个容器,其中可以储存包括布尔值、字符串在内的任意元素。这些元素很显然并不是每一个都能进行数学上的加运算,特别是两个列表元素内容一个为字符串一个为数值时,Python显然无法对其进行任何运算。只有拼接整个列表是通用的,不管列表内储存的是什么值,显然都不会影响将两个列表拼接起来的操作。而Python不直接提供把两个元素为全数值的列表之间的“+”运算,这类需求会在后续中以其他方式实现。

2)赋值运算符

y = 94/2-35

        这行简单的代码虽然蕴含了如此之多的知识,但现在我们只差最后一个简单的“=”等待学习了。

        在Python中,“=”归属于赋值运算符。要想,透彻理解它,我们就需要将话题先转到变量上面。我们知道了变量名的命名规则,也了解到像“y = 94/2-35”这样书写类似格式的语句就能创建一个变量“y”并将算式的运算结果“12”储存进去。但是我们还未详细的提及其中变量创立和数值存储的具体逻辑,为什么这样做就会有变量被创建,基于的究竟是什么理念?有没有其他的创建方式?

        我们知道,变量本身只是被划定出来的一块空间,真正指代具体事物的数据是变量内存储的值。所以Python基于面向对象(面向具体事物)的设计理念,只有当一个指向具体事物的值需要被存储时,变量才会被创建并分配空间。也就是说在Python里赋值语句就是创建变量的主要方式。

a = 1
a = a + 1

print(a)

# 等价写法
a = 1
a += 1

print(a)

        此外Python为了方便还开发出了赋值增强语句。简单来说就是普通语句的缩写,如上所示。其他符号也是同样的用法,仅需在基础赋值语句的等号左侧添加所需的运算符即可。

a = b = c = 42 # 链式赋值

a, b = 1, 2 # 多重赋值
print(a, b)
a, b = b, a # 达成值互换的效果
print(a, b)

3)比较、逻辑运算符

        比较运算符“==”、“!=”、“>”、“<”、“>=”、“<=”

        逻辑运算符and、or、not

       上一篇文章我们介绍了变量与数据的实现顺序问题。现在让我们来验证一下两者的地址是否确实相等。

a = 42
# id()该函数的作用是检查被传入数据的地址
print(id(a))
print(id(42))

print(id(a) == id(42))

        需要注意的是“=”是赋值语句,只有“==”才是判断值两端是否相等的符号。作为运算符,它的运算结果是布尔值,如果符号两端的值相等则返回True,否则False。

二、Python里的控制结构

1)选择结构

        if语句常见格式为:

        这就如自然语言一样,其实很好理解。if(如果)条件1是真的,那就执行代码一,elif(或者如果)条件2是真的,那就执行代码2...else(最后要是以上都不成立),那就执行代码n。
        当然,面对更简单的场景时我们可以缩减。比如进行是否判断时,我们可以忽略elif,仅if 条件成立,执行代码1。条件不成立就else,执行代码2。
        这里着重要解释的就是格式了。if/elif空一格再写条件判断表达式,条件写完后要增添一个冒号表示完结。内部的代码块要按下tab缩进四格以示区分。

        为了帮助各位更好的理解,我们来看接下来这个例子。

age = int(input("请输入你的年龄:"))    #input(),将会在控制台输出提示性文本 请输入你的年龄:,并将用户键入的值以str形式返回

#第一部分
if age <= 18:
    print("未成年!")
elif age <= 65:
    print("成年人!")
else:
    print("老年人!")

#第二部分
if age <= 18:
    print("*未成年!*")
if age <= 65:
    print("*成年人!*")
else:
    print("老年人!")

        这两种代码的核心区别就是第二部分的代码并未使用elif,这会导致任何18及以下的输入都会使“*未成年!*”和“*成年人!*”同时被打印。临时提问:为什么呢?

#

#

#

        因为当我们在执行elif的时候,我们说的是“或者如果”,既事实上这里执行的判断是条件一不满足且条件二满足。而在第二部分的代码中第二条判断语句从elif变为if就使判断条件变成了只要满足条件二即可。在这里,显然任何满足条件一的(输入年龄是在18及以下)都会满足条件二(输入年龄在65及以下)

2)循环结构

        循环分两种,一种有限,叫for循环,一种无限,叫while循环。

        什么叫有限?举个具体例子。

for i in 'python':
    print(i)
print('循环结束喽')

        在这里,我们从'python'这串字符串中遍历组成它的每一个字符。第一次循环,我们读取到字符'p',将它放入变量i,然后通过print()将i中存储的内容打印出来;第二次,我们读取到字符'y'...这样依次读取,当最后一个字符'n'也被取出时循环就结束了。这样循环的次数显而易见的由字符串的长度决定,就是所谓的有限循环。

        对于for循环还有一个常用的函数range()。这里给出示例,较为简单就不加以赘述了。

for i in range(10):
    print(i)

for i in range(5, 10):
    print(i)

for i in range(10, 5, -1):
    print(i)

        对于无限循环,while,它如何无限呢。因为while语句是这样写的。

flag = 1
while flag == 1:
    print('循环中')
print('循环结束')

        这段代码不建议大家运行,因为这是无限循环,也称死循环。如果误运行了请按ctrl+c终止,或者干脆关掉你的软件。为什么会无限循环?因为while语句会在每次循环时判断while后面的条件是否成立,如果成立,就执行内部的代码。而条件"flag == 1"显然恒成立。

3)异常处理

        对于任何一段代码来说,出Bug都是一个不得不考虑的情形。那么就相应的会有处理Bug的方法。第一种颇为有用:调试。在Pycharm中,我们可以在代码行数上单击以设置break point(断点),让程序在运行到该行代码前就停止。右键唤起菜单,单击Debug 'main'(调试主文件)选项,进入Debug(排除Bug)模式。在该模式下我们可以逐行调试代码,每按下一次Step(步过)计算机将会执行一行代码,并停下来让我们能够查看当前变量到底变化成了什么值。在遇到函数时,我们还可以点击Step Into(步进),进入函数内查看仔细运行过程。为我们排除Bug提供了很大的便利。第二种办法就是异常捕获语句,但是对于我们的目标的开发岗来说意义不大,这里仅给出示例。感兴趣可自行学习。

try:
    num = int(input("请输入一个数字: "))
    result = 10 / num
    print(f"结果是: {result}")
except ValueError:
    print("输入的不是有效数字!")
except ZeroDivisionError:
    print("不能除以零!")
except Exception as e:
    print(f"发生错误: {e}")
else:
    print("计算成功!")
finally:
    print("程序执行完毕。")

4)顺序结构

        事实上,还有一种结构叫顺序结构,顾名思义就是按正常顺序一行行书写下来的的代码就是顺序结构。所以不多加以介绍。

三、一个良好的编程习惯是必要的

        到此,想必朋友你已通过文内的跟练或者自己看补充查阅辅助理解的其他资料多少练习了一些。或许注意到一个良好的编程习惯颇为重要。
        在现在代码仅有几行时,它能让你的代码保持美观。更重要的是到后期代码行数几何级增长时,这会让你的代码更简洁易读。这是拒绝“屎山代码”的重要进步。
        我的建议,先从赋值语句“=”的两端各自按下一个空格键分隔,算式中“+”或“-”的两端也按下一个空格键分隔开始。逗号后也时常要记得添加一个空格。此外,一段功能完整的代码块(例如前文的函数)最好也在它的前后各空置一行,以示独立性。当然如果代码量过大的话我们甚至可以让一个函数单独作为一个文件,这个我们后续展开。

        当然,这并不是什么硬性要求,各位完全可以按照自己的喜好来具体操作。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐