@[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笔记”~
【转载须知】:转载请注明原文出处及作者信息