4.Python流程控制实战指南:从条件分支到循环优化

49 阅读7分钟

@[toc]

Python流程控制实战指南:从条件分支到循环优化


一、条件分支:让程序学会决策

条件分支是程序决策的核心,让代码在不同条件下执行不同逻辑。

1. 基础语法与实战

# 用户折扣系统
age = int(input("请输入年龄: "))
is_member = input("是否是会员(y/n): ").lower() == 'y'

if age <= 12:
    discount = 0.5  # 儿童半价
elif age >= 65:
    discount = 0.7  # 老人7折
elif is_member:
    discount = 0.8  # 会员8折
else:
    discount = 1.0  # 无折扣

print(f"您的最终折扣为: {discount*10}折")

# 单行条件表达式(三元运算符)
result = "特价商品" if discount < 1.0 else "全价商品"

用户折扣系统示例

2. 嵌套条件优化技巧

# 航班座位分配系统 - 避免多层嵌套
seat_type = input("座位类型(头等舱/商务舱/经济舱): ")
has_child = input("是否有随行儿童(y/n): ") == 'y'
is_vip = input("是否是VIP客户(y/n): ") == 'y'

# 使用组合条件代替嵌套
if seat_type == "头等舱" or is_vip:
    service = "专属贵宾室"
elif seat_type == "商务舱" and has_child:
    service = "儿童娱乐包"
else:
    service = "标准服务"

print(f"您享受的服务: {service}")

航班座位分配系统示例


二、循环结构:自动化重复任务

Python提供两种循环:for用于已知次数的遍历,while用于条件控制的循环。

1. for循环进阶技巧

# 使用字典的items()遍历
student_scores = {"小明": 92, "小红": 88, "小刚": 75}

print("成绩报告:")
for name, score in student_scores.items():
    grade = "A" if score >= 90 else "B" if score >= 80 else "C"
    print(f"{name}{score}分 ({grade}级)")

# 并行遍历多个序列
names = ["张三", "李四", "王五"]
ages = [25, 32, 29]
jobs = ["工程师", "设计师", "产品经理"]

print("\n员工列表:")
for i, (name, age, job) in enumerate(zip(names, ages, jobs), 1):
    print(f"{i}. {name}-{age}岁-{job}")

2. while循环安全指南

# 密码重试机制 - 包含安全保护
max_attempts = 3
correct_password = "Python2024"
attempts = 0

while attempts < max_attempts:
    password = input("输入访问密码: ")
    if password == correct_password:
        print("✅ 认证成功!")
        break
    else:
        attempts += 1
        remaining = max_attempts - attempts
        print(f"❌ 密码错误!剩余尝试次数: {remaining}")
        
        # 安全防护:连续错误增加延迟
        if attempts > 1:
            import time
            delay = attempts * 2
            print(f"⏳ 安全机制: {delay}秒后重试")
            time.sleep(delay)

if attempts == max_attempts:
    print("🔒 账户已锁定,请联系管理员")

三、流程控制语句:break/continue/pass

1. 三大控制器的应用场景

# 搜索功能 - 使用break提高效率
products = ["手机", "笔记本电脑", "平板", "耳机", "充电器"]
target = "平板"

print("产品搜索中...")
for product in products:
    print(f"正在检查: {product}")
    if product == target:
        print("✔️ 找到目标商品")
        break  # 找到后立即退出循环
else:
    print("目标商品不存在")

# 数据处理 - 使用continue跳过异常值
data = [34, "无效", 56, 72, "NaN", 89]
valid_data = []

print("\n数据清洗:")
for item in data:
    if not isinstance(item, int):
        print(f"跳过非数字值: {item}")
        continue
    valid_data.append(item)
    print(f"有效数据: {item}")

# pass占位符的典型用例
try:
    import numpy
except ImportError:
    pass  # 忽略导入失败,继续执行其他代码
else:
    print("NumPy可用")

2. 循环的else子句实战

# 监测网络连通性
import random
import time

servers = ["网关", "DNS", "存储服务", "API服务"]

print("开始网络巡检...")
for server in servers:
    latency = random.uniform(0.1, 0.8)  # 模拟延迟
    if latency > 0.5:  # 超时阈值
        print(f"⚠️ {server}响应慢({latency:.2f}s) - 跳过后续检查")
        break
    print(f"✓ {server} 延迟: {latency:.2f}s")
    time.sleep(0.5)
else:
    print("✅ 所有服务正常")  # 只有没有break时才会执行

四、实战项目:完整应用开发

项目1:智能猜数字游戏(V2.0)

import random
import time
import sys

