04 - 运算符与表达式
04 - 运算符与表达式
这章讲 Python 里各种各样的运算符。就是加减乘除那些,再加上比较、逻辑之类的。内容不算难,但细节挺多的,当手册看就行。
算术运算符
这些你应该在数学课上都学过,直接看例子:
print(10+3)# 13,加法print(10-3)# 7,减法print(10*3)# 30,乘法print(10/3)# 3.3333333333333335,除法(结果是浮点数)print(10//3)# 3,整除(只取整数部分)print(10%3)# 1,取余数print(10**3)# 1000,幂运算(10的3次方)几个需要注意的地方:
除法/的结果永远是浮点数,哪怕能整除:
print(10/2)# 5.0,注意是 5.0 不是 5print(type(10/2))# <class 'float'>整除//是向下取整,不是截断:
print(7//2)# 3print(-7//2)# -4,注意不是 -3-7 / 2 = -3.5,向下取整就是-4。这个在面试题里经常出现,很多人会答错。
取余%跟整除是对应的:
print(7%2)# 1print(-7%2)# 1,注意不是 -1取余在判断奇偶、循环计数这些场景特别常用:
# 判断一个数是不是偶数num=10ifnum%2==0:print("偶数")else:print("奇数")比较运算符
比较两个值的大小或是否相等,结果是True或False:
print(5==5)# True,等于print(5!=3)# True,不等于print(5>3)# True,大于print(5<3)# False,小于print(5>=5)# True,大于等于print(5<=3)# False,小于等于Python 有个很爽的特性——链式比较:
x=5print(1<x<10)# True,等价于 1 < x and x < 10print(1<x<3)# Falseprint(10>x>3>0)# True在别的语言里你得写x > 1 and x < 10,Python 直接写1 < x < 10就行,跟数学里写的一样。
逻辑运算符
用来组合多个条件:and(与)、or(或)、not(非)。
age=25has_id=True# and:两个都为 True 才是 Trueprint(age>=18andhas_id)# True# or:有一个为 True 就是 Trueprint(age<18orhas_id)# True# not:取反print(nothas_id)# False短路求值
这个概念很重要。and和or有一个特性:
and:如果第一个条件是False,就不会看第二个(因为结果肯定是 False)or:如果第一个条件是True,就不会看第二个(因为结果肯定是 True)
# 这里第二个条件不会被执行,因为第一个是 Falseresult=Falseand(1/0)# 不会报错!# 这里第二个条件不会被执行,因为第一个是 Trueresult=Trueor(1/0)# 也不会报错!这个特性实际用起来可以做安全的条件检查:
# 先检查列表是不是空的,再去取元素ifmy_listandmy_list[0]=="hello":print("找到了")如果列表是空的,my_list就是False,后面的my_list[0]就不会被执行,避免了索引越界的错误。
返回值的秘密
and和or不一定返回True或False,它们返回的是决定结果的那个值:
print(3and5)# 5(两个都为真,返回最后一个)print(0and5)# 0(第一个为假,直接返回第一个)print(3or5)# 3(第一个为真,直接返回第一个)print(0or5)# 5(第一个为假,返回第二个)print(""or"默认值")# "默认值"所以or经常被用来设置默认值:
name=user_inputor"匿名用户"# 如果 user_input 是空字符串,name 就是"匿名用户"赋值运算符
就是=加上各种算术运算的简写:
x=10x+=5# x = x + 5,x 变成 15x-=3# x = x - 3,x 变成 12x*=2# x = x * 2,x 变成 24x//=5# x = x // 5,x 变成 4x%=3# x = x % 3,x 变成 1x**=3# x = x ** 3,x 变成 1这些没什么好说的,就是为了少写几个字。用多了就习惯了。
成员运算符
判断一个东西在不在另一个东西里面:in和not in。
fruits=["苹果","香蕉","橘子"]print("苹果"infruits)# Trueprint("葡萄"notinfruits)# Trueprint("香蕉"notinfruits)# False# 字符串也可以用print("py"in"python")# Trueprint("java"in"python")# Falsein的用法非常直观,读起来就跟说英语一样。后面学了列表、字典之后会用得更多。
位运算符
这些是操作二进制的,平时用得不多,但面试有时候会问:
a=5# 二进制: 101b=3# 二进制: 011print(a&b)# 1,按位与:001print(a|b)# 7,按位或:111print(a^b)# 6,按位异或:110print(~a)# -6,按位取反print(a<<1)# 10,左移一位:1010print(a>>1)# 2,右移一位:10实际开发中,位运算主要用在性能敏感的场景或者处理二进制数据的时候。一般业务代码里很少写。
运算符优先级
跟数学一样,Python 的运算符也有优先级。从高到低大致是:
** 幂运算 ~ + - 按位取反、正负号 * / // % 乘除 + - 加减 << >> 位移 & 按位与 ^ 按位异或 | 按位或 == != < > 比较 not 逻辑非 and 逻辑与 or 逻辑或说实话这个表我也背不全。我写代码的原则是——不确定优先级就加括号。
# 不加括号,你能确定这是什么意思吗?result=a+b<<2&0xFF# 加了括号,一目了然result=((a+b)<<2)&0xFF加括号不丢人,代码能看懂比少写两个括号重要多了。
海象运算符(:=)
这个稍微高级一点,Python 3.8 才加入的。它允许你在表达式里同时赋值:
# 不用海象运算符data=input("输入内容:")iflen(data)>0:print(f"你输入了{len(data)}个字符")# 用海象运算符if(n:=len(input("输入内容:")))>0:print(f"你输入了{n}个字符")一个更实际的场景:
# 在 while 循环里读取数据while(line:=input(">>> "))!="quit":print(f"你输入了:{line}")这个运算符用好了可以让代码更简洁,用不好反而会让代码更难读。初期不强制使用,等后面遇到合适的场景再说。
本章小结
- 算术运算符:
+ - * / // % **,注意/返回浮点数,//是向下取整 - 比较运算符:
== != > < >= <=,支持链式比较 - 逻辑运算符:
and or not,有短路求值特性 - 成员运算符:
in和not in,非常直观好用 - 不确定优先级就加括号,别硬记
- 海象运算符
:=可以在表达式中同时赋值
面试题
Q1:10 / 3、10 // 3、10 % 3的结果分别是什么?
10 / 3=3.3333333333333335(浮点除法)10 // 3=3(整除,向下取整)10 % 3=1(取余)
注意-10 // 3的结果是-4而不是-3,因为整除是向下取整(向负无穷方向),不是向零取整。
Q2:and和or的短路求值是什么意思?有什么实际用途?
短路求值是指逻辑运算时,如果第一个操作数已经能确定结果,就不会计算第二个操作数。
A and B:如果 A 为假,直接返回 A,不计算 BA or B:如果 A 为真,直接返回 A,不计算 B
实际用途:
- 安全的属性/索引访问:
if obj and obj.name,先检查 obj 不是 None 再访问属性 - 设置默认值:
value = user_input or "default" - 延迟计算:把开销大的操作放在后面,前面的条件不满足就跳过
Q3:-7 // 2的结果是什么?为什么不是-3?
结果是-4。
Python 的整除//是向下取整(floor division),也就是向负无穷方向取整。-7 / 2 = -3.5,向下取整就是-4。
很多其他语言(比如 C、Java)的整除是向零取整,所以-7 / 2在这些语言里是-3。这是 Python 和其他语言的一个区别,面试经常考。
Q4:x = 5,表达式1 < x < 10的结果是什么?Python 是怎么处理的?
结果是True。
Python 会把1 < x < 10展开为1 < x and x < 10,也就是1 < 5 and 5 < 10,两个都是 True,所以结果是 True。
这是 Python 独有的链式比较语法,跟数学里的写法一致,比大多数语言更直观。注意x只会被计算一次。
上一章 | 下一章:字符串 →
