算数运算符
以下假设变量a为10,变量b为2:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | a + b 输出结果 12 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 8 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 20 |
/ | 除 - x除以y | b / a 输出结果 5.0 |
% | 取模 - 返回除法的余数 | b % a 输出结果 0 |
** | 幂 - 返回x的y次幂 | a**b 输出结果 100 |
// | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
a = 10
b = 2
print(a + b) # 12
print(a - b) # 8
print(a * b) # 20
print(a / b) # 5.0
print(a % b) # 0
print(a ** b) # 100
print(a // b) # 5
比较运算符
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True. |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 True。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 True。 |
a = 10
b = 20
print(a == b) # False
print(a != b) # True
print(a > b) # False
print(a < b) # True
print(a >= b) # False
print(a <= b) # True
赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
增量赋值
a = 10
b = 20
a += b
print(a) # 30
链式赋值
x = y = z = 10
print(x) # 10
print(y) # 10
print(z) # 10
链式赋值一般情况下是不建议赋值给一个空列表
因为列表是可变类型,数据一修改则均被修改了
交叉赋值
x = 10
y = 20
x, y = y, x
print(x) # 20
print(y) # 10
解压赋值/解包
name, age = ["小满", 3]
print(name) # 小满
print(age) # 3
假如在赋值语句左侧添加小括号
(…)
,你甚至可以一次展开多层嵌套数据:
attrs = [1, ("小满", 3)]
user_id, (user_name, age) = attrs
print(user_id) # 1
print(user_name) # 小满
print(age) # 3
除了上面的普通解包外,Python 还支持更灵活的动态解包语法。只要用星号表达式(
*variables
)作为变量名,它便会贪婪[1]地捕获多个值对象,并将捕获到的内容作为列表赋值给variables
。比如,下面
data
列表里的数据就分为三段:头为用户,尾为分数,中间的都是水果名称。通过把*fruits
设置为中间的解包变量,我们就能一次性解包所有变量——fruits
会捕获data
去头去尾后的所有成员:
data = ["小满", "apple", "orange", "banana", 3, 100]
name, *_, age, score = data
print(name) # 小满
print(_) # ['apple', 'orange', 'banana']
print(age) # 3
print(score) # 100
逻辑运算符
Python语言支持逻辑运算符,以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
and | 布尔"与" - 如果x为False,x and y返回False,否则它返回y的计算值。 | (a and b) 返回 20。 |
or | 布尔"或" - 如果x是True,它返回True,否则它返回y的计算值。 | (a or b) 返回 10。 |
not | 布尔"非" - 如果x为True,返回False。如果x为False,它返回True。 | not(a and b) 返回 False。 |
a = 10
b = 20
print(a and b) # 20
print(a or b) # 10
print(not(a and b)) # False
连续问题
在连续多个
and
运算中,如果其中一个条件为False
,则整个表达式的结果为False
,即使后面的条件都为True
一言以蔽之:有一个False 都为False
x, y, z = 10, 18, 5
# False True False
print((x > y) and (y > z) and (x < z))
# 结果为False
在连续多个
or
运算中,如果其中一个条件为True
,则整个表达式的结果为True
,即使后面的条件都为False
。一言以蔽之:有一个为True 都为True
x, y, z = 10, 18, 5
# False True False
print((x > y) or (y > z) or (x < z))
# 结果为True
优先级
not > and > or
在逻辑运算中,
not
的优先级最高,其次是and
,最后是or
。当表达式中同时包含这三种运算符时,
not
会首先被计算,然后是and
,最后是or
# 0 0
# 0 1 0
print(9 < 4 and 18 > 3 or 1 == 3 or 10 != 9 and "小满" == "小满" or 3 > 3)
# 结果为True
not的优先级最高,就是把紧跟其后的那个条件结果取反,所以not与紧跟其后的条件不可分割
如果语句中全部是用and连接,或者全部用or连接,那么按照从左到右的顺序依次计算即可
如果语句中既有and也有or,那么先用括号把and的左右两个条件给括起来,然后再进行运算
# 0 0
# 0 1 0
print((9 < 4 and 18) > 3 or 1 == 3 or (10 != 9 and "小满" == "小满") or 3 > 3)
# 结果为True
短路运算
短路运算是一种逻辑运算符的行为,它在表达式中根据第一个操作数的值决定是否计算第二个操作数。当使用逻辑与运算符
and
时,如果第一个操作数为假,则整个表达式为假,不需要计算第二个操作数;当使用逻辑或运算符or
时,如果第一个操作数为真,则整个表达式为真,不需要计算第二个操作数。
print((9 < 4 and 18 > 3) or 1 == 3 or (10 != 9 and "小满" == "小满") or (3 > 3 and 9 < 8) or False == 0 or 1 > 7)
# 结果为True
短路运算面试题
8 or 0
8
False and 1
False
0 and 2 and 1
0
False and True or 0.1
0.1
0 and 1 or 2 or 3 and 4
2
0 or False and 1
False
成员运算符
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回True,否则返回False。 | x 在 y序列中 , 如果x在y序列中返回True。 |
not in | 如果在指定的序列中没有找到值返回True,否则返回False。 | x 不在 y序列中 , 如果x不在y序列中返回True。 |
# in
hero_list = ["小满", "王昭君", "小乔"]
print("小满" in hero_list) # True
print("大乔" in hero_list) # False
# not in
hero_list = ["小满", "王昭君", "小乔"]
print("小满" not in hero_list) # False
print("大乔" not in hero_list) # True
身份运算符
比较的是内存地址
运算符 | 描述 | 实例 |
---|---|---|
is | is是判断两个标识符是不是引用自一个对象 | x is y, 如果 id(x) 等于 id(y) , is 返回结果 1 |
is not | is not是判断两个标识符是不是引用自不同对象 | x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1 |
hero_list = ["小满", "王昭君", "小乔"]
name_list = ["小满", "王昭君", "小乔"]
print(hero_list is name_list) # False
hero_list = ["小满", "王昭君", "小乔"]
name_list = hero_list
print(hero_list is name_list) # True
name1 = "小满"
name2 = "小满"
print(name1 is name2) # True
name1 = 1
name2 = 1
print(name1 is name2) # True
运算符优先级
以下表格列出了从最高到最低优先级的所有运算符:
运算符 | 描述 |
---|---|
** | 指数 (最高优先级) |
~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
* / % // | 乘,除,取模和取整除 |
+ - | 加法减法 |
>> << | 右移,左移运算符 |
& | 位 'AND' |
^ | | 位运算符 |
<= < > >= | 比较运算符 |
<> == != | 等于运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not or and | 逻辑运算符 |