Python技术迷

解释一下Python中的逻辑运算符。

那天晚上我在公司楼下抽烟,结果有人在群里问我一个特别初级的问题——“Python里的逻辑运算符到底是咋用的?”我一听差点笑喷,毕竟咱写代码这么多年,这玩意儿天天用,但真要让你把它从头到尾捋一遍,还挺考验功底的。反正闲着也是闲着,我就跟他们扯了一大堆,今天正好整理一下写下来。

逻辑运算符到底是啥

说白了,逻辑运算符就是用来处理布尔值(True 和 False)的。你写代码的时候经常需要判断某个条件成立不成立,这时候就得靠它们了。Python 里主要有三个:and、or、not。别看只有仨,组合起来能玩出花。

举个例子,你要判断一个人是不是成年人,还得看看他是不是学生。那你可以这样写:

age = 20
is_student = True

if 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()")
returnTrue

print(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 os

file_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 全部免费领