Python入门(4)--流程控制(下)

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 流程控制优化技巧

  1. 选择合适的循环类型

    • 明确循环次数用for
    • 基于条件循环用while
    • 需要无限循环用while True配合break
  2. 优化循环性能

    • 将不变的计算移出循环
    • 适当使用生成器而不是列表
    • 考虑使用itertools模块的工具
  3. 提高代码可维护性

    • 避免过深的循环嵌套
    • 适当提取复杂逻辑为函数
    • 使用清晰的变量命名

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("处理完成")

练习题与挑战 ✏️

  1. 基础练习

    • 实现一个简单的计算器程序
    • 创建一个文件批量重命名工具
    • 编写一个简单的待办事项管理器
  2. 进阶挑战

    • 实现一个简单的命令行游戏(如迷宫或填字游戏)
    • 创建一个文件监控系统
    • 开发一个简单的任务调度器
  3. 高级项目

    • 实现一个简单的状态机框架
    • 创建一个数据验证和清理工具
    • 开发一个简单的爬虫程序

恭喜你完成了Python流程控制的学习!记住,掌握流程控制是编程的基础,通过不断练习和实践,你会发现这些概念在实际编程中的强大作用。

如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇

咱们下一期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471665.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

使用 Vision 插件让 GitHub Copilot 识图问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。GitHub Copilot 在刚刚召开的全球技术大会上宣布升级了 GitHub Copilot 背后的大语言模型&#xff0c;现在已经正式启用 GPT 4…

LeetCode面试经典150题C++实现,更新中

用C实现下面网址的题目 https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1、数组\字符串 88合并两个有序数组 以下是使用 C 实现合并两个有序数组的代码及测试用例 C代码实现 #include <iostream> #include &l…

HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)

前言 没经历过的童鞋&#xff0c;首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请&#xff0c;混在一起也分不清。其实搞清楚后也就那会事&#xff0c;各个文件都有它存在的作用。 HarmonyOS通过数字证书与Profile文件等签名信息来保证鸿蒙应用/…

Serverless架构在实时数据处理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 引言 Ser…

Mysql篇-三大日志

概述 undo log&#xff08;回滚日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现了事务中的原子性&#xff0c;主要用于事务回滚和 MVCC。 redo log&#xff08;重做日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现…

VTK知识学习(8)-坐标系统

1、概述 计算机图形学里常用的坐标系统有4种&#xff1a; 1&#xff09;、Model坐标系统。定义模型时所采用的坐标系统&#xff0c;通常是局部的笛卡儿坐标系。 2&#xff09;、World坐标系统。是放置Actor的三维空间坐标系。 Actor&#xff08;vtkActor类&am…

「QT」窗口类 之 QWidget 窗口基类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中&#xff0c;在集群master-1上安装了dockerharbor&#xff0c;却发现master-1节点NotReady&#xff0c;使用的网络插件为 Cilium #安装docker和harbor&#xff08;docker运行正常&#xff09; rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

干货分享之Python爬虫与代理

嗨伙伴们&#xff0c;今天是干货分享哦&#xff0c;可千万不要错过。今天小蝌蚪教大家使用phthon时学会巧妙借用代理ip来更好地完成任务。 让我们先了解一下为什么说咱们要用爬虫代理ip呢&#xff0c;那是因为很多网站为了防止有人过度爬取数据&#xff0c;对自身资源造成损害…

【JavaEE初阶 — 多线程】死锁的产生原因和解决方法

目录 死锁 1.构成死锁的场景 (1) 一个线程一把锁 问题描述 解决方案(可重入锁) (2) 两个线程两把锁 问题描述 (3)N个线程 M把锁 哲学家就餐问题 2.死锁的四个必要条件 3.如何解决死锁问题 (1)避免出现请求和保持 (2)打破多个线程的循环等待关系 死锁…

【视觉SLAM】1-概述

读书笔记 文章目录 1. 经典视觉SLAM框架2. 数学表述2.1 运动方程2.2 观测方程2.3 问题抽象 1. 经典视觉SLAM框架 传感器信息读取&#xff1a;相机图像、IMU等多源数据&#xff1b;前端视觉里程计&#xff08;Visual Odometry&#xff0c;VO&#xff09;&#xff1a;估计相机的相…

探索 Python HTTP 的瑞士军刀:Requests 库

文章目录 探索 Python HTTP 的瑞士军刀&#xff1a;Requests 库第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests 库是什么&#xff1f;第三部分&#xff1a;如何安装 Requests 库&#xff1f;第四部分&#xff1a;Requests 库的基本函数使用方法第五部分&#xff1a…

Redisson的可重入锁

初始状态&#xff1a; 表示系统或资源在没有线程持有锁的情况下的状态&#xff0c;任何线程都可以尝试获取锁。 线程 1 获得锁&#xff1a; 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁&#xff1a; 在持有锁的情况下&#xff0c;线程 1 再次请求锁&a…

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)

摘 要 互联网发展至今&#xff0c;广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳动强度大&#xff0c;费时费力…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…

从0学习React(11)

1. 引言 上个星期的工作内容是写IT资产管理的前端页面。其实&#xff0c;尽管我之前有一些前端开发的经验&#xff0c;但并不是很多。这次让我独立完成一个页面的开发&#xff0c;刚开始时我感到无从下手。 2. 初期的困惑和焦虑 我记得在星期一和星期二的时候&#xff0c;那…

BILSTM法律网站用户提问自动分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

unity 一个物体随键盘上下左右旋转和前进的脚本

注意&#xff1a;脚本挂在gamaobject 上面 &#xff0c;操作对象的目标 this.gameObject 为操作对象 using System.Collections; using System.Collections.Generic; using UnityEngine;public class changePosition : MonoBehaviour {//操作对象的目标 this.gameObject 为操…