当前位置:首页>python>从“if”到“while”,Python里那些让程序“活起来”的语句——一个工科男的自学笔记(二)

从“if”到“while”,Python里那些让程序“活起来”的语句——一个工科男的自学笔记(二)

  • 2026-09-10 13:31:55
从“if”到“while”,Python里那些让程序“活起来”的语句——一个工科男的自学笔记(二)
文/小冰

你好呀,我是小冰。

上篇文章写了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. 程序随机生成一个1-100之间的整数

  2. 用户输入猜测的数字

  3. 程序告诉用户“猜大了”、“猜小了”或“猜对了”

  4. 猜对后显示总共猜了几次

  5. 可以选是否继续玩

我写的代码(你可以先自己试试,再看我的):

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,欢迎在评论区分享你写的第一个“会判断会循环”的小程序。

最新文章

随机文章