你好呀,我是小冰。
上篇文章写了Python的基础语法,有读者后台问我:“变量和列表我都懂了,但感觉程序还是‘死’的——只能从上往下跑一遍就结束了。怎么让程序有‘脑子’,能自己判断、自己循环?”
这个问题问得特别好。
让程序“活起来”的,不是变量,而是语句。是它们决定了程序遇到不同情况怎么反应、重复做什么事、什么时候停下来。
今天就把我学的Python控制流语句整理出来,核心就三类:条件判断、循环控制、以及一个超级好用的“推导式”。
一、条件判断:让程序学会“看情况”
1.1 if-elif-else —— 做选择的“三兄弟”
这是最基础也最常用的。让程序根据不同条件,走不同的路。
python
temperature =25
if temperature >30:
print("今天太热了,适合在实验室吹空调")elif temperature >20:
print("温度刚刚好,去操场跑两圈")elif temperature >10:
print("有点凉,加件外套")else:
print("太冷了,还是在宿舍窝着吧")运行结果:温度刚刚好,去操场跑两圈
关键点:
elif 可以有多个(else if 的缩写)
else 是可选的,不一定要写
从上往下判断,一旦满足就跳出,后面的不再执行
一个科研场景的例子:判断论文状态
python
paper_status ="under_review"
if paper_status =="accepted":
print("恭喜!可以准备毕业了")elif paper_status =="under_review":
print("再等等,会有好结果的")elif paper_status =="major_revision":
print("问题不大,认真改就行")else:
print("没事,再投下一家")1.2 嵌套判断:在判断里再判断
有时候条件不是孤立的,需要层层递进。
python
score =85
has_attendance =True
if score >=60:
if has_attendance:
print("考试通过,考勤也够,成绩有效") else:
print("考试通过了但考勤不够,需要补考")else:
print("考试没过,准备补考吧")小技巧:嵌套太深会让代码难读,能用and/or解决的,尽量不用嵌套。
python
# 上面的代码可以简化成
if score >=60 and has_attendance:
print("考试通过,考勤也够,成绩有效")elif score >=60 andnot has_attendance:
print("考试通过了但考勤不够,需要补考")else:
print("考试没过,准备补考吧")1.3 三元表达式:一行搞定简单判断
如果你只是想根据条件给变量赋值,可以用这种简洁写法:
python
# 传统写法
if age >=18:
status ="成年"
else:
status ="未成年"
# 三元表达式
status ="成年"if age >=18 else"未成年"
格式:值1 if 条件 else 值2
二、循环:让程序学会“重复做”
2.1 for循环 —— “遍历”一切可迭代的东西
for循环是Python里用得最多的,因为Python里几乎所有东西都可以“遍历”。
遍历列表:
python
papers =["论文初稿","修改稿","终稿","录用通知"]
for item in papers:
print(f"当前阶段:{item}")遍历字符串:
python
for char in"Python":
print(char)# 一个一个字母打印
配合range() —— 数字序列:
python
# range(5) 生成 0,1,2,3,4
for i inrange(5):
print(i)
# range(2, 8) 生成 2,3,4,5,6,7
for i inrange(2,8):
print(i)
# range(0, 10, 2) 生成 0,2,4,6,8(步长为2)
for i in range(0,10,2):
print(i)
科研场景:批量处理实验数据
python
file_names = ["data1.csv","data2.csv","data3.csv","data4.csv"]
for file in file_names:
print(f"正在处理:{file}")# 这里写读取文件、处理数据的代码# process_data(file)2.2 while循环 —— “直到条件不满足”才停
for循环适合“知道要循环多少次”的场景,while循环适合“不知道要循环多少次,只知道什么时候停”的场景。
python
count =0
while count < 5:
print(f"第{count+1}次实验") count +=1# 别忘了更新条件,否则死循环
科研场景:迭代优化直到收敛
python
error =10.0
tolerance =0.01
iteration =0
max_iterations =1000
while error > tolerance and iteration < max_iterations:
# 这里写优化算法
# new_parameter = optimize(current_parameter)
# error = compute_error(new_parameter)
iteration += 1
print(f"第{iteration}次迭代,误差:{error:.4f}")if iteration == max_iterations:
print("达到最大迭代次数,可能未收敛")else:
print(f"收敛!共迭代{iteration}次")2.3 break 和 continue —— 循环里的“刹车”和“跳过”
break:立即结束整个循环
python
# 查找第一个大于50的数
numbers =[23,45,67,89,12,34]
for num in numbers:
if num >50:
print(f"找到了:{num}") break# 找到就停,后面的89和12都不看了
continue:跳过本次循环,继续下一次
python
# 只处理偶数
for i inrange(10):
if i % 2 !=0: # 如果是奇数
continue # 跳过,不打印
print(i) # 只打印偶数
2.4 循环的else子句(一个你可能不知道的特性)
Python的循环可以带else,当循环正常结束(没有被break打断)时,会执行else。
python
# 查找质数
num =17
for i in range(2, num):
if num % i ==0:
print(f"{num}不是质数,能被{i}整除") break
else:
print(f"{num}是质数") # 循环没有被break打断,说明没有找到因数这个特性在其他语言里没有,用好了挺优雅的。
三、推导式:一行代码搞定循环
这是Python的一个“语法糖”,写起来特别爽。用一行代码,完成循环+条件判断+生成新列表。
3.1 列表推导式
传统写法:
python
squares = []
for i in range(10):
squares.append(i ** 2) # squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
列表推导式:
python
squares =[i ** 2 for i in range(10)]
带条件的:
python
# 只取偶数平方
even_squares =[i **2 for i in range(10) if i %2==0]
# even_squares = [0, 4, 16, 36, 64]
科研场景:批量处理实验数据
python
# 原始数据
raw_data =[23.5,24.1,22.8,25.3,24.6]
# 全部加上校准值
calibrated =[x +0.5 for x in raw_data]
# 只保留正常范围内的
valid_data =[x for x in raw_data if 22<= x <=26]
3.2 字典推导式
同样简洁地生成字典:
python
# 生成学生学号对应的姓名
students =["张三","李四","王五"]
student_dict ={i: name for i, name in enumerate(students)}# {0: '张三', 1: '李四', 2: '王五'}# 从两个列表生成字典
keys =["name","age","major"]
values =["小冰",25,"动力工程"]
info ={k: v for k, v in zip(keys, values)}# {'name': '小冰', 'age': 25, 'major': '动力工程'}3.3 集合推导式
python
# 去重并平方
numbers =[1,2,2,3,3,3,4]
unique_squares ={x ** 2 for x in numbers}# {1, 4, 9, 16} 注意是集合,重复的自动去重
四、实战任务:写一个“猜数字”游戏
把上面学的东西综合起来,我给自己出了个题:写一个猜数字游戏。
需求:
程序随机生成一个1-100之间的整数
用户输入猜测的数字
程序告诉用户“猜大了”、“猜小了”或“猜对了”
猜对后显示总共猜了几次
可以选是否继续玩
我写的代码(你可以先自己试试,再看我的):
python
import random
def guess_number_game():
print("=== 猜数字游戏 ===") print("我已经想好了一个1-100之间的整数") play_again = True
while play_again:
# 生成随机数
secret = random.randint(1,100)
attempts =0
guessed =False
while not guessed:
try:
guess =int(input("请输入你的猜测:")) attempts +=1
if guess < secret:
print("猜小了!再试试") elif guess > secret:
print("猜大了!再试试") else:
print(f"恭喜!猜对了!答案是{secret}") print(f"你一共猜了{attempts}次") guessed =True
except ValueError:
print("请输入一个有效的整数") # 问是否继续
again =input("是否再玩一局?(y/n):") if again.lower()!='y':
play_again =False
print("谢谢游玩,下次再见!")if __name__ =="__main__":
guess_number_game()
这个程序用到了:
import random 导入随机数模块
while 循环控制游戏轮数
嵌套的 while 循环控制单轮猜测
if-elif-else 做判断
try-except 处理输入错误
break 和条件变量控制循环退出
跑通的时候,特别有成就感。
五、给新手的几个避坑建议
① 小心无限循环
python
# 错误示范:忘记更新条件
i =0
while i <10:
print(i)# 没有 i += 1,会一直打印0
# 正确示范
i =0
while i <10:
print(i)
i +=1
② 理解可变对象和不可变对象
在循环里修改列表时,要注意:
python
# 错误示范:在遍历时删除元素
numbers =[1,2,3,4,5]
for n in numbers:
if n %2==0:
numbers.remove(n)# 遍历时删除会导致跳过元素
# 正确做法:遍历副本
for n in numbers[:]:# [:] 创建副本
if n %2==0:
numbers.remove(n)
③ 别滥用推导式
推导式很简洁,但太复杂的逻辑放里面会让人看不懂。可读性 > 简洁性。
python
# 不推荐:太复杂了
result =[x **2 for x in range(100) if x %2==0 and x >10and x <50]
# 推荐:拆开写
result =[]
for x in range(100):
if x %2==0 and 10< x <50:
result.append(x ** 2)
写在最后
学完这些控制流语句,最大的感受是:
程序终于从“一条路走到黑”,变成了“会看路、会拐弯、会掉头”。
如果你也在学Python,欢迎在评论区分享你写的第一个“会判断会循环”的小程序。