Python条件处理,新手入门到精通
对话实录
**小白**:(崩溃)我写了`if x = 1:`,为什么Python会报错?
**专家**:(推眼镜)**`=`是赋值,`==`才是比较**!想判断相等?用双等号!
条件判断基础内容
1. 基础 if-else
# ✅ 标准操作
x = 10
if x > 0:print("正数")
elif x < 0:print("负数")
..... #elif可以写多个
else:print("零")
专家提醒:elif是else if的缩写,在多个条件判断时使用,当某个elif条件满足时,执行对应的代码块,之后跳过其他elif和else部分。
2.布尔值的判断
条件表达式判断的是布尔值为True或者False,可以使用函数bool()判断对象的布尔值。
#数字0的布尔值
print(bool(0))
#打印结果
False
#数字1的布尔值
print(bool(1))
#打印结果
True
一些内置对象的布尔值说明:
- 布尔值为False: 数字0,None,False,空列表[],空字典{},空集合set(),空元组()
- 布尔值为True: 非数字0,True,非空列表,非空字典,非空集合set(),非空元组(),自定义的类和实例
自定义的类和实例的布尔值为True:
class Fruit():def __init__(self,name,color):self.name = nameself.color = colorfruit = Fruit('apple','red')
print(f'自定义的class 布尔值为{bool(Fruit)}')
print(f'自定义的实例 布尔值为{bool(fruit)}')
#打印结果
自定义的class 布尔值为True
自定义的实例 布尔值为True
3.not 表达式表示相反逻辑
当表达式为False时,使用not+表达式,if条件判断为True,会执行代码块1
if not 表达式:代码块1
4. 嵌套条件
age = 20
if age >= 18:if age <= 60:print("成年人")else:print("老年人")
else:print("未成年人")
嵌套条件像俄罗斯套娃,一层套一层。外层条件判断是第一层套娃,只有打开外层(满足外层条件),才会继续判断内层条件,这种结构可处理复杂的逻辑分支。
5.while循环条件判断
# ✅ 标准操作
count = 0
while count < 5:print(count)count += 1
当while后面代码为True时,循环才继续。当上面的代码执行到count=5时会退出循环
6.三元运算符
# 传统写法
if x > 0:result = "正数"
else:result = "非正数"# 三元写法
result = "正数" if x > 0 else "非正数"
三元运算符用更紧凑的语法实现条件赋值,先判断x > 0,为真返回"正数",为假返回"非正数",能简化简单的条件判断逻辑。
7.短路求值
def expensive_call():
print("我被调用了!")return True
# 短路求值
False and expensive_call() # → False(不调用函数)
True or expensive_call() # → True(不调用函数)
在逻辑运算中,and运算符当第一个操作数为False时,整个表达式结果为False,不会执行第二个操作数(即不调用expensive_call函数);or运算符当第一个操作数为True时,整个表达式结果为True,也不会执行第二个操作数,能提升程序性能,避免不必要的计算。
8.链式比较
# 传统写法
if 1 < x and x < 10:print("x在1到10之间")# 链式写法
if 1 < x < 10:print("x在1到10之间")
链式比较更简洁直观,直接表达x大于 1 且小于 10 的逻辑,与传统写法效果相同,但代码更清晰,在 Python 中这种写法合法且高效。
9.使用and 和or判断
有两个表达式A和B
A和B都为True时 A and B 结果为True
A和B有一个为False时 A and B 结果为False
A和B有一个为True时 A or B 结果为True
A和B都为False时 A or B 结果为False
10.if __name__ == '__main__'的含义
python模块(单个的.py文件是一个模块)中使用if __name__ == '__main__'时,指只有直接运行该py文件时if判断才会生效,而当该模块被其他模块import导入时则不会生效。
定一个test.py文件,文件内容如下:
print(f'test.py的属性__name__值为: {__name__}')
if __name__ == '__main__':print('执行该内容')#运行test.py 结果: if __name__ == '__main__'判断为True
test.py的属性__name__值为: __main__
执行该内容当test.py同级目录的另一个文件test1.py通过import导入test.py时:
test1.py文件内容如下:
import test#运行test1.py的结果:
test.py的属性__name__值为: test
解释:if __name__ == '__main__'判断为False,
因为__name__值变成了文件名test,而不再是__main__
高阶操作
1. 字典代替复杂 if-else
# 传统写法
if x == 1:result = "一"
elif x == 2:result = "二"
elif x == 3:result = "三"
else:result = "未知"
# 字典写法
result = {1: "一", 2: "二", 3: "三"}.get(x, "未知")
当有多个等值判断的if-else时,用字典的get方法可简化代码。字典将键值对存储,get方法根据键获取值,若键不存在返回默认值(这里是"未知"),代码更简洁且易读。
2. 列表推导式 + 条件
# 传统写法
result = []
for x in range(10):if x % 2 == 0:result.append(x**2)# 推导式写法
result = [x**2 for x in range(10) if x % 2 == 0]
列表推导式结合条件,能更简洁地创建列表。它先遍历range(10),对每个x判断是否满足x % 2 == 0,满足则将x**2添加到结果列表,相比传统循环,代码更紧凑。
3. any () 和 all () 函数
# 检查任意条件
if any(x > 0 for x in [-1, 2, -3]):print("至少有一个正数")
# 检查所有条件
if all(x > 0 for x in [1, 2, 3]):print("全部是正数")
any()函数检查可迭代对象中是否至少有一个元素满足条件,这里只要列表[-1, 2, -3]中有一个正数,any(x > 0 for x in [-1, 2, -3])就为True;
all()函数检查可迭代对象中所有元素是否都满足条件,列表[1, 2, 3]中所有元素都大于 0,所以all(x > 0 for x in [1, 2, 3])为True,可简化复杂的条件判断逻辑。
闭坑指南(血泪总结)
赋值陷阱:
if x = 1: # ❌ SyntaxError
if x == 1: # → True
在 Python 中,=是赋值运算符,==是比较运算符。条件判断时要用==,若误写为=会导致语法错误,因为条件判断需要布尔值,而x = 1是赋值操作,不是比较。
浮点精度:
if 0.1 + 0.2 == 0.3: # → False
if abs((0.1 + 0.2) - 0.3) < 1e-9: # → True
由于计算机对浮点数采用二进制存储和运算,存在精度问题,所以0.1 + 0.2的结果在计算机中并非精确等于0.3。通过计算差值绝对值并与极小值(如1e-9)比较,能更准确判断两个浮点数是否近似相等。
空值判断:
if x == None: # ❌ 不推荐
if x is None: # ✅ 推荐
在 Python 中,判断一个变量是否为None,推荐使用is关键字。is判断两个对象是否为同一对象,而==判断值是否相等。None是一个特殊的单例对象,用is更符合 Python 风格且性能稍好。
无限循环:
while True: # ❌ 无限循环
if condition:break # ✅ 退出循环
单纯的while True会导致无限循环,程序会一直运行下去。必须在循环体中添加break语句或更新循环条件,使其能在适当时候退出循环,否则可能导致程序卡死。
专家终极总结
-
=是赋值,==是比较,在条件判断时务必注意运算符的正确使用。
-
字典可代替复杂的if-else,简化代码结构,提高代码可读性和维护性。
-
any()和all()函数能有效简化条件判断,快速判断可迭代对象中元素是否满足特定条件。
-
列表推导式结合条件,让代码更简洁高效,是 Pythonic 编程的重要体现。
小白:懂了!我现在就用条件判断和循环重构代码!
专家:(竖大拇指)下次我们讲【python循环】,关注不迷路!