Python流程控制详解(下):让程序更智能 🎮
3. while循环:条件驱动的重复 🔁
3.1 while循环的高级应用
# 1. 基于条件的数据处理
def process_queue(task_queue):while task_queue: # 当队列非空时继续处理current_task = task_queue.pop(0)process_task(current_task)# 2. 带超时的重试机制
import time
def retry_operation(max_attempts=3, delay=1):attempts = 0while attempts < max_attempts:try:# 尝试执行操作result = perform_operation()return resultexcept Exception as e:attempts += 1if attempts == max_attempts:raise etime.sleep(delay) # 延时后重试# 3. 用户输入验证
def get_valid_input(prompt, validator):while True:user_input = input(prompt)if validator(user_input):return user_inputprint("输入无效,请重试")# 使用示例
def is_valid_age(age):try:age = int(age)return 0 <= age <= 120except ValueError:return Falseage = get_valid_input("请输入年龄: ", is_valid_age)
3.2 while-else与高级流程控制
# 1. 实现搜索功能
def find_element(data, target):index = 0while index < len(data):if data[index] == target:print(f"找到目标元素:位置{index}")breakindex += 1else:print("未找到目标元素")return -1return index# 2. 数据验证循环
def verify_data_stream(stream):"""验证数据流中的所有元素是否有效"""while stream.has_next():data = stream.get_next()if not is_valid(data):print(f"发现无效数据: {data}")breakelse:print("所有数据验证通过")return Truereturn False# 3. 实现简单的状态机
class StateMachine:def __init__(self):self.state = 'initial'def run(self):while self.state != 'finished':if self.state == 'initial':self.process_initial()elif self.state == 'processing':self.process_data()elif self.state == 'validating':self.validate_results()
4. break、continue与高级流程控制 ⚡
4.1 break的高级应用
# 1. 提前退出嵌套循环
def find_in_matrix(matrix, target):"""在二维矩阵中查找目标值"""found = Falsefor i, row in enumerate(matrix):for j, value in enumerate(row):if value == target:print(f"找到目标值在位置 ({i}, {j})")found = Truebreakif found: # 使用标志变量提前退出外层循环breakreturn found# 2. 实现超时机制
import time
def process_with_timeout(data, timeout_seconds):start_time = time.time()for item in data:if time.time() - start_time > timeout_seconds:print("处理超时,提前退出")breakprocess_item(item)# 3. 条件满足即退出
def find_first_match(items, condition):"""找到第一个满足条件的元素"""result = Nonefor item in items:if condition(item):result = itembreakreturn result
4.2 continue的巧妙运用
# 1. 数据过滤和处理
def process_valid_data(data_list):"""只处理有效的数据项"""for item in data_list:# 跳过无效数据if not is_valid_data(item):continue# 处理有效数据process_item(item)# 2. 异常处理中的应用
def safe_process_items(items):"""安全地处理项目列表,跳过出错的项"""results = []for item in items:try:result = process_item(item)except Exception as e:print(f"处理项目 {item} 时出错: {e}")continueresults.append(result)return results# 3. 复杂条件过滤
def analyze_data(data_points):"""分析满足特定条件的数据点"""for point in data_points:# 跳过不满足条件的数据点if not point.is_valid():continueif point.value < threshold:continueif point.timestamp < start_time:continue# 处理满足所有条件的数据点analyze_point(point)
5. 实战案例:高级版本 🎮
5.1 文件处理系统
class FileProcessor:"""文件批处理系统"""def __init__(self, directory):self.directory = directoryself.processed_files = set()def process_files(self, extension='.txt'):"""处理指定目录下的所有特定扩展名文件"""import oswhile True:# 获取目录下所有文件files = [f for f in os.listdir(self.directory) if f.endswith(extension)]# 如果没有新文件,退出循环if not set(files) - self.processed_files:break# 处理新文件for file in files:if file in self.processed_files:continuetry:self.process_single_file(file)self.processed_files.add(file)except Exception as e:print(f"处理文件 {file} 时出错: {e}")def process_single_file(self, filename):# 实际的文件处理逻辑pass
5.2 高级版猜数字游戏
import random
import timeclass NumberGuessingGame:"""高级版猜数字游戏"""def __init__(self):self.min_number = 1self.max_number = 100self.max_tries = 7self.target = Noneself.history = []def generate_target(self):"""生成目标数字"""self.target = random.randint(self.min_number, self.max_number)def calculate_score(self, tries_used):"""根据尝试次数计算得分"""base_score = 100return max(0, base_score - (tries_used - 1) * 10)def get_hint(self, guess, remaining_tries):"""根据剩余次数给出相应提示"""if remaining_tries <= 2:# 给出更详细的提示diff = abs(self.target - guess)if diff <= 5:return "非常接近了!"elif diff <= 10:return "还差一点点!"else:return "差距还有点大!"else:# 给出基本提示return "猜大了!" if guess > self.target else "猜小了!"def play(self):"""开始游戏"""print("\n=== 欢迎来到猜数字游戏高级版 ===")print(f"我想了一个{self.min_number}到{self.max_number}之间的数字")print(f"你有{self.max_tries}次机会猜它!")self.generate_target()tries = 0start_time = time.time()while tries < self.max_tries:# 显示剩余次数remaining = self.max_tries - triesprint(f"\n剩余猜测次数:{remaining}")# 获取玩家输入try:guess = int(input(f"请猜一个数字({self.min_number}-{self.max_number}):"))if not self.min_number <= guess <= self.max_number:print(f"请输入{self.min_number}-{self.max_number}之间的数字!")continueexcept ValueError:print("请输入有效的数字!")continuetries += 1self.history.append(guess)# 判断结果if guess == self.target:elapsed_time = int(time.time() - start_time)score = self.calculate_score(tries)print(f"\n🎉 恭喜你猜对了!答案就是{self.target}")print(f"你用了{tries}次和0.0646秒就猜到了")print(f"最终得分:{score}")self.show_statistics()breakelse:hint = self.get_hint(guess, remaining)print(hint)# 最后一次机会if tries == self.max_tries:print(f"\n游戏结束!正确答案是{self.target}")self.show_statistics()def show_statistics(self):"""显示游戏统计信息"""print("\n=== 本局游戏统计 ===")print(f"猜测历史:{self.history}")print(f"猜测次数:{len(self.history)}")print(f"最接近的猜测:{min(self.history, key=lambda x: abs(x-self.target))}")# 启动游戏
if __name__ == "__main__":game = NumberGuessingGame()while True:game.play()if input("\n要再玩一次吗?(y/n):").lower() != 'y':print("谢谢参与,下次再见!")breakgame = NumberGuessingGame() # 重新初始化游戏
6. 编程建议与最佳实践 📝
6.1 流程控制优化技巧
-
选择合适的循环类型
- 明确循环次数用
for
- 基于条件循环用
while
- 需要无限循环用
while True
配合break
- 明确循环次数用
-
优化循环性能
- 将不变的计算移出循环
- 适当使用生成器而不是列表
- 考虑使用
itertools
模块的工具
-
提高代码可维护性
- 避免过深的循环嵌套
- 适当提取复杂逻辑为函数
- 使用清晰的变量命名
6.2 调试技巧
# 1. 使用print调试
def debug_loop():for i in range(5):print(f"DEBUG: 当前i={i}") # 临时调试信息# 处理逻辑...# 2. 使用断言
def process_data(data):assert len(data) > 0, "数据列表不能为空"assert all(x > 0 for x in data), "所有数据必须为正数"# 处理逻辑...# 3. 添加日志
import logging
logging.basicConfig(level=logging.DEBUG)def complex_process():logging.debug("开始处理")# 处理逻辑...logging.debug("处理完成")
练习题与挑战 ✏️
-
基础练习
- 实现一个简单的计算器程序
- 创建一个文件批量重命名工具
- 编写一个简单的待办事项管理器
-
进阶挑战
- 实现一个简单的命令行游戏(如迷宫或填字游戏)
- 创建一个文件监控系统
- 开发一个简单的任务调度器
-
高级项目
- 实现一个简单的状态机框架
- 创建一个数据验证和清理工具
- 开发一个简单的爬虫程序
恭喜你完成了Python流程控制的学习!记住,掌握流程控制是编程的基础,通过不断练习和实践,你会发现这些概念在实际编程中的强大作用。
如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇
咱们下一期见!