运算符
相比其他编程语言,Python 中的运算符更为丰富,准功能更为强大。Python 中的运算符可分为算术运算符、比较运算符、赋值运算符、逻辑运算符等。本节将对这些运算符的使用进行讲解。
1 算术运算符
Python中的算术运算符包括+、-、*、/、//、%和**
,这些运算符都是双目运算符,每个运算符可以与两个操作数组成一个表达式。
以操作数a=3,b=5为例,Python 中各个算术运算符的功能与示例如表所示。
表 算术运算符的功能与示例
运算符 | 功能 | 示例 |
+ | 加:使两个操作数相加,获取操作数的和 | a+b,结果为8 |
- | 减:使两个操作数相减,获取操作数的差 | a-b,结果为-2 |
* | 乘:使两个操作数相乘,获取操作数的积 | a*b,结果为15 |
/ | 除:使两个操作数相除,获取操作数的商 | a/b,结果为0.6 |
// | 整除:使两个操作数相除,获取商的整数部分 | a//b,结果为0 |
% | 取余:使两个操作数相除,获取余数 | a%b,结果为3 |
** | 幂:使两个操作数进行幂运算,获取objl的obj2次幂 | a**h,结果为243 |
Python中的算术运算符支持对相同或不同类型的数字进行混合运算。例如: .
>>>3+(3+2j) #整型+复数
(6 +2j)
>>>3*4.5 #整型*浮点型
13.5
>>> 5.5-(2+35) #浮点型-复数
(3.5 -3j)
>>> True+ (1+2j) #布尔类型+复数
(2+2j)
无论参加运算的操作数是什么类型,解释器都能给出运算后的正确结果,这是因为Python在对不同类型的对象进行运算时,会强制将对象的类型进行临时类型转换。这些转换遵循如下规律:
(1)布尔类型在进行算术运算时,被视为数值0或1。
(2)整型与浮点型运算时,将整型转化为浮点型。
(3)其他类型与复数运算时,将其他类型转换为复数类型。
简单来说,混合运算中类型相对简单的操作数会被转换为与复杂操作数相同的类型。
2 比较运算符
Python中的比较运算符有: ==、 !=、>、<. >=、<=
,比较运算符同样是双目运算符,它与两个操作数构成一个表达式。比较运算符的操作数可以是表达式或对象,其功能与示例分别如表 所示。
表 比较运算符的功能与示例
运算符 | 功能 | 示例 |
== | 比较左值和右值,若相同则为真,否则为假 | a=3, b=5 a==b不成立,结果为False |
!= | 比较左值和右值,若不相同则为真,否则为假 | a=3, b=5 a!=b成立,结果为True |
> | 比较左值和右值,若左值大于右值则为真,否则为假 | a=3, b=5 a>b不成立,结果为False |
< | 比较左值和右值,若左值小于右值则为真,否则为假 | a=3, b=5 a<b成立,结果为True |
>= | 比较左值和右值,若左值大于或等于右值则为真,否则为假 | a=3, b=5, a>=b不成立,结果为False a=3, b=3,a>=b成立,结果为True |
<= | 比较左值和右值,若左值小于或等于右值则为真,否则为假 | a=3, b=5 a<=b成立,结果为True a=5, b= 3 a<=b成立,结果为False |
比较运算符只对操作数进行比较,不会对操作数自身造成影响,即经过比较运算符运算后的操作数不会被修改。比较运算符与操作数构成的表达式的结果只能是True或False,这种表达式通常用于布尔测试。
3 赋值运算符
赋值运算符的功能是:将一个表达式或对象赋给一个左值,其中左值必须是一个可修改的值,不能为一个常量。“=”是基本的赋值运算符,还可与算术运算符组合成复合赋值运算符。Python 中的复合赋值运算符有+=、-=、*=、/=、//=. %=、**=
, 它们的功能相似,例如“a+=b”等价于“a=a+b”, “a-=b”等价于“a=a-b”,等等。
赋值运算符也是双目运算符,以a= 3, b= 5为例,Python 中各个赋值运算符的功能与示例如表所示。
表 赋值运算符的功能与示例
运算符 | 功能 | 示例 |
= | 等:将右值赋给左值 | a=b, a为5 |
+= | 加等:使右值与左值相加,将和赋给左值 | a+=b, a为8 |
= | 减等:使右值与左值相减,将差赋给左值 | a-=b,a为-2 |
*= | 乘等:使右值与左值相乘,将积赋给左值 | a*=b, a为15 |
/= | 除等:使右值与左值相除,将商赋给左值 | a/=b,a为0.6 |
//= | 整除等:使右值与左值相除,将商的整数部分赋给左值 | a//=b, a为0 |
%= | 取余等:使右值与左值相除,将余数赋给左值 | a%=b, a为3 |
**= | 幂等:获取左值的右值次方,将结果赋给左值 | a**=h, a为243 |
经以上操作后,左值a发生了改变,但右值b并没有被修改。以“+=”为例,代码如下:
>>> a = 3
>>> b = 5
>>> a+=b
>>> print (a)
8
>>> print (b)
5
需要说明的是,与C语言不同,Python中在进行赋值运算时,即便两侧操作数的类型不同也不会报错,且左值可正确地获取右操作数的值(不会发生截断等现象),这与Python中变量定义与赋值的方式有关。
4 逻辑运算符
Python支持逻辑运算,但Python逻辑运算符的功能与其他语言有所不同。Python中分别使用or、and、not这三个关键字作为逻辑运算“或”、“与”、“非”的运算符,其中or与and为双目运算符,not为单目运算符。
逻辑运算符的操作数可以为表达式或对象,下面将对它们的功能分别进行说明。
1.or
当使用运算符or连接两个操作数时,左操作数的布尔值为True,则返回左操作数,否则返回右操作数或其计算结果(若为表达式)。例如:
>>> 0 or 3 + 5 #左操作数布尔值为False
8
>>> 3 or 0 #左操作数布尔值为True
3
2.and
当使用运算符and连接两个操作数时,若左操作数的布尔值为False,则返回左操作数或其计算结果(若为表达式),否则返回右操作数的执行结果。例如:
>>>3 – 3 and 5
0
>>>3 - 4 and 5
5
3.not
当使用运算符not时,若操作数的布尔值为False,则返回True,否则返回False。例如:
>>> not(3-5)
False
>>> not(False)
True
5 位运算符
程序中的所有数据在计算机内存中都以二进制形式存储,位运算即以二进制位为单位进行的运算。Python 的位运算主要包括按位左移、按位右移、按位与、按位或、按位异或、按位取反这6种。位运算符的使用说明如表 所示。
表 位运算符的使用说明
运算符 | 说明 |
<< | 按位左移。按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零 |
>> | 按位右移。按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零 |
& | 按位与。只有对应的两个二进制位都为1时,结果才为1 |
| 按位或。只有对应的两个二进制位有一个为1时,结果才为1 |
^ | 按位异或。进行异或的两个二进制位不同,结果为1,否则为0 |
~ | 按位取反。位为1则取其反0,位为0则取其反1(包含符号位) |
下面以num_one=10和num_two=11为例,分别使用表2-6中的运算符演示位运算操作。
例如:
>>> f'左移两位: { (num one<<2) }'
'左移两位: 40'
>>> f'右移两位: { (num one>>2) }'
'右移两位: 2'
>>> f'按位与: { (num one&2) }'
'按位与: 2'
>>> f'按位或: { (num one12) }'
'按位或: 10'
>>> f'按位异或: { (num one^num two) }'
'按位异或: 1'
>>> f'按位取反:{(~numone)}'
'按位取反: -1'
6 运算符优先级
Python支持使用多个不同的运算符连接简单表达式,实现相对复杂的功能,为了避免含有多个运算符的表达式出现歧义,Python 为每种运算符都设置了优先级。Python 各种运算符的优先级由低到高依次如表 所示。
表 运算符优先级
运算符 | 说明 |
or | 布尔“或” |
and | 布尔“与” |
not | 布尔“非” |
in,not in | 成员测试(字符串、列表、元组、字典中常用) |
is,is not | 身份测试 |
<、<=、>、>=、!=、== | 比较 |
| 按位或 |
^ | 按位异或 |
& | 按位与 |
<<、>> | 按位左移、按位右移 |
+、- | 加法、减法 |
*、/、 % | 乘法、除法、取余 |
+、- | 正负号 |
~ | 按位取反 |
** | 指数 |
默认情况下,运算符的优先级决定了复杂表达式中的哪个单一表达式先执行,但用户可使用圆括号“()”改变表达式的执行顺序。通常圆括号中的表达式先执行,例如对于表达式“3+4*5”, 若想让加法先执行,可写为“(3+4)*5”。此外,若有多层圆括号,则最内层圆括号中的表达式先执行。
运算符一般按照自左向右的顺序结合,例如,在表达式“3+5-4”中,运算符+、-的优先级相同,解释器会先执行“3+5”,再将3+5的执行结果8与操作数4一起,执行“8-4”,即执行顺序等同于“(3+5)-4”; 但赋值运算符的结合性为自右向左,如表达式“a=b=c”,Python解释器会先将e的值赋给b,再将b的值赋给a,即执行顺序等同于“a=(b=c)”。