Python控制结构:条件与循环

76 阅读7分钟

系列导读:这是Python零基础入门系列的第二篇。本篇将掌握程序逻辑核心——条件判断与循环控制。下期预告:《Python核心数据结构(上):字符串与序列类型》
前置知识

一、为什么控制结构如此重要?🔥

控制结构是程序的"大脑",决定代码执行路径:

  • 🧠 条件语句:让程序像人类一样做决策("如果下雨就带伞")
  • 🔄 循环语句:自动化重复任务("每天打卡8次")
  • 效率倍增:10行循环代码 = 1000行重复代码
  • 🎮 游戏开发基础:90%的游戏逻辑依赖控制结构

💡 新手警报:Python使用缩进(空格/Tab)代替大括号定义代码块,这是新手最常犯错的地方!建议统一使用4个空格缩进(VS Code默认设置)

二、条件语句:if/elif/else 三剑客

基础语法结构

if 条件1:
    # 条件1为True时执行
elif 条件2:  # 可选,可多个elif
    # 条件2为True时执行
else:        # 可选
    # 所有条件都不满足时执行

实战场景1:用户登录验证

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

if username == "admin" and password == "123456":
    print("✅ 登录成功!欢迎回来,管理员")
elif username == "guest":
    print("✅ 欢迎访客,您有只读权限")
else:
    print("❌ 用户名或密码错误!请重试")

实战场景2:成绩评级系统

score = float(input("请输入考试成绩(0-100): "))

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"

print(f"您的成绩等级是: {grade}")
# 注意:f-string格式化(Python3.6+特性)

三元表达式(单行条件)

# 传统写法
if age >= 18:
    status = "成年人"
else:
    status = "未成年人"

# 三元表达式(更Pythonic)
status = "成年人" if age >= 18 else "未成年人"

# 实战:根据天气决定出行
weather = "rainy"
decision = "带伞出门" if weather == "rainy" else "轻装出行"
print(decision)  # 输出:带伞出门

三、循环语句:让代码动起来

for循环:遍历序列的王者

# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
    print(f"正在吃{fruit}...")

# 遍历字符串
for char in "Python":
    print(char, end=" ")  # 输出:P y t h o n 

# 使用range()生成数字序列
for i in range(5):       # 0,1,2,3,4
    print(f"倒计时: {i}")

for i in range(2, 6):    # 2,3,4,5
    print(f"第{i}章")

for i in range(10, 0, -2): # 10,8,6,4,2 (步长-2)
    print(f"降温{i}度")

while循环:条件驱动的循环

# 经典案例:猜数字游戏
import random
secret_number = random.randint(1, 100)  # 生成1-100随机数
guess = None
attempts = 0

print("🎮 猜数字游戏开始!(1-100)")
while guess != secret_number:
    guess = int(input("猜一个数字: "))
    attempts += 1
    
    if guess < secret_number:
        print("↑ 太小了!")
    elif guess > secret_number:
        print("↓ 太大了!")
    
print(f"🎉 恭喜!你用了{attempts}次猜中了数字{secret_number}!")

# 防死循环技巧:设置最大尝试次数
max_attempts = 10
while attempts < max_attempts and guess != secret_number:
    # ...循环体

四、循环控制:break/continue/pass

语句作用使用场景
break立即终止整个循环找到目标后提前退出
continue跳过本次循环剩余部分过滤特定数据
pass空操作(占位符)预留代码框架

break实战:质数检测

num = int(input("检查是否为质数: "))
is_prime = True

for i in range(2, num):
    if num % i == 0:
        is_prime = False
        break  # 一旦发现因数,立即终止循环

print(f"{num}是质数" if is_prime else f"{num}不是质数")

continue实战:过滤无效数据

scores = [85, 92, -1, 78, 105, 90]  # -1和105是无效分数
valid_scores = []

for score in scores:
    if score < 0 or score > 100:
        continue  # 跳过无效分数
    valid_scores.append(score)

print(f"有效成绩: {valid_scores}")  # [85, 92, 78, 90]

pass实战:预留代码框架

# 开发中暂时无法实现的函数
def analyze_data():
    pass  # 避免语法错误,后续再实现

# 未完成的条件分支
if user_role == "admin":
    # TODO: 实现管理员功能
    pass
elif user_role == "user":
    print("普通用户功能")

五、高级技巧:循环与条件的组合应用

九九乘法表(经典面试题)

