在 Python 中支持的算术运算符与数学上用来计算使用的符号是相同的。比如说,使用 x = 5 , y = 4 为例来依次介绍这些符号。
| 算术运算符 | 描述 | 示例 | | ---------- | -------- | --------------- | | + | 加法运算 | x+y,结果:9 | | - | 减法运算 | x-y,结果:1 | | * | 乘法运算 | x*y,结果:20 | | / | 除法运算 | x/y,结果:1.25 | | % | 取余 | x%y,结果:1 | | ** | 幂运算 | x**y,结果:625 | | // | 整除运算 | x//y,结果:1 |
逻辑运算符多用于连接不同的条件,进行关联判断,返回结果布尔值True、False
| 逻辑运算符 | 描述 | 示例 | | ---------- | ------------------------------------------------------------ | ------------------------ | | not | 取反 | not(1==3);False | | and | 逻辑与,用于连接两个条件,两个条件同时成立时才返回 True ,只要有一个 False ,则结果就是 False 。 | 10 > 5 and 1 == 1;True | | or | 逻辑或,用于连接两个条件,两个条件只要成立一个就返回 True ,只有两个条件同时为 False ,结果才是 False 。 | 1 == 2 or 10 > 100;False |
在实际编码中,我们经常会用到多个条件,那么我们可以使用and连接多个条件,程序按照顺序从左到右依次判断,一旦某一个条件为False,那么就不再往后继续判断了,直接返回False。
只有在所有条件都为True的情况下,最终结果才是True。
a = 10 > 1 and 5 != 5 and 3 < 100 and True # 第二个条件为False,那么就不再继续往后判断了,无论后边是True还是False,都不管了,直接返回False
print(a)
# 结果
False
在实际编码中,我们经常会用到多个条件,那么我们可以使用or连接多个条件,程序按照顺序从左到右依次判断,一旦某一个条件为True,那么就不再往后继续判断了,直接返回True。
只有在所有条件都为False的情况下,最终结果才是False。
a = 10 > 100 or False or 1 == 1 or 5 != 5 # 第三个条件:1==1 为 True,那么就不再继续往后判断了,无论后边是True还是False,都不管了,直接返回True。
print(a)
# 结果
True
三者的优先级关系是:not > and > or,如果是同一优先级那么默认从左往右依次判断
a = 3 > 4 and 4 > 3 or 1 == 3 and 'x' == 'x' or 3 > 3
print(a)
# 结果
False
如果不太确定优先级是什么,那么最好使用括号来区别优先级,其实原理与上面的一样。那是为什么呢?请看如下讲解:
not 的优先级最高,就是把紧跟其后的那个条件结果取反,所以 not 与紧跟其后的条件密不可分
如果语句中全部都是用 and 连接,或者全部用 or 连接,那么按照从左到右的顺序依次计算即可
如果语句中既有 and 也有 or ,那么先用括号把 and 的左右两个条件给括起来,然后再进行运算
(3 > 4 and 4 > 3) or (1 == 3 and 'x' == 'x') or (3 > 3)
短路运算:运算的结果一旦可以确定,那么就以当前位置计算到的值返回,这是什么意思呢?请看如下代码所示:
100 and 0 or '' and 0 or 'tim' or 'cook' == 'apple' and 666 or 50 > 20
# 用括号确定下优先级
(100 and 0) or ('' and 0) or 'tim' or ('cook' == 'apple' and 666) or (50 > 20)
比较运算用来比较不同的值,结果只有两种情况,一个是True,一个是False。比如说,使用x = 2,y =4为例来依次介绍这些符号。
| 比较运算符 | 描述 | 示例 | | ---------- | ------------------------------------------- | ------------------ | | > | 大于 | x > y;结果:False | | >= | 大于等于 | x >= y;结果:False | | < | 小于 | x < y;结果:True | | <= | 小于等于 | x <= y;结果:True | | == | 等于,两个对象相等则返回True,否则返回False | x = y;结果:False | | != | 不等于,两个对象相等返回False | x != y;结果:True |
在 Python 中,除了有*=这种简单的赋值运算之外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,这些赋值运算符存在的意义都是为了让我们的代码看起来更加的简练。比如说,使用x = 2*,y = 4为例来依次介绍这些符号。
| 增量赋值运算符 | 描述 | 示例 | | -------------- | ------------ | -------- | | = | 赋值运算符 | x = 2 | | += | 加法赋值运算 | x += 1 | | -= | 减法赋值运算 | x -= 1 | | *= | 乘法赋值运算 | x *= 1 | | /= | 除法赋值运算 | x /= 1 | | %= | 取余赋值运算 | x %= 1 | | //= | 整除赋值运算 | x //= 1 | | **= | 幂赋值运算 | x ** = 1 |
如果我们想把同一个值同时赋值给多个变量名,那么我们可以使用链式赋值的方式,怎么做呢?请看如下代码:
x = y = z = 100 # 链式赋值
print(x, y, z)
# 结果
100 100 100
如果我们想要调换两个变量的值
m = 100
n = 200
print(m, n)
m, n = n, m # 交叉赋值
print(m, n)
# 结果
100 200
200 100
把列表中的多个值取出来然后依次赋值给多个变量名
nums = [11, 22, 33, 44, 55]
x1, x2, x3, x4, x5 = nums # 解压赋值,nums中包含多个值,就好比一个压缩包,解压赋值因此而得名
print(x1, x2, x3, x4, x5)
# 结果
print(x1, x2, x3, x4, x5)
但是要注意,上述解压赋值,等号左边的变量名个数必须与等号右侧包含的值的个数相同,否则就会报错
但是如果我们只想要取头尾的几个值,可以使用*_匹配
nums = [11, 22, 33, 44, 55]
x1, x2, *_ = nums # 解压赋值,nums中包含多个值,就好比一个压缩包,解压赋值因此而得名
print(x1, x2)
# 结果
11 22
字符串、字典、元组、列表、集合类型都支持解压赋值
某一个对象在另外一个对象中则返回True字符串、列表、元组、字典、集合都支持成员运算
print('py' in 'python')
print('python' in ['java','c','python'])
print('age' in {'age': 22})
# 结果
True
True
True
某一个对象不在另外一个对象中则返回False
print('py' not in 'python')
print('python' not in ['java','c','python'])
print('age' not in {'age': 22})
# 结果
False
False
False
not in规范
not 'py' in 'python'
'py' not in 'python'
通过观察可以得知,虽然这两个 not 的位置不同,可以得到相同的结果,但是 not 在前边,未免有些别扭,语义不明确,因此建议使用第二种 not in 。
is比较的是id,如果两个对象的id相同那么就返回True
x = 10
y = x
print(id(x), id(y))
print(x is y)
# 结果
2010054001168 2010054001168
True
is not比较的是id,如果两个对象的id不同,is not会返回True
x = 10
y = x
print(id(x), id(y))
print(x is not y)
# 结果
2010054001168 2010054001168
False
==比较的是value是否相等,is比较的是id是否相等
id相同,内存地址一定相同,意味着type、value也一定相同
value相等,type也一定相同,但是id可能不同