Loading...

文章背景图

🐍 Python 魔法入门:让代码拥有思想——流程控制大揭秘

2026-05-07
7
-
- 分钟
|

大家好,我是 MuSen,一个爱分享、带你轻松玩转编程的引路人。

在之前的课程中,我们的程序就像是一个“直肠子”,代码永远是从第一行按顺序执行到最后一行。这在编程中叫作顺序结构

但现实世界可没这么简单。比如:如果下雨,我就带伞;如果余额不足,就不让你买东西;如果这首歌没放完,就一直放。这就需要我们的程序拥有“判断”和“重复”的能力。

今天,我们就来学习编程中最核心的魔法——流程控制(Flow Control)。掌握了它,你的代码就不再是死板的计算器,而是拥有了“灵魂”的机器人!🚀

5.1 分支语句:代码的“人生岔路口” 🛣️

分支语句(选择语句)是通过条件判断,来决定到底执行哪段代码。它的核心关键字是 if

5.1.1 单分支:一锤子买卖 (if)

MuSen 的大白话:就像酒吧的保安,如果你成年了(条件成立),就让你进去;如果没成年,不好意思,当做没看见你。

from random import randint

# 随机看看你兜里有多少钱
balance = randint(0, 100)
price = 50
print(f"当前余额:{balance}")

# 岔路口来了!
if balance < price:
    # 只有当余额小于50时,才会执行下面缩进的代码
    print("余额不足,请充值!")

print("欢迎下次光临") # 这句没有缩进,无论如何都会执行

💣 MuSen 的避坑警告:缩进就是命! 在 Python 中,没有像 Java 或 C 语言那样的大括号 {} 来圈定代码块。Python 完全靠缩进(一般是 4 个空格)来判断代码到底归不归 if 管。只要缩进取消了,就不在 if 的势力范围了!

5.1.2 双分支:Plan B (if...else)

MuSen 的大白话:非此即彼。如果条件成立,走 A 计划;如果不成立,走 B 计划。

balance = randint(0, 100)
price = 50
print(f"当前余额:{balance}")

if balance < price:
    print("余额不足,请充值")
else:
    # 如果上面的条件不成立(余额 >= 价格),就走这里
    balance = balance - price
    print(f"消费成功,剩余余额:{balance}")

5.1.3 多分支:做道选择题 (if...elif...else)

MuSen 的大白话:当情况有很多种时,用 elif(也就是 else if 的缩写)。它就像连环闯关,从上往下挨个判断,只要有一个条件满足了,执行完就直接跳出,后面的看都不看!

age = randint(0, 100)
print(f"此人年龄为:{age}")

if age < 2:
    print("这是个婴儿")
elif age < 4:
    print("这是个幼儿")
elif age < 13:
    print("这是个儿童")
elif age < 20:
    print("这是个青少年")
elif age < 65:
    print("这是个成年人")
else:
    print("这是个老人")

注:if 只能有一个,else 最多有一个且必须在最后,但中间的 elif 可以有无数个。

5.1.4 嵌套分支:俄罗斯套娃 🪆

if 里面还能再套 if!就像你剥洋葱,剥开一层里面还有一层。

# 一个极其硬核的底层状态判断例子
# 假设用二进制的位来记录键盘状态:第一位大小写,第二位中英文,第三位输入法
state = 0b011 

if state & 0b100 == 0b100:
    print("大写状态")
else:
    if state & 0b010 == 0b010:
        if state & 0b001 == 0b001:
            print("微软拼音-中文模式")
        else:
            print("微软拼音-英文模式")
    else:
        print("英语-美式键盘")

5.1.5 时代的眼泪:三目运算符 (Ternary Operator)

MuSen 的大白话:如果你觉得写 if...else 占了四行太啰嗦,Python 允许你把它压缩成极其优雅的一行代码

语法公式:条件成立时的值 if 表达式 else 条件不成立时的值

num1 = 20
num2 = 30

# 传统写法找最大值:
# if num1 > num2:
#     max_num = num1
# else:
#     max_num = num2

# ✨ 三目运算符优雅写法(一行搞定!):
max_num = num1 if num1 > num2 else num2
print("最大值是:", max_num)

5.1.6 时代的新宠:match...case (Python 3.10+) 🌟

如果你的判断只是拿一个变量去匹配很多个固定的值,一直写 elif 会很丑。Python 3.10 终于引入了类似其他语言 switch 的神技:match...case

