3.2 变量与运算
3.2.1 变量
变量可以由字母、数字或者下画线任意组合而成,唯一的约束就是变量的第一个字符必须是字母或者下画线,而不可以是数字。
实例代码:
1 a = 1
2 a_1 = 2
3 _b = 3
4 1_b =4
运行结果如图3.8所示。
根据规则,第四行的变量定义是不符合规范的,所以该程序会报错。
从上面的例子中你会发现在定义变量和赋值时,Python与其他编程语言最大的不同就是赋值不需要类型声明,而且变量可以存储任何值。
图3.8 运行结果图
每个变量在内存中创建,都包括变量的标识、名称和数据这些信息。
每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
等号(=)用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
实例代码:
1 a = 100
2 b = "John"
3 c = 1.11
4 print (type(a))
5 print (type(b))
6 print (type(c))
代码说明:
1 给变量a赋值为100的整数,a就是整数类型。
2 给变量b赋值为1.11的浮点数,b就是字符串。
3 给变量c赋值为John的字符串,c就是浮点型。
运行结果如图3.9所示。
变量不仅仅可以赋值各种类型,而且还可以随意改变类型。
实例代码:
1 a = 1
2 print (type(a))
3 a = 3.22
4 print (type(a))
5 a = "John"
6 print (type(a))
代码说明:
分别打印3次a的类型,可以发现变量a的类型随着赋值的改变而不断地改变。
运行结果如图3.10所示。
图3.9 运行结果图
图3.10 运行结果图
不要小看这么一个小小的语法特点,随着不断深入学习,这个优势可以被无限放大,尤其对于不懂编程的初学者来说,数据类型往往是最头疼的一点。
再说变量分为全局变量和局部变量,顾名思义,全局变量就是对于整个文件产生作用,也就是说该变量直到程序结束才会被回收,而局部变量只能对某一部分代码产生作用,一旦这部分代码结束,这个变量就会被回收。下面来对比一下两者的差别。
实例代码:
1 def d():
2 a = 1
3 if __name__ == "__main__":
4 d()
5 print (a)
代码说明:
1 定义一个d的函数。
2 将变量a赋值为1。
3 主函数调用。
4 调用自定义函数d。
5 打印变量a。
运行结果如图3.11所示。
因为a在执行完第四行d函数的时候就被回收了,第五行执行时发现不存在a这个变量,所以就报错了,如果要打印变量需要在d函数中执行。
实例代码:
1 def d():
2 a = 1
3 print (a)
4 if __name__ == "__main__":
5 d()
运行结果如图3.12所示。
图3.11 运行结果图
图3.12 运行结果图
这样a就在回收之前执行了打印,就不会报错了,通过这个例子应该可以理解局部变量的作用范围了吧。
接着再说全局变量,全局变量一般定义在文件开头,不能放在某个函数之中,这样的话就可以作为全局变量被外部文件或者文件内其他函数调用,但调用时需要通过一个global+变量的方式引用全局变量。
实例代码:
1 a = 1
2 def d():
3 global a
4 print (a)
5 if __name__ == "__main__":
6 d()
7 print (a)
代码说明:
1 定义全局变量a并赋值1。
3 函数d中引用全局变量a。
4 打印函数内引用的变量a。
7 打印全局变量a。
运行结果如图3.13所示。
此时代码是不会报错的,因为变量a是全局变量,可以理解为公用的变量。
那么也许你要问全局变量是否可以被函数所改变,答案是可以的。
实例代码:
1 a = 1
2 def d():
3 global a
4 a = 2
5 if __name__ == "__main__":
6 d()
7 print (a)
代码说明:
4 将引用的全局变量重新赋值为2。7 打印全局变量a。
运行结果如图3.14所示。
图3.13 运行结果图
图3.14 运行结果图
可见全局变量也是可以被引用后改变的,并以最后一次改变的值作为最终的值。
3.2.2 运算
1.算术运算
常用的算术运算就是加减乘除,看个实例就完全明白了。
实例代码:
1 a = 2
2 b = 1
3 print (a-b)
4 print (a+b)
5 print (a*b)
6 print (a/b)
代码说明:
3-6 分别是加减乘除的运算,并打印运算结果。
运行结果如图3.15所示。
当出现复杂的运算时遵循两个原则:(1)括号内的运算优先运算;(2)先乘除后加减,从左往右依次运算。
实例代码:
1 a = 1
2 b = 2
3 c = 3
4 print (a+b*c)
5 print ((a+b)/c)
代码说明:
4 遵循第二条原则,先运算b*c,再运算加法。
5 遵循第一条原则,先运算括号内的a+b,再运算除。
运行结果如图3.16所示。
图3.15 运行结果图
图3.16 运行结果图
通过这2个例子应该可以对算术运算有所了解了。
2.关系运算
关系运算就是对2个对象进行比较,通过比较符判断进行比较,有6种比较方式。
x>y 大于
x>=y 大于等于
x<y 小于
x<=y 小于等于
x==y 等于
x!=y 不等于
这6种比较的结果只有2个,True或者False,比较的结果与事实一致就是True,反之就是False。
实例代码:
1 a = 1
2 b = 2
3 c = 3
4 print (a<b)
5 print (b==c)
代码说明:
4 打印判断a是否小于b的结果。
5 打印判断b和c是否相等的结果。
运行结果如图3.17所示。
另外关系运算的优先级低于算术运算,当两者同时存在时优先进行算术运算,再进行关系运算,把代码改一下。
实例代码:
1 a = 1
2 b = 2
3 c = 3
4 print (a+b==c)
5 print (c>b-a)
代码说明:
4 打印判断a+b是否等于c的结果。
5 打印判断c是否大于b-a的结果。
运行结果如图3.18所示。
图3.17 运行结果图
图3.18 运行结果图
3.逻辑运算
逻辑运算都分3种,逻辑与、逻辑或、逻辑非,但这里又和其他语言有着不同。
x and y 逻辑与
x or y 逻辑或
not x 逻辑非
在理解这3种逻辑运算之前先要明白True和False的判断,值不为0或者不为空,程序均判断为True。
对于逻辑与来说,只有当x为True的时候,才会去计算y值。
对于逻辑或来说,只有当x为False的时候,才会去计算y值。
对于逻辑非来说,当x为True的时候,返回False,反之就是返回True。
实例代码:
1 a = 3
2 b = 4
3 print (a and b)
4 print (a or b)
5 print (not a)
代码说明:
3 打印a and b的运算结果,由于a等于3是True,所以才会处理到b,那么结果就是b的值。
4 打印a or b的运算结果,由于a等于3是True,所以不会处理到b,那么结果就是a的值。
5 打印not a的运算结果,由于a等于3是True,所以运行会返回False。
运行结果如图3.19所示。
图3.19 运行结果图
实例代码:
1 a = 0
2 b = 4
3 print (a and b)
4 print (a or b)
5 print (not a)
代码说明:
3 打印a and b的运算结果,由于a等于0是False,所以不会处理到b,那么结果就是a的值。
4 打印a or b的运算结果,由于a等于0是False,所以会处理到b,那么结果就是b的值。
5 打印not a的运算结果,由于a等于0是False,所以运行会返回True。
运行结果如图3.20所示。
相信通过这2个例子已经能够理解逻辑运算的意思了,另外逻辑运算的优先级低于关系运算,当两者同时存在的时候先进行关系运算,再进行逻辑运算。
实例代码:
1 a = 0
2 b = 4
3 print (a>b and a==b)
4 print (a<b and a==b)
5 print (not a!=b)
代码说明:
3 先计算a大于b是False,所以不进行后面的判断。
4 先计算a小于b是True,所以继续判断a等于b是False。
5 先计算a不等于b是True,所以返回反的结果。
运行结果如图3.21所示。
图3.20 运行结果图
图3.21 运行结果图
运算主要就是以上3种,其他的复杂运算也是在这个基础上进行拓展的,测试脚本不需要写复杂的运算,主要是运用于结构化设计的循环和判断,后面会具体介绍。