解释一下Python中的逻辑运算符。
那天晚上我在公司楼下抽烟,结果有人在群里问我一个特别初级的问题——“Python里的逻辑运算符到底是咋用的?”我一听差点笑喷,毕竟咱写代码这么多年,这玩意儿天天用,但真要让你把它从头到尾捋一遍,还挺考验功底的。反正闲着也是闲着,我就跟他们扯了一大堆,今天正好整理一下写下来。
逻辑运算符到底是啥
说白了,逻辑运算符就是用来处理布尔值(True 和 False)的。你写代码的时候经常需要判断某个条件成立不成立,这时候就得靠它们了。Python 里主要有三个:and、or、not。别看只有仨,组合起来能玩出花。
举个例子,你要判断一个人是不是成年人,还得看看他是不是学生。那你可以这样写:
age = 20
is_student = Trueif age >= 18and is_student:
print("成年学生")
这里的 and 就是逻辑与,意思是两个条件都得满足才行。
and:两个条件都要真
我前几天给小李看一个项目,他写了一堆 if 判断,结果逻辑全乱套了。我说你就记住一点,and 就像门禁刷卡一样,两个卡都得过,门才开。
a = True
b = False
print(a and b) # False
因为 b 是 False,所以结果就是 False。Python 里还有个小细节,and 会返回第一个为假的值,而不是固定给你 True 或 False:
print(0and5) # 0
print(5and0) # 0
print(5and10) # 10
这点特别容易踩坑,比如有时候你拿 and 来写简洁代码,结果被返回值坑惨了。
or:只要一个条件成立
周末我去超市买东西,想着要么买牛奶,要么买咖啡,至少得带一样回家。这就是 or 的逻辑,任意一个条件满足就行。
a = True
b = False
print(a or b) # True
注意,or 会返回第一个为真的值:
print(0or5) # 5
print(5or0) # 5
print(""or"hello") # hello
这个特性特别适合写默认值,比如你从用户输入里取数据,可能为空,就可以这么写:
user_input = ""
name = user_input or"匿名用户"
print(name) # 匿名用户
是不是很爽?
not:取反操作
not 就是个翻转开关,True 变 False,False 变 True。就像昨晚加班,本来挺高兴项目上线了,结果测试一跑发现有 bug,心情瞬间取反。
a = True
print(not a) # False
有时候你会看到人家写条件判断特别怪,比如:
ifnot items:
print("列表是空的")
因为空列表在布尔上下文里就是 False,加个 not 就变成 True 了。
短路求值:省事但容易出坑
这点特别重要。Python 的逻辑运算符有个特性叫“短路求值”。意思是如果第一个条件已经能决定结果了,就不会去算第二个。
举个例子:
deff():
print("执行了f()")
returnTrueprint(Falseand f()) # 不会打印"执行了f()"
print(Trueor f()) # 也不会打印
你看,and 前面 False,就直接返回 False 了,根本不执行 f()。or 也是,前面 True 就直接过了。这种写法一方面提高效率,但要是你没意识到,可能调试的时候一脸懵逼。
布尔上下文:啥都能真假
Python 比较有意思的一点是,很多东西都能当布尔值用。比如数字 0、空字符串、空列表,这些都算 False,其它基本都算 True。
print(bool(0)) # False
print(bool(123)) # True
print(bool("")) # False
print(bool("hi")) # True
所以你经常能看到有人写:
if my_list:
print("有数据")
这就是利用了逻辑运算符加布尔上下文的特性。
实际应用场景
昨晚我在写个小脚本,需要判断一个文件是不是存在,同时它大小大于 0:
import osfile_path = "test.txt"
if os.path.exists(file_path) and os.path.getsize(file_path) > 0:
print("文件可用")
再比如接口请求,有时候你要判断返回值里某个字段存在,就可以写成:
data = {"user": {"name": "Tom"}}
name = data.get("user") and data["user"].get("name")
print(name) # Tom
这里用了 and 来避免空字典时报错。
其实逻辑运算符这玩意儿很简单,但要用得舒服,就得多理解它的返回值规则和短路逻辑。and 找第一个假的,or 找第一个真的,not 翻转一下。别小看这三兄弟,代码里到处都有它们的影子。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领