Python测试之道
上QQ阅读APP看书,第一时间看更新

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种,其他的复杂运算也是在这个基础上进行拓展的,测试脚本不需要写复杂的运算,主要是运用于结构化设计的循环和判断,后面会具体介绍。