# 一行代码实现?不!我们分步讲解
for i in range(1, 10):       # 控制行
    for j in range(1, i+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
# ...(完整9行)

密码强度检测器

password = input("设置密码: ")
has_upper = False
has_lower = False
has_digit = False

# 检查每个字符
for char in password:
    if char.isupper():
        has_upper = True
    elif char.islower():
        has_lower = True
    elif char.isdigit():
        has_digit = True

# 评估强度
if len(password) >= 8 and has_upper and has_lower and has_digit:
    strength = "⭐⭐⭐ 强密码"
elif len(password) >= 6:
    strength = "⭐⭐ 中等密码"
else:
    strength = "⚠️ 弱密码"

print(f"密码强度: {strength}")

六、常见陷阱与避坑指南

陷阱1:浮点数比较误差

# 错误写法:直接比较浮点数
balance = 0.1 + 0.2
if balance == 0.3:  # 永远为False!
    print("相等")

# 正确写法:使用容差比较
epsilon = 1e-9  # 极小值
if abs(balance - 0.3) < epsilon:
    print("近似相等")  # ✅ 会执行

陷阱2:修改遍历中的列表

# 危险操作:在for循环中删除元素
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        numbers.remove(num)  # 导致跳过元素!

print(numbers)  # 错误结果: [1, 3, 5] ❌ (预期[1,3,5]但过程危险)

# 安全方案1:遍历副本
for num in numbers.copy():  # 使用副本
    if num % 2 == 0:
        numbers.remove(num)

# 安全方案2:列表推导式
numbers = [num for num in numbers if num % 2 != 0]

陷阱3:无限循环

# 典型错误:忘记更新循环变量
count = 0
while count < 5:
    print(count)
    # 忘记 count += 1 → 无限循环!

# 防御措施:设置超时
import time
start_time = time.time()
while time.time() - start_time < 30:  # 最大运行30秒
    # 业务逻辑

七、动手练习(巩固核心技能)

练习1:斐波那契数列

# 要求:生成前20个斐波那契数
# 数列规则:0,1,1,2,3,5,8... (每个数是前两数之和)
# 示例输出:0 1 1 2 3 5 8 13 ...

练习2:石头剪刀布

# 要求:
# 1. 用户输入"石头/剪刀/布"
# 2. 电脑随机出拳
# 3. 判断胜负(石头>剪刀,剪刀>布,布>石头)
# 4. 显示结果
# 提示:使用random.choice(["石头","剪刀","布"])

练习3:素数筛选

# 要求:找出100以内的所有素数
# 素数定义:只能被1和自身整除的数(>1)
# 示例输出:[2,3,5,7,11,13...]

💡 练习答案(完成后再查看):

# 练习1
a, b = 0, 1
for _ in range(20):
    print(a, end=" ")
    a, b = b, a + b

# 练习2
import random
choices = ["石头", "剪刀", "布"]
user = input("出拳(石头/剪刀/布): ")
computer = random.choice(choices)
print(f"电脑出: {computer}")

if user == computer:
    print("平局!")
elif (user == "石头" and computer == "剪刀") or \
     (user == "剪刀" and computer == "布") or \
     (user == "布" and computer == "石头"):
    print("🎉 你赢了!")
else:
    print("😭 你输了...")

# 练习3
primes = []
for num in range(2, 101):
    is_prime = True
    for i in range(2, int(num**0.5)+1):
        if num % i == 0:
            is_prime = False
            break
    if is_prime:
        primes.append(num)
print(primes)

八、高频面试题解析

Q:for循环和while循环如何选择?
黄金法则

  • 遍历已知序列(列表/字符串等)→ for循环
  • 条件不确定的循环(如用户输入)→ while循环
# 读取文件直到EOF → while
while not file.eof():
    line = file.readline()

# 遍历购物车商品 → for
for product in shopping_cart:
    calculate_price(product)

Q:如何优雅地退出多层循环?
最佳实践:使用函数+return

def find_target(matrix, target):
    for row in matrix:
        for num in row:
            if num == target:
                print(f"找到{target}!")
                return True  # 直接退出所有循环
    return False

# 调用
result = find_target([[1,2],[3,4]], 3)

九、下期预告 & 学习资源

👉 下期重点
《Python核心数据结构(上):字符串与序列类型》将深入讲解:

  • 字符串15种高效操作技巧
  • 列表推导式(Python最优雅的语法之一)
  • 元组 vs 列表:如何选择?
  • 实战案例:文本分析器/数据清洗工具

📚 推荐资源

  1. Python官方循环文档
  2. Visualize Code Execution(动态查看代码执行过程)
  3. 书籍:《Python Crash Course》

✨ 每日挑战
用循环打印等腰三角形(高度5行):

    *
   ***
  *****
 *******
*********

在评论区晒出你的代码


作者离光
系列传送门Python零基础入门专栏