前面介绍了Python中的一些基础语法,其中每个变量都有自己的数据类型,通过运算符把它们连接起来,最后返回一个需要的结果。本章主要讲解Python的基本数据类型和运算符等知识。建议读者多编写代码,亲自体验Python语言的数据类型和运算符。
Python 3中有两个简单的数据类型,即数字类型和字符串类型。
Python 3支持int(整数)、float(浮点数)、bool(布尔值)、complex(复数)4种数字类型。
注意: 在Python 2中是没有bool的,用数字0表示False,用1表示True。在Python 3中,把False和True定义成了关键字,但它们的值还是0和1,可以和数字相加。
下面是整数的例子:
>>> a = 666688 >>> a 666688
可以使用十六进制数值来表示整数。十六进制整数的表示法是在数字之前加上0x,如0x80120000、0x100010100L。例如:
>>> a=0x6EEEFFFF >>> a 1861156863
浮点数的表示法可以使用小数点,也可以使用指数的类型。指数符号可以使用字母e或E来表示,指数可以使用+/-符号,也可以在指数数值前加上数字0,还可以在整数前加上数字0。例如:
6.66 12. .007 1e100 3.14E-10 1e010 08.1
使用float()内置函数可以将整数数据类型转换为浮点数数据类型。例如:
>>> float(660) 660.0
Python的布尔值包括True和False,只与整数中的1和0有对应关系。例如:
>>> True==1 True >>> True==2 False >>> False==0 True >>> False==-1 False
这里利用符号(==)判断左右两边是否绝对相等。
复数的表示法是使用双精度浮点数来表示实数与虚数的部分,复数的符号可以使用字母j或J。例如:
1.5 + 0.5j 1J 2 + 1e100j 3.14e-10j
数值之间可以通过运算符进行运算操作。例如:
>>> 50 + 40 # 加法 90 >>> 50 - 40 # 减法 10 >>> 30 * 15 # 乘法 450 >>> 1/2 # 除法,得到一个浮点数 0.5 >>> 1//2 # 除法,得到一个整数 0 >>> 15 % 2 # 取余 1 >>> 2 ** 10 # 乘方 1024
在进行数字运算时,需要注意以下问题:
(1)数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符。
(2)在整数和浮点数混合计算时,Python会把整数转换为浮点数。
【例3.1】计算商品的总价格和平均价格(源代码\ch03\3.1.py)。
name="家用电器" #保存商品类别的姓名 print ("商品的类别是:"+name) m1= 3866 #保存家用电器洗衣机的价格 #使用内置的str()函数可以将数值转化为字符串 print("家用电器洗衣机的价格是:"+str(m1)) m2 = 4866 #保存家用电器电冰箱的价格 print("家用电器电冰箱的价格是:"+ str(m2)) m3 = 8668 #保存家用电器空调的价格 print("家用电器空调的价格是:"+ str(m3)) sum= m1+m2+m3 #保存家用电器的总价格 print("家用电器的总价格是:"+str(sum)) avg= sum/3 #保存家用电器的平均价格 print("家用电器的平均价格是:"+str(avg))
程序运行结果如图3-1所示。
图3-1 程序运行结果
Python将字符串视为一连串的字符组合。在Python中,字符串属于不可变序列,通常使用单引号、双引号或者三引号引起来。这3种引号形式在语义上没有区别,只是在形式上有些差别。其中单引号和双引号的字符序列必须在一行上,而三引号内的字符序列可以分布在连续的多行上。例如:
>>> a="张小明" #使用双引号时,字符串的内容必须在一行 >>> b='最喜欢的水果' #使用单引号时,字符串的内容必须在一行 >>> c='''骤雨东风对远湾,滂然遥接石龙关。 野渡苍松横古木,断桥流水动连环。 客行此去遵何路,坐眺长亭意转闲。''' >>> print (a) 张小明 >>> print (b) 最喜欢的水果 >>> print (c) 骤雨东风对远湾,滂然遥接石龙关。 野渡苍松横古木,断桥流水动连环。 客行此去遵何路,坐眺长亭意转闲。
【例3.2】输出一个我的小屋(源代码\ch03\3.2.py)。
由于该字符画有多行,因此使用三引号作为定界符。
print(''' ********* * * * * * * * * ******************* * * * ***** * * * * * * ***** * * * * * *************** ''')
程序运行结果如图3-2所示。
图3-2 程序运行结果
注意: 字符串开头与结尾的引号要一致。
有时候,用户需要对数据内置的类型进行转换。数据类型的转换只需要将数据类型作为函数名即可。以下几个内置的函数可以执行数据类型之间的转换,这些函数返回一个新的对象,表示转换的值。
语法格式如下:
int(x)
将x转换为一个整数,例如:
>>>int(3.6) 3
注意: int()函数不能转换非数字类型的数值。例如使用int()函数转化字符串时,将会提示ValueError错误:
>>> int("苹果") Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> int("苹果") ValueError: invalid literal for int() with base 10: '苹果'
语法格式如下:
float(x)
将x转换为一个浮点数。例如:
>>> float (10) 10.0
语法格式如下:
str(x)
将x转换为一个字符串。例如:
>>>str(12356789) '12356789'
【例3.3】模拟超市的抹零结账行为(源代码\ch03\3.3.py)。
假设超市为顾客提供结账便利,进行抹零操作。这里使用int()函数将浮点型的变量转化为整数,从而实现抹零效果。本案例还会用到str()函数,主要作用是将数字转化为字符串类型。代码如下:
price=8.66 #保存顾客需要结算的商品单价 moneys=price*20 #计算商品的总价格 print("商品的总价是:"+ str(moneys)) real_moneys=int(moneys) #进行抹零操作 print("本次实付商品的总价是:"+ str(real_moneys))
程序运行结果如图3-3所示。
图3-3 程序运行结果
在Python语言中,支持的运算符(operator)包括算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符和身份运算符。
Python语言中常见的算术运算符如表3-1所示。
表3-1 算术运算符
【例3.4】使用算术运算符(源代码\ch03\3.4.py)。
x = 10 y = 12 z = 30 #加法运算 a = x + y print ("a的值为:", a) #减法运算 a =x - y print ("a 的值为:", a) #乘法运算 a = x * y print ("a 的值为:", a) #除法运算 a = x / y print ("a 的值为:",a) #取模运算 a= x % y print ("a 的值为:", a) #修改变量x 、y、z x = 10 y = 12 z = x**y print ("z 的值为:", z) #整除运算 x=15 y = 3 z = x//y print ("z 的值为:", z)
保存并运行程序,结果如图3-4所示。
图3-4 程序运行结果
Python语言支持的比较运算符如表3-2所示。
表3-2 比较运算符
【例3.5】使用比较运算符(源代码\ch03\3.5.py)。
a = 16 b = 4 # 判断变量 a和b是否相等 if ( a == b ): print ("a 等于 b") else: print ("a 不等于 b") # 判断变量 a和b是否不相等 if ( a != b ): print ("a 不等于 b") else: print ("a 等于 b") # 判断变量 a是否小于b if ( a < b ): print ("a 小于 b") else: print ("a 大于或等于 b") # 判断变量 a是否大于b if ( a > b ): print ("a 大于 b") else: print ("a 小于或等于 b") # 修改变量 a 和 b 的值 a = 15; b = 32; # 判断变量 a是否小于或等于b if ( a <= b ): print ("a 小于或等于 b") else: print ("a 大于 b") # 判断变量 b是否大于或等于a if ( b >= a): print ("b 大于或等于 a") else: print ("b 小于 a")
保存并运行程序,结果如图3-5所示。
图3-5 程序运行结果
赋值运算符表示将右边变量的值赋给左边变量,常见的赋值运算符的含义如表3-3所示。
表3-3 赋值运算符
【例3.6】使用赋值运算符(源代码\ch03\3.6.py)。
a = 36 b = 69 c = 60 #简单的赋值运算 c = a + b print ("c 的值为:", c) #加法赋值运算 c += a print ("c 的值为:", c) #乘法赋值运算 c *= a print ("c 的值为:", c) #除法赋值运算 c /= a print ("c 的值为:", c) #取模赋值运算 c = 12 c %= a print ("c 的值为:", c) #幂赋值运算 a=3 c **= a print ("c 的值为:", c) #取整除赋值运算 c //= a print ("c的值为:", c)
保存并运行程序,结果如图3-6所示。
图3-6 程序运行结果
Python支持的逻辑运算符如表3-4所示。
表3-4 逻辑运算符
【例3.7】验证防盗门的用户名称和密码(源代码\ch03\3.7.py)。
print ("开始验证用户名和密码") #输出提示消息 name=input("请输入您的用户名:") #使用input()函数接收输入的信息 password=input("请输入您的密码:") #使用input()函数接收输入的信息 #将输入的信息转化为整数 if(password=="pass1808" and (name=="小明" or number=="小磊")): print ("恭喜您,用户名和密码验证成功!") else: print ("对不起,用户名或密码验证错误!")
保存并运行程序,结果如图3-7所示。
图3-7 程序运行结果
在Python中,位运算符把数字看作二进制来进行计算。Python支持的位运算符如表3-5所示。
表3-5 位运算符
【例3.8】使用位运算符(源代码\ch03\3.8.py)。
a = 12 # 12 =0000 1100 b = 6 # 6= 0000 0110 c = 0 #按位与运算 c = a & b; # 4 = 0000 0100 print ("c的值为:", c) #按位或运算 c = a | b; # 14 = 0000 1110 print ("c 的值为:", c) #按位异或运算 c = a ^ b; # 10 = 0000 1010 print ("c的值为:", c) #按位取反运算 c = ~a; # -13 = 1000 1101 print ("c 的值为:", c) #左移动运算 c = a << 2; # 48 = 0011 0000 print ("c 的值为:", c) #右移动运算 c = a >> 2; # 3 = 0000 0011 print ("c 的值为:", c)
保存并运行程序,结果如图3-8所示。
图3-8 程序运行结果
Python还支持成员运算符。成员运算符包括in和not in,x in y表示若x在y序列中,则返回True;x not in y表示若x不在y序列中,则返回True。
【例3.9】使用成员运算符(源代码\ch03\3.9.py)。
a ='洗衣机' b = '风扇' goods = ['电视机', '空调', '洗衣机', '冰箱', '电脑' ]; # 使用in成员运算符 if ( a in goods ): print ("变量a在给定的列表goods中") else: print ("变量a不在给定的列表goods中") # 使用not in成员运算符 if ( b not in goods ): print ("变量b不在给定的列表goods中") else: print ("变量b在给定的列表goods中") # 修改变量a的值 a = '冷风扇' if ( a in goods ): print ("变量a在给定的列表goods中") else: print ("变量a不在给定的列表goods中")
保存并运行程序,结果如图3-9所示。
图3-9 程序运行结果
Python支持的身份运算符为is和not is。其中,is判断两个标识符是不是引用自一个对象,is not判断两个标识符是不是引用自不同对象。
【例3.10】使用身份运算符(源代码\ch03\3.10.py)。
a ='风扇' b = '冷风扇' #使用is身份运算符 if ( a is b): print ("a和b有相同的标识") else: print ("a和b没有相同的标识") #使用is not身份运算符 if ( a is not b ): print ("a和b没有相同的标识") else: print ("a和b有相同的标识") # 修改变量a的值 a = '冷风扇' if ( a is b): print ("修改后的a和b有相同的标识") else: print ("修改后的a和b仍然没有相同的标识")
保存并运行程序,结果如图3-10所示。
图3-10 程序运行结果
Python运算符的优先级从高到低的顺序如表3-6所示。
表3-6 运算符的优先级
使用运算符时注意下面的事项:
(1)除法应用在整数时,其结果会是一个浮点数。例如,8/4会等于2.0,而不是2。余数运算会将x/y所得的余数返回来,如7%4 =3。
(2)如果将两个浮点数相除取余数的话,那么返回值也会是一个浮点数,计算方式是x – int(x/ y) * y。例如:
>>>7.0 % 4.0 3.0
(3)比较运算符可以连在一起处理,如a<b<c<d,Python会将这个式子解释成a<b and b<c and c<d。像x<y>z也是有效的表达式。
(4)如果运算符两端的运算数(operand)的数据类型不同,Python就会将其中一个运算数的数据类型转换为与另一个运算数一样的数据类型。转换顺序为:若有一个运算数是复数,则另一个运算数也会被转换为复数;若有一个运算数是浮点数,则另一个运算数也会被转换为浮点数。
(5)Python有一个特殊的运算符——lambda。利用lambda运算符能够以表达式的方式创建一个匿名函数。lambda运算符的语法格式如下:
lambda args : expression
args是以逗号(,)隔开的参数列表,而expression则是对这些参数进行运算的表达式。例如:
>>>a=lambda x,y:x + y >>>print (a(3,4)) 7
x与y是a()函数的参数,a()函数的表达式是x+y。lambda运算符后只允许有一个表达式。要达到相同的功能,也可以使用函数来定义a,如下所示:
>>> def a(x,y): #定义一个函数 return x + y #返回参数的和 >>> print (a(3,4)) 7
【例3.11】运算符的优先级(源代码\ch03\3.11.py)。
a = 50 b = 80 c = 40 d = 20 e = 0 e = (a + b) * c / d #(130 *40 ) / 20 print ("(a + b) * c / d 运算结果为:", e) e = ((a + b) * c) / d # (130 *40 ) /20 print ("((a + b) * c) / d 运算结果为:", e) e = (a + b) * (c / d); # (130) * (40/20) print ("(a + b) * (c / d) 运算结果为:", e) e = a + (b * c) / d; # 50 + (3200/20) print ("a + (b * c) / d 运算结果为:", e)
保存并运行程序,结果如图3-11所示。
图3-11 程序运行结果
从Python 3.8版本开始加入赋值表达式。赋值表达式的运算符为:=,主要作用是赋值并返回值。
例如下面的代码:
>>> a=1024 >>> print(a) 1024
将上述代码修改如下:
>>> a=1024 >>> print(a:=1024) 1024
赋值表达式不仅在构造上更简单,也可以更清楚地表达代码的意图。
赋值表达式的优势在循环操作中更加明显。下面举例说明。
names = list() name = input("请输入账号: ") while name != "xiaoming": names.append(name) name = input("请输入账号: ")
上述代码将判断输入的账号是否为xiaoming,需要不断重复input语句,并且将输入的内容添加到name列表中。
上述代码比较麻烦,修改思路为:通过一个while无限循环,然后用break停止循环。修改后的代码如下:
names = list() while True: name = input("请输入账号: ") if name == "xiaoming": break names.append(name)
这段代码与前面的代码是等效的,不过,如果使用赋值表达式,还可以进一步简化这段循环,代码如下:
names = list() while (name := input("请输入账号: ")) != "xiaoming": names.append(name)
上述3段代码实现了同样的功能,但是使用赋值表达式最简单。
注意: 尽管赋值表达式使用起来可以使代码更简洁,但是代码的可读性会变差一些,所以如果想要可读性更强一些,可以不使用赋值表达式。