Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏

Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏

摘要 :本文是《AI应用开发筑基》系列第八篇,聚焦Python编程的灵魂------流程控制 。前面Day01搞定了数据存储与运算,但程序不能总是"一条路走到黑"。本文拆解四个核心武器:if条件判断 (基本格式、if...else、if...elif...else三段式进化)、match...case模式匹配 (Python 3.10+新宠)、while循环 (条件驱动+while...else结构)、for循环(遍历驱动+range神器),每个知识点都配有可运行的实战案例,从B站登录验证到99乘法表再到猜数字游戏,手把手带你感受"代码有了逻辑"的快乐。适合零基础入门及需要系统梳理流程控制的技术人员阅读。


一、开篇:为什么"流程控制"是程序的灵魂?

回顾一下 Day01 我们学的东西------字面量、变量、数据类型、运算符、I/O 交互。这些很好,但它们有一个共同点:代码从上往下,一行一行,闷头执行到底。

python 复制代码
name = input("请输入姓名: ")
print(f"你好, {name}")

这种代码只能处理"一条直线"的逻辑。但真实世界的程序需求远不止于此。

打开 B 站看看------登录的时候,账号密码都正确才让你进首页,否则弹错误提示。这是一个分支选择 。首页的轮播图,几张海报自动循环播放,这是一个重复执行。再想想你手机里的音乐 App------单曲循环、列表循环、随机播放,全是流程控制。

分支 和循环,合在一起就是编程里最核心的概念:流程控制。有了它,你的代码才不再是"一泻千里"的流水账,而是有了判断力、有了节奏感的真正程序。


二、条件判断:让代码学会"看情况行事"

2.1 if 基本格式------程序的第一道分叉口

场景很简单:只有满足条件,才干活。

python 复制代码
if 条件:
    条件成立时执行的代码

条件必须是一个布尔值(True / False)。True 就执行缩进块里的代码,False 就直接跳过。

注意:Python 通过缩进来描述代码归属,归属于 if 的语句需要在前面缩进(按 Tab 键,PyCharm 会自动转为 4 个空格)。

实战:B站登录验证(初版·只用 if)

需求:正确账号密码为 18888888888 / 666888,用户输入后判断是否登录成功。

python 复制代码
# 预设正确账号密码
correct_phone = "18888888888"
correct_pwd = "666888"

# 接收用户输入
phone = input("请输入手机号: ")
pwd = input("请输入密码: ")

# 条件判断
if phone == correct_phone and pwd == correct_pwd:
    print("✅ 登录成功,进入B站首页~")

这段代码最妙的地方在于 and 运算符------Day01 学的逻辑运算,现在派上用场了。"手机号对 并且 密码对"才放行,缺一不可。

但你发现问题了吗?只写了登录成功的情况,失败了什么都不提示。用户一脸懵逼------密码打错了也不知道错在哪。所以我们需要第二个分支。

2.2 if...else------非黑即白的二选一

python 复制代码
if 条件:
    条件成立时执行
else:
    条件不成立时执行

两条路,必走其一。比写两个独立的 if 效率高------条件只判断一次,不会重复检查。

实战:B站登录验证(改进版·if...else)

把刚才的 B 站登录改成 if...else,登录失败也能给用户反馈:

python 复制代码
# 预设正确账号密码
correct_phone = "18888888888"
correct_pwd = "666888"

# 接收用户输入
phone = input("请输入手机号: ")
pwd = input("请输入密码: ")

# if...else 条件判断
if phone == correct_phone and pwd == correct_pwd:
    print("✅ 登录成功,进入B站首页~")
else:
    print("❌ 用户名或密码错误,请重新输入!")

对比初版,只多了一个 else,用户体验直接拉满------再也不用猜"到底是我密码错了还是程序崩了"。

实战:闰年判断器

闰年规则有两层:

  • 非整百年份,能被 4 整除就是闰年
  • 整百年份,必须能被 400 整除才是闰年
python 复制代码
year = int(input("请输入年份: "))

if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
    print(f"{year} 年是闰年")
else:
    print(f"{year} 年是平年")

这里的条件表达式是一个经典组合------and 管"非整百年+被4整除",or 管"或者是整百年被400整除"。括号分组让逻辑一目了然,建议你也养成加括号的习惯,别考验自己和同事的眼力。

2.3 if...elif...else------多分支的终极形态