month = 3
# 这里的 | 表示“或”,匹配其中任何一个都可以
match month:
    case 1 | 3 | 5 | 7 | 8 | 10 | 12:
        print(f"{month}月有31天")
    case 4 | 6 | 9 | 11:
        print(f"{month}月有30天")
    case 2:
        print(f"{month}月可能有28天")
    case _:  # 这个下划线 _ 是无敌的保底操作,相当于 else
        print("您输入的是什么鬼月份?")

5.2 循环语句:代码的“仓鼠跑轮” 🐹

如果让你在屏幕上打印 10000 遍“我爱你”,你要手敲一万行代码吗?不,让循环来帮你。

5.2.1 while 循环:只要条件真,就一直奔跑

MuSen 的大白话:先看条件成立不成立,成立就执行循环体。执行完回来再看条件,只要条件还是真,就继续执行。如果条件永远是真,它就变成了死循环,直接把你的电脑跑到冒烟!🔥

案例 1:繁衍的兔子 第一周2只,此后每周增加上周的2倍(也就是每周变成上周的3倍),求第10周有多少只。

rabbit = 2
week = 1
while week < 10:
    rabbit = rabbit + rabbit * 2  # 或者写成 rabbit *= 3
    week += 1
    print(f"第{week}周有{rabbit}只兔子")

案例 2:装逼神器——命令行进度条

import time

num = 1
while num <= 100:
    # \r 的意思是“回到行首”,这样新打印的内容就会覆盖旧内容,看起来像动图!
    print(f"\r正在加载:{'=' * num}> {num}%", end="")
    num += 1
    time.sleep(0.05)  # 每次循环睡 0.05 秒,防止跑太快

5.2.2 for 循环:遍历大师 🚶‍♂️

MuSen 的大白话for 循环天生就是为了遍历(也就是挨个访问)序列(像列表、字符串等可迭代对象)而生的。

# 遍历列表
for item in [2, 3, 5, 7, 11]:
    print("拿到质数:", item)

# 遍历字符串
for char in "Hello":
    print("拿到字母:", char)

最佳拍档:range() 函数 如果你只是想单纯地循环指定次数,请出 range() 准没错。 公式:range(start, stop, step),又是经典的左闭右开(包含起,不包含止)。

for i in range(5):          # 等价于 range(0, 5),生成 0,1,2,3,4
    print(i)

for i in range(10, 0, -2):  # 倒着数,步长为 -2
    print(i)                # 打印:10, 8, 6, 4, 2

嵌套循环案例:九九乘法表

for i in range(1, 10):           # 控制行(1到9行)
    for j in range(1, i + 1):    # 控制列(每行有几列)
        print(f"{j} × {i} = {i * j}", end="\t")
    print()                      # 每打印完一行,用一个空的 print 来换行

5.3 循环的“神仙道具”:控制流程的按键 🎮

在循环的过程中,有时候我们需要强行介入,改变既定的路线。

1) continue:切歌 ⏭️

遇到 continue本次循环剩下的代码不执行了,直接跳回循环开头,开始下一轮!

# 打印 0-9,但是跳过所有的偶数
for i in range(10):
    if i % 2 == 0:
        continue  # 是偶数?直接切歌,不执行下面的 print
    print(i)      # 只会打印出 1, 3, 5, 7, 9

2) break:拔电源 🔌

遇到 break,整个循环当场暴毙,彻底结束!

sum_val = 0
for i in range(100):
    sum_val += i**i
    if sum_val > 10000000:
        print("太大了,我不玩了,拔电源!")
        break  # 循环直接结束,剩下的不管了

3) pass:站位保安 🧍

它啥也不干。有时候你写了个 iffor,但里面还没想好写什么代码。如果你空着,Python 会报错,这时候你就写个 pass 占个坑。

for i in range(10):
    pass  # 这里啥事不干,但程序不会报错

💎 面试超硬核专区:神奇的 else 后缀

大多数人都知道 if 后面能跟 else,但很多人不知道,Python 里的 whilefor 后面竟然也能跟 else!这也是极其高频的面试题。

面试官:“解释一下 for...else 中,else 代码块什么时候会执行?”

MuSen 答疑: 请牢记一句话:只要循环没有被 break 强行拔电源,是自己平平安安寿终正寝的,就会在最后执行 else

# 案例 A:平平安安跑完
for i in range(3):
    print("正在循环:", i)
else:
    print("循环正常结束,我被执行了!") # 会被打印!

# 案例 B:中途被拔了电源
for i in range(3):
    if i == 1:
        break  # 被迫中止
else:
    print("循环正常结束,我被执行了!") # 永远不会被打印!

这个特性在找寻列表中某个元素时极其好用,省去了设置标志位 flag 的麻烦!

评论交流

文章目录