一、算术运算符
以下假设 a =10, b = 21:
+
-
*
/ # 除 a 除以 b 如:b / a 输出结果 2.1 float 类型
% # 取模 - 返回除法的余数 如:b % a 输出结果 1
** # 幂 - 返回 a 的 b 次幂,比较:函数math.pow(x,y) pow(x,y) math.sqrt(x)
// # 取整除 - 向下取接近除数的整数,比较:函数 math.floor() int() round()还要看正负数,// 是运算符
>>> 9 // 2 # 4
>>> -9 // 2 # -5
如果想同时得到商和余数,可以用这个方法:
>>> divmod(10,3)
二、Python 比较运算符
== # 等于 - 比较对象的值是否相等 如:(a == b) 返回 False。
!=
>
<
>=
<=
对于连续比较:
3 > 2 > 1 等价于 (3 > 2) and (2 > 1) # 3 > 2 and 2 > 1 结果是 True
(3 > 2) > 1 # 3 > 2 True ,1 > 1 False, 结果为 False
三、Python 赋值运算符
= # 赋值运算符
+= # 加法赋值运算符 如:c += a 等效于 c = c + a(c,a为不可变对象)
-=
*=
/=
%=
**= # 幂赋值运算符 如:c **= a 等效于 c = c ** a
//= # 取整除赋值运算符 如:c //= a 等效于 c = c // a
:= # 海象运算符,可在表达式内部为变量赋值。
a = b = c = 1
赋值方式: a = 1, b = a, c = a
海象运算符
Python3.8 版本新增海象运算符,赋值表达式。
在这个示例中,赋值表达式可以避免调用 len() 两次:
# 例一
a = [x for x in range(12)]
# 方法一:
if len(a) > 10:
print(f"List is too long({len(a)} elements(元素), expected(期望) <= 10)")
# 方法二:
n = len(a)
if n > 10:
print(f"List is too long({n} elements, expected <= 10)")
方法三:表达式
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
# 例二
with open('test.txt','r') as f:
line = f.readLine()
while line:
print(line)
line = f.readLine()
# 海象运算符
while line := f.readLine():
print(line)
# 例三
n = 0
while n < 3:
print(n) # 0,1,2
n += 1
# 海象运算符
w = 0
while (w := w + 1) < 3:
print(w) # 1,2
# 例四
while True:
p = input("Enter the password: ")
if p == "the password":
break
# 海象运算符
while p := input("Enter the password: ") != "password":
continue
### Python c += a 不等价 c = c + a(c,a为可变对象)
```python
a = b = [1,2]
print('a=',a,'b=',b,id(a),id(b))
a += [3]
print('a=',a,'b=',b,id(a),id(b))
a = a+[4]
print('a=',a,'b=',b,id(a),id(b))
四、Python 位运算符
按位运算符是把数字看作二进制来进行计算的。
& 按位与运算符:参与运算的两个值,如果两个相应位都为 1,则该位的结果为 1,否则为 0。如:
(a & b) # 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为 1。如:
(a | b) # 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为 1。如:
(a ^ b) # 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为 1。~x 类似于 -x-1。如:
(~a ) # 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<< 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
a << 2 # 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数
a >> 2 # 输出结果 15 ,二进制解释: 0000 1111
下表中变量 a = 60,b = 13 二进制格式如下:
a = 0011 1100
b = 0000 1101
# -----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
五、Python 逻辑运算符
and # a and b 布尔 "与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
or # x or y 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。
not # not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
逻辑运算符 and、or 和 not 优先级
为什么 0 and 1 返回的是 0?为什么 3 and 4 却返回的是 4?
优先级顺序:not > and > or
>>> 5 > 3 and 4 > 2 or not 5 > 3
True
>>> 5 > 3 and 4 < 2 or not 5 > 3
False
逻辑操作符 and 和 or 也称作短路操作符(short-circuitlogic)或者惰性求值(lazy evaluation):它们的参数从左向右解析,一旦结果可以确定就停止。
例如,如果 A 和 C 为真而 B 为假, A and B and C 不会解析 C 。作用于一个普通的非逻辑值时,短路操作符的返回值通常是最后一个变量。因此,逻辑运算符的理解也与 C 语言中不同。
而或逻辑(or),即只要有一个是 true,即停止解析运算数,返回最近为 true 的变量,即 3 or 4,值为 3;改变顺序 4 or 3 即为 4。
六、Python 成员运算符
in 如果在指定的序列中找到值返回 True,否则返回 False。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。
七、Python 身份运算符
身份运算符用于比较两个对象的存储单元
is 判断两个标识符是不是引用自一个对象,x is y, 类似 id(x) == id(y) 。
is not 如:x is not y , 类似 id(a) != id(b)。
注: id() 函数用于获取对象内存地址。
is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
>>> a = [1, 2, 3]
>>> b = a
>>> b is a # True
>>> b == a # True
>>> b = a[:]
>>> b is a # False
>>> b == a # True
八、Python 运算符优先级
以下表格列出了从最高到最低优先级的所有运算符:
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,求余数和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
== != 等于运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符
= %= /= //= -= += *= **= 赋值运算符
实例
x,y,z = True,False,False
if x or y and not z:
print("yes")
else:
print("no")
三目运算符(三元表达式)
python 中的三目运算符不像其他语言一般的表示方法:判定条件 ? 为真时的结果:为假时的结果。
例如,C 语言是这么写的: result = 5 > 3 ? 1 : 0
在 python 中的格式为:为真时的结果 if 判定条件 else 为假时的结果
例如: x = True if 5 > 3 else False 结果为 Ture
练习
1、Python 的 floor 除法现在使用 “ // ” 实现,那 3.0 // 2.0 目测会显示什么内容呢?
2、 a < b < c 事实上是等于?
A:(a < b) < c B:a < (b < c) C:(a < b) and (b < c) D:a < b and b < c
3、不使用 IDLE,你可以轻松说出 5 ** -2 的值吗?
4、 如何简单判断一个数是奇数还是偶数?
5、请用最快速度说出答案: not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
答案是: 4
not or and 的优先级是不同的: not > and > or
我们按照优先级给它们加上括号: (not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
== 0 or 0 or 4 or 6 or 9
== 4
爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上 2 阶,最后剩 1 阶;若每步上 3 阶,最后剩 2 阶;若每步上 5 阶,最后剩 4 阶;若每步上 6 阶,最后剩 5 阶;只有每步上 7 阶,最后刚好一阶也不剩。
题目:请编程求解该阶梯至少有多少阶?
x = 7
while True:
if (x % 2 == 1) and (x % 3 == 2) and (x % 5 == 4) and (x % 6 == 5):
print("阶梯数是:", x)
break
else:
x += 7