刚才的二选一很好,但现实往往是"多选一"。比如:判断一个数字是正数、负数、还是零------两个分支不够用。

这就引出 if...elif...else:

python 复制代码
if 条件1:
    操作1
elif 条件2:
    操作2
elif 条件3:
    操作3
else:
    以上都不满足时的兜底

执行机制 :从上到下依次判断,命中第一个 True 就执行并跳出整段,后面的条件不再检查。所以条件的排列顺序有讲究------把最可能命中的、或者最特殊的条件放前面。

提示:elif 必须出现在 if 之后,不能独立存在。if 之后可以有 0 个或多个 elif,最后的 else 可有可无。

实战:正数/负数/零判断

python 复制代码
num = int(input("请输入一个数字: "))

if num > 0:
    print(f"{num} 是正数")
elif num < 0:
    print(f"{num} 是负数")
else:
    print(f"{num} 是零")

实战:多账号登录系统

支持三组账号 admin/666888、root/547527、zhangsan/123456:

python 复制代码
username = input("请输入用户名: ")
password = input("请输入密码: ")

if username == "admin" and password == "666888":
    print("✅ 管理员登录成功")
elif username == "root" and password == "547527":
    print("✅ 超级用户登录成功")
elif username == "zhangsan" and password == "123456":
    print("✅ 普通用户登录成功")
else:
    print("❌ 用户名或密码错误")

2.4 综合案例:三角形类型判断

把条件判断的能力推到极限------输入三条边长,判断能构成什么三角形。

python 复制代码
a = int(input("请输入第一条边长: "))
b = int(input("请输入第二条边长: "))
c = int(input("请输入第三条边长: "))

# 先判断能否构成三角形:任意两边之和大于第三边
if a + b > c and a + c > b and b + c > a:
    # 能构成三角形,再判断类型
    if a == b == c:
        print("🔺 等边三角形")
    elif a == b or a == c or b == c:
        print("🔺 等腰三角形")
    else:
        print("🔺 普通三角形")
else:
    print("❌ 无法构成三角形")

这里有两个亮点值得注意:

  1. 嵌套 if:外层判断能不能构成,内层判断什么类型,层次分明
  2. a == b == c :Python 的链式比较,等价于 a == b and b == c,写起来优雅多了

三、模式匹配 match...case:if...elif 的现代化替代方案

处理"星期几"这种多值等值判断时,if...elif 的写法是这样的:

python 复制代码
day = int(input("请输入星期几(1-7): "))

if day == 1:
    print("周一:开周会,定本周计划")
elif day == 2:
    print("周二:专注开发")
elif day == 3:
    print("周三:代码评审")
elif day == 4:
    print("周四:技术分享")
elif day == 5:
    print("周五:收尾+周报")
elif day == 6:
    print("周六:学习充电")
elif day == 7:
    print("周日:好好休息")
else:
    print("输入错误")

七个分支写了七次 day ==,大量重复代码。Python 3.10 引入的 match...case 就是为解决这种场景而生的:

python 复制代码
day = int(input("请输入星期几(1-7): "))

match day:
    case 1:
        print("周一:开周会,定本周计划")
    case 2:
        print("周二:专注开发")
    case 3:
        print("周三:代码评审")
    case 4:
        print("周四:技术分享")
    case 5:
        print("周五:收尾+周报")
    case 6 | 7:          # | 表示"或",匹配多个值
        print("周末:好好放松")
    case _:               # _ 是通配符,兜底匹配
        print("输入错误")

match...case 的三个核心符号:

符号 含义 示例
` ` 或,匹配多个值中的任意一个
_ 通配符,匹配所有未命中情况 case _:
值 精确匹配 case 1:

实战:简易计算器

用 match...case 实现加减乘除运算,比 if...elif 清爽太多:

python 复制代码
num1 = float(input("请输入第一个数: "))
op = input("请输入运算符(+ - * /): ")
num2 = float(input("请输入第二个数: "))

match op:
    case "+":
        print(f"{num1} + {num2} = {num1 + num2}")
    case "-":
        print(f"{num1} - {num2} = {num1 - num2}")
    case "*":
        print(f"{num1} * {num2} = {num1 * num2}")
    case "/":
        if num2 != 0:
            print(f"{num1} / {num2} = {num1 / num2}")
        else:
            print("❌ 除数不能为0")
    case _:
        print("❌ 无效的运算符")