def enhanced_guess_game():
    """增强版猜数字游戏"""
    # 难度选择系统
    print("选择难度:")
    print("1 - 简单(1-50, 8次机会)")
    print("2 - 中等(1-100, 6次机会)")
    print("3 - 困难(1-200, 4次机会)")
    
    level = input("输入数字选择: ")
    if level == '1':
        start, end, attempts = 1, 50, 8
    elif level == '2':
        start, end, attempts = 1, 100, 6
    elif level == '3':
        start, end, attempts = 1, 200, 4
    else:
        print("无效选择,使用默认模式")
        start, end, attempts = 1, 100, 5
    
    secret = random.randint(start, end)
    count = 0
    start_time = time.time()
    last_diff = float('inf')  # 记录上一次的差值
    
    print(f"\n🔢 猜数字游戏开始({start}-{end})!共{attempts}次机会")
    
    while count < attempts:
        try:
            guess = int(input(f"尝试 #{count+1}: "))
        except ValueError:
            print("请输入有效的数字!")
            continue
        
        count += 1
        
        # 边界检查
        if guess < start or guess > end:
            print(f"数字超出范围!请输入{start}-{end}之间的整数")
            count -= 1
            continue
        
        # 智能提示系统
        diff = abs(guess - secret)
        if guess == secret:
            elapsed = time.time() - start_time
            print(f"🎉 正确!答案 {secret} | 用时 {elapsed:.1f}s | 尝试 {count}次")
            break
        else:
            # 动态提示语
            if diff < last_diff:
                hint = "接近了!" if diff < last_diff * 0.5 else "更近了!"
            else:
                hint = "走远了..."
            
            # 温度提示系统
            temp_hint = ""
            ratio = diff / (end - start)
            if ratio < 0.1:
                temp_hint = "🔥 非常热!"
            elif ratio < 0.3:
                temp_hint = "🌡️ 温热"
            elif ratio < 0.6:
                temp_hint = "❄️ 有点冷"
            else:
                temp_hint = "❄️❄️ 冰冷"
            
            last_diff = diff
            
            # 高低提示
            direction = "太大" if guess > secret else "太小"
            print(f"{temp_hint}{hint}{direction}了!剩余{attempts - count}次")
    else:
        print(f"游戏结束! 正确答案是 {secret}")

# 启动游戏
enhanced_guess_game()

项目2:高性能素数计算器(附带可视化)

import math
import matplotlib.pyplot as plt
import time

def prime_sieve(limit):
    """埃拉托色尼筛法生成素数"""
    sieve = [True] * (limit+1)
    sieve[0] = sieve[1] = False
    primes = []
    
    for num in range(2, int(math.sqrt(limit)) + 1):
        if sieve[num]:
            primes.append(num)
            sieve[num*num : : num] = [False] * len(sieve[num*num : : num])
    
    return primes + [i for i in range(int(math.sqrt(limit)) + 1, limit+1) if sieve[i]]

def is_prime_optimized(n):
    """优化版素数检测"""
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
        
    # 只检查奇数因子
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

# 性能对比测试
def performance_test():
    """不同算法的性能比较"""
    sizes = [10, 100, 1000, 10000, 50000]
    sieve_times = []
    optimized_times = []
    
    for size in sizes:
        # 筛法测试
        start = time.time()
        primes_sieve = prime_sieve(size)
        sieve_times.append(time.time() - start)
        
        # 单个检测测试
        start = time.time()
        primes_opt = [i for i in range(2, size+1) if is_prime_optimized(i)]
        optimized_times.append(time.time() - start)
        
        # 验证结果一致
        assert primes_sieve == primes_opt, f"算法不一致 @ size={size}"
    
    return sizes, sieve_times, optimized_times

# 可视化性能对比
def plot_performance(sizes, times1, times2):
    plt.figure(figsize=(10, 6))
    plt.plot(sizes, times1, 'o-', label='筛法生成素数')
    plt.plot(sizes, times2, 's-', label='单个优化检测')
    plt.xlabel('计算范围')
    plt.ylabel('耗时(秒)')
    plt.title('素数计算算法性能对比')
    plt.xscale('log')
    plt.yscale('log')
    plt.grid(True)
    plt.legend()
    plt.savefig('prime_performance.png')
    plt.show()

# 查找范围内的孪生素数
def find_twin_primes(limit):
    """查找孪生素数对(如(3,5), (11,13))"""
    primes = prime_sieve(limit)
    twins = []
    for i in range(1, len(primes)):
        if primes[i] - primes[i-1] == 2:
            twins.append((primes[i-1], primes[i]))
    return twins

# 执行程序
if __name__ == "__main__":
    # 筛选1000以内的素数
    primes_1000 = prime_sieve(1000)
    print(f"1000以内的素数有 {len(primes_1000)} 个")
    print(f"前10个素数: {primes_1000[:10]}")
    
    # 找孪生素数
    twins = find_twin_primes(1000)
    print(f"\n1000内找到 {len(twins)} 对孪生素数")
    print(f"前5对: {twins[:5]}")
    
    # 性能测试与可视化
    sizes, sieve_times, optimized_times = performance_test()
    plot_performance(sizes, sieve_times, optimized_times)

不同算法的性能对比结果:

算法类型时间复杂度适用场景
单个数检测(基础版)O(n)小规模快速验证
单个数检测(平方根优化)O(√n)单个大数判断
埃拉托色尼筛法O(n log log n)批量生成素数

五、学习建议与下期预告

1. 流程控制最佳实践

  • 避免深层嵌套:超过3层的嵌套应考虑拆分函数
  • 循环安全机制:while循环必须设置安全计数器
  • 善用生成器:大数据循环使用(i for i in range(n))节省内存

2. 下期预告:5.Python函数与模块化工程实战:构建高复用代码体系

所有代码均已在Python 3.10环境测试通过,建议读者复制代码到IDE中,修改参数并观察运行结果,加深对流程控制的理解。在实际开发中,善用循环和条件判断能大幅提高代码的逻辑性和运行效率!

更多技术干货欢迎关注微信公众号“科威舟的AI笔记”~

【转载须知】:转载请注明原文出处及作者信息