什么时候用 match 而不是 if...elif? 当你的判断条件是同一个变量对不同值的等值比较 时,match 更简洁。如果是范围判断(num > 0)、复杂逻辑组合(a > 0 and b < 10),还是老老实实用 if。


四、循环:让代码不知疲倦地重复执行

条件判断让代码有了"选择权",循环则让代码有了"耐力"。音乐 App 的单曲循环、B 站的轮播图、游戏里的主循环------本质上都靠循环实现。

Python 提供了两种循环语法:while (条件驱动)和 for(遍历驱动)。

4.1 while 循环------条件不满足,绝不罢休

python 复制代码
while 条件:
    循环体

执行逻辑:每次循环前先检查条件 → True 就执行循环体 → 再检查 → True 再执行 → 直到 False 才跳出。

while...else 结构

Python 的 while 还有一个很多人忽略的特性------可以搭配 else:

python 复制代码
while 条件:
    循环体
else:
    循环正常结束后执行(不被 break 打断时才执行)

!在这里插入图片描述(https://i-blog.csdnimg.cn/direct/98275f26d9a742b2873074aae075d957.png#pic_center)

python 复制代码
# 打印 10 遍 "人生苦短,我用Python ~"
i = 1
while i <= 10:
    print(f"第{i}遍: 人生苦短,我用Python ~")
    i += 1
else:
    print("✅ 打印完成")

else 块只在循环正常结束 时执行------也就是说,如果循环被 break 打断,else 就不会触发。这个特性在某些"查找后判断是否找到"的场景里非常好用。

实战:计算 1~100 所有偶数的累加之和

python 复制代码
num = 1
total = 0

while num <= 100:
    if num % 2 == 0:     # 过滤偶数
        total += num
    num += 1

print(f"1~100所有偶数之和为: {total}")   # 输出: 2550

这个案例把 Day01 的运算符(%、+=)、if 条件判断、while 循环串在了一起。编程就是这样------基础知识点单独拆开都简单,组合在一起才是能力的分水岭。

4.2 for 循环------遍历才是 Python 的正统

while 靠条件驱动,for 靠遍历驱动------对一批数据逐个处理。

python 复制代码
for 变量 in 可迭代对象:
    循环体
else:
    循环正常结束后执行(可选)
python 复制代码
# 遍历字符串中的每个字符
word = "Python"
for ch in word:
    print(ch, end=" ")     # 输出: P y t h o n

range()------for 循环的最佳搭档

range(start, stop, step) 生成一个整数序列,是 for 循环里最常用的"数据源":

python 复制代码
range(5)          # 0, 1, 2, 3, 4(默认从0开始)
range(1, 6)       # 1, 2, 3, 4, 5(左闭右开)
range(1, 10, 2)   # 1, 3, 5, 7, 9(步长为2)

实战1:计算 1~100 所有奇数之和

python 复制代码
total = 0
for i in range(1, 101, 2):   # 1, 3, 5, ..., 99
    total += i
print(f"1~100所有奇数之和为: {total}")   # 输出: 2500

实战2:计算 100~500 之间所有 3 的倍数之和

python 复制代码
total = 0
for i in range(100, 501):
    if i % 3 == 0:
        total += i
print(f"100~500之间所有3的倍数之和为: {total}")

4.3 嵌套循环------循环里的循环

外层循环体执行一次,内层循环完整地跑一圈。想象钟表:分针走一格,秒针要跑一整圈 60 秒。

实战:打印 m×n 的长方形

python 复制代码
m = int(input("请输入行数: "))
n = int(input("请输入列数: "))

for i in range(m):          # 外层:控制行
    for j in range(n):      # 内层:控制列
        print("*", end="")
    print()                 # 换行

小贴士 :print("*", end="") 中的 end="" 让 print 输出后不换行,默认的 end="\n" 会自动换行。这是打印图形类题目的必备技巧。

经典必练:九九乘法表

python 复制代码
for i in range(1, 10):         # 外层:第几行(1~9)
    for j in range(1, i + 1):  # 内层:第几列(1~当前行号)
        print(f"{j}×{i}={i*j}", end="\t")
    print()                    # 每行结束换行

输出效果:

复制代码
1×1=1
1×2=2   2×2=4
1×3=3   2×3=6   3×3=9
...
1×9=9   2×9=18  3×9=27  ...  9×9=81

关键细节:内层 range(1, i + 1) 中的上限 i + 1 会随着行号增大而增大,这就是"不等宽三角形"的精髓。

4.4 综合案例 1:登录重试系统

把循环和条件判断真正结合起来------登录失败不退出,反复重试直到成功:

python 复制代码
# 预存合法账号
accounts = {
    "admin": "666888",
    "zhangsan": "123456",
    "taoge": "888666"
}

while True:
    username = input("请输入用户名: ").strip()
    password = input("请输入密码: ").strip()

    # 空值校验
    if username == "" or password == "":
        print("⚠️  用户名和密码不能为空,请重新输入!")
        continue     # 跳过本次循环,回到开头

    # 验证账号密码
    if username in accounts and accounts[username] == password:
        print("✅ 登录成功,进入B站首页~")
        break        # 登录成功,跳出循环
    else:
        print("❌ 用户名或密码错误,请重新输入!")

这个案例引入了两个新武器:

  • continue:跳过本次循环剩余代码,直接进入下一轮
  • break:直接跳出整个循环
  • 字典 accounts:用数据结构替代一长串 if...elif

4.5 综合案例 2:猜数字游戏

终极实战------程序生成一个 1~100 的随机数,你来猜:

python 复制代码
import random

target = random.randint(1, 100)    # 生成 1~100 的随机数
guess_count = 0

print("🎯 猜数字游戏开始!范围:1 ~ 100")

while True:
    guess = int(input("请输入你猜的数字: "))
    guess_count += 1

    if guess > target:
        print("📉 猜大了,再试试!")
    elif guess < target:
        print("📈 猜小了,再试试!")
    else:
        print(f"🎉 恭喜你猜对了!答案就是 {target},你一共猜了 {guess_count} 次")
        break

这里面 Day01~Day08 的知识全部用上了:变量、数据类型、I/O、运算符、if...elif...else、while 循环、random 模块------一条完整的知识链。


五、Day08 技术栈总结

模块 核心内容 关键技术点 典型场景
条件判断 if / if...else / if...elif...else 分支逻辑、条件顺序、嵌套if 登录验证、权限判断、分类处理
模式匹配 match...case ` 或匹配、_` 通配符
while循环 条件驱动循环 循环变量更新、死循环防范、while...else 登录重试、游戏主循环
for循环 遍历驱动循环 range()、遍历字符串/列表 累加求和、批量处理
嵌套循环 循环中的循环 外层行/内层列、时间复杂度 九九乘法表、矩阵遍历
循环控制 break / continue 跳出循环 vs 跳过本次 登录成功跳出、空值跳过

六、写在最后

流程控制是编程的"脊椎"。没有它,你写的代码就是一根筋的流水账;有了它,代码才有了判断力、有了节奏、有了应对复杂场景的能力。

今天的内容量不小------三个条件判断语法、一个模式匹配新特性、两种循环、两种控制关键字、嵌套循环,七个实战案例。但好消息是,这些知识点你后面每天都会用到。if 会出现在每一段逻辑判断里,for 会出现在每一次数据处理里,break/continue 会让你的循环更灵活。

建议这样巩固:

  1. 先独立敲一遍九九乘法表------练嵌套循环
  2. 再独立敲一遍猜数字游戏------练完整流程控制
  3. 把登录重试改成限制 3 次机会------练 break 和计数逻辑

感谢阅览

码字不易,如果这篇文章对你有帮助,欢迎点赞、收藏、关注。

有任何问题、踩过的坑、或者你写的更有意思的案例,欢迎在评论区聊聊。一起进步。

相关推荐
言乐61 小时前
通过 3D 动画直观演示球形瓶内可滑动半圆机构在倾倒时防粘盖、回正时刮膏体的运动学过程
python·3d·django·virtualenv·pygame
quantdash_cc1 小时前
ETF 行情数据清洗实战:字段语义拆解、标的池整理与五个校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
揽星河..1 小时前
【C语言】分支和循环
c语言·c++·算法
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
威哥爱编程2 小时前
Python 智能体开发实战 05:一问教材内容它就编?先把答案从你自己的资料里检索出来
python·agent
java_prinln2 小时前
RAG 面试题介绍
python·agent
威哥爱编程2 小时前
Python 智能体开发实战 06:一个函数里塞了八百行?用状态机把批改流程拆成能回退的步骤
python·agent
Fuyo_11193 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法