Python程序设计教程经典实战教程练习一到四接着上面教程练习五文件与异常处理目标掌握文件的读写操作open()、read()、write()以及异常处理try...except...finally的基本用法这是处理外部数据和确保程序健壮性的关键。经典题型9日记本程序情景创建一个简单的命令行日记本可以追加新的日记内容并可以查看所有历史日记。知识点文件追加写入a模式、文件读取、with语句自动管理文件资源、日期时间处理。代码# 练习5-1简易命令行日记本 # 核心使用文件存储数据with语句确保文件正确关闭datetime模块记录时间。 import datetime # 导入日期时间模块用于获取当前时间 DIARY_FILE my_diary.txt # 定义存储日记的文件名 def write_diary(): 向日记文件中追加写入一条新日记。 # 获取当前日期和时间并格式化为易读的字符串 current_time datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) print(f当前时间{current_time}) # 获取用户输入的日记内容 content input(请输入今天的日记内容)# 使用with语句和a追加模式打开文件encodingutf-8确保中文正常读写 # with语句会在代码块执行完毕后自动关闭文件即使发生异常也是如此 with open(DIARY_FILE, a, encodingutf-8) as f: # 将时间和内容写入文件用于换行f.write(f[{current_time}]{content}{*40})print(日记已保存)def read_diary(): 读取并打印日记文件中的所有内容。 try: # 使用with语句和r只读模式打开文件 with open(DIARY_FILE, r, encodingutf-8) as f: diary_content f.read() # 一次性读取全部内容 if diary_content: print( 我的日记 ) print(diary_content) else: print(日记本是空的快去写点东西吧) except FileNotFoundError: # 捕获文件不存在的异常 print(日记文件不存在你还没有写过日记哦。)def main(): 主程序提供交互菜单。 while True: print(写日记)print(2. 看日记)print(3. 退出)choice input(请选择操作 (1/2/3): )if choice 1: write_diary() elif choice 2: read_diary() elif choice 3: print(再见) break else: print(输入无效请重新选择。)ifname main:main()经典题型10学生成绩文件分析器情景从一个格式化的文本文件例如每行是“姓名,成绩”中读取多个学生的成绩计算平均分、最高分、最低分并将统计结果写入另一个文件。知识点文件逐行读取readlines()、字符串分割split()、列表推导式、异常处理。代码# 练习5-2学生成绩文件分析器 # 核心文件I/O、数据清洗、基本统计、异常处理确保程序健壮性。 INPUT_FILE scores.txt # 假设的输入文件格式张三,85 OUTPUT_FILE statistics.txt def analyze_scores(): 从输入文件读取成绩计算统计信息并写入输出文件。 scores [] # 用于存储所有成绩的列表 names [] # 用于存储所有姓名的列表 try: # 1. 读取数据 with open(INPUT_FILE, r, encodingutf-8) as f: lines f.readlines() # 读取所有行返回一个列表 if not lines: print(输入文件为空。) return # 2. 处理每一行数据 for line_num, line in enumerate(lines, start1): line line.strip() # 去除首尾空白字符如换行符 if not line: # 跳过空行 continue try: # 按逗号分割期望得到两个部分 parts line.split(,) if len(parts) ! 2: print(f警告第{line_num}行格式错误{line}已跳过。) continue name, score_str parts score float(score_str) # 将成绩字符串转换为浮点数 names.append(name) scores.append(score) except ValueError as e: # 捕获转换数字时的错误 print(f警告第{line_num}行数据无效{line}错误{e}已跳过。) continue if not scores: # 检查是否有有效数据 print(没有找到有效的成绩数据。) return # 3. 计算统计信息 average_score sum(scores) / len(scores) max_score max(scores) min_score min(scores) max_index scores.index(max_score) # 找到最高分在列表中的位置 min_index scores.index(min_score) # 找到最低分在列表中的位置 # 4. 准备输出内容 result_content f成绩统计分析报告 总人数{len(scores)} 平均分{average_score:.2f} 最高分{max_score} {names[max_index]} 最低分{min_score} {names[min_index]} 详细成绩单 for name, score in zip(names, scores): result_content f{name}: {score}# 5. 写入输出文件 with open(OUTPUT_FILE, w, encodingutf-8) as f: f.write(result_content) print(f分析完成结果已保存至 {OUTPUT_FILE}。) except FileNotFoundError: print(f错误找不到输入文件 {INPUT_FILE}请确保文件存在。) except IOError as e: print(f文件读写时发生错误{e}) # 执行分析函数 analyze_scores() 练习六模块与包目标理解如何创建、导入和使用自定义模块与第三方包学会使用pip管理依赖并了解if __name__ __main__:的作用。经典题型11自定义几何计算模块情景创建一个名为geometry.py的模块其中包含计算圆形和矩形面积的函数。然后在主程序中导入并使用它。知识点模块创建、函数定义、模块导入、if __name__ __main__:的测试用途。代码geometry.py(自定义模块文件):# geometry.py - 几何计算模块 # 练习6-1自定义模块示例 # 核心将相关功能封装在模块中提高代码复用性和可维护性。 PI 3.141592653589793 # 定义模块级常量 def circle_area(radius): 计算圆的面积。 参数: radius (float): 圆的半径。 返回: float: 圆的面积。 if radius 0: raise ValueError(半径不能为负数) return PI * radius ** 2 def rectangle_area(length, width): 计算矩形的面积。 参数: length (float): 矩形的长。 width (float): 矩形的宽。 返回: float: 矩形的面积。 if length 0 or width 0: raise ValueError(长和宽不能为负数) return length * width # 以下代码仅当直接运行此模块时执行被导入时不执行。 # 常用于模块的自我测试。 if __name__ __main__: # 模块自测代码 print(正在运行 geometry 模块自测...) print(f半径为5的圆面积: {circle_area(5):.2f}) print(f长为4宽为6的矩形面积: {rectangle_area(4, 6)}) try: circle_area(-1) except ValueError as e: print(f测试异常捕获: {e})main_program.py(主程序文件):# main_program.py - 主程序 # 练习6-1使用自定义模块 # 核心使用import语句导入模块并使用其功能。 # 导入整个geometry模块 import geometry # 使用模块名作为前缀调用函数 my_circle_area geometry.circle_area(3) print(f半径为3的圆面积是: {my_circle_area:.2f}) my_rect_area geometry.rectangle_area(5, 10) print(f长为5宽为10的矩形面积是: {my_rect_area}) # 也可以从模块中导入特定的函数或常量 from geometry import PI, circle_area print(f从geometry模块导入的PI值是: {PI}) print(f再次计算圆面积: {circle_area(7):.2f})经典题型12使用第三方库requests获取网络数据情景安装并使用第三方requests库从一个公共API如JSONPlaceholder获取模拟的待办事项todos数据并解析显示。知识点使用pip安装包、导入第三方库、发送HTTP GET请求、处理JSON响应。代码# 练习6-2使用第三方库requests获取网络数据 # 核心掌握pip install requests理解API调用和JSON数据解析。 # 注意运行前需在命令行执行 pip install requests import requests # 导入第三方requests库 def fetch_todos(): 从JSONPlaceholder API获取待办事项列表。 api_url https://jsonplaceholder.typicode.com/todos try: # 发送HTTP GET请求 print(f正在从 {api_url} 获取数据...) response requests.get(api_url) # 检查请求是否成功 (状态码200表示成功) response.raise_for_status() # 如果状态码不是200将抛出HTTPError异常 # 将响应的JSON字符串解析为Python列表/字典 todos response.json() print(f成功获取到 {len(todos)} 条待办事项。) print(--- 前5条待办事项 ---)# 遍历并打印前5条数据 for i, todo in enumerate(todos[:5], 1): # todo是一个字典包含userId, id, title, completed等键 status 已完成 if todo[completed] else 未完成 print(f{i}. [用户{todo[userId]}] {todo[title]} - {status}) # 额外统计已完成的数量 completed_count sum(1 for todo in todos if todo[completed]) print(f统计总共{len(todos)}条中有{completed_count}条已完成。)except requests.exceptions.ConnectionError: print(错误网络连接失败请检查网络。) except requests.exceptions.Timeout: print(错误请求超时。) except requests.exceptions.HTTPError as err: print(fHTTP错误{err}) except ValueError: # 捕获JSON解析错误 print(错误服务器返回的数据不是有效的JSON格式。) except Exception as e: # 捕获其他未知异常 print(f发生未知错误{e}) if __name__ __main__: fetch_todos() 练习七面向对象编程 (OOP) 基础目标理解类与对象的概念掌握定义类、__init__初始化方法、实例属性和方法以及基本的继承。经典题型13银行账户类模拟情景创建一个BankAccount类模拟银行账户的基本操作开户、存款、取款、查询余额。知识点类定义、__init__构造器、实例方法、封装。代码# 练习7-1银行账户类模拟 # 核心类与对象的创建使用__init__初始化对象状态方法封装业务逻辑。 class BankAccount: 一个简单的银行账户类。 def __init__(self, account_holder, initial_balance0.0): 初始化一个新的银行账户。 参数: account_holder (str): 账户持有者姓名。 initial_balance (float): 初始余额默认为0.0。 self.account_holder account_holder # 实例属性账户名 self.__balance initial_balance # 实例属性余额。以双下划线开头表示“私有”属性名称修饰建议不直接访问。 print(f账户 {account_holder} 已创建初始余额: {initial_balance:.2f}) def deposit(self, amount): 存款。 参数: amount (float): 存款金额必须为正数。 返回: bool: 存款成功返回True否则返回False。 if amount 0: self.__balance amount print(f成功存入 {amount:.2f}。当前余额: {self.__balance:.2f}) return True else: print(存款金额必须大于0) return False def withdraw(self, amount): 取款。 参数: amount (float): 取款金额必须为正数且不超过余额。 返回: bool: 取款成功返回True否则返回False。 if amount 0: print(取款金额必须大于0) return False elif amount self.__balance: print(f取款失败余额不足。当前余额: {self.__balance:.2f}) return False else: self.__balance - amount print(f成功取出 {amount:.2f}。当前余额: {self.__balance:.2f}) return True def get_balance(self): 查询当前余额。 return self.__balance def display_info(self): 显示账户信息。 print(f账户持有人: {self.account_holder}) print(f当前余额: {self.get_balance():.2f}) # 测试BankAccount类 if __name__ __main__: # 1. 创建对象开户 account1 BankAccount(张三, 1000) print(- * 30) # 2. 存款 account1.deposit(500) # 3. 取款 (成功) account1.withdraw(200) # 4. 取款 (失败余额不足) account1.withdraw(2000) print(- * 30) # 5. 查询余额 print(f通过方法查询余额: {account1.get_balance():.2f}) print(- * 30) # 6. 显示完整信息 account1.display_info()经典题型14继承与多态——图形类情景定义一个基类Shape图形并派生出Rectangle矩形和Circle圆形子类实现计算面积和周长的多态方法。知识点类继承、方法重写、多态。代码# 练习7-2继承与多态——图形类 # 核心父类定义通用接口方法子类继承并实现具体逻辑实现多态。 import math class Shape: 图形的基类。 def area(self): 计算面积。子类必须重写此方法。 raise NotImplementedError(子类必须实现 area() 方法) def perimeter(self): 计算周长。子类必须重写此方法。 raise NotImplementedError(子类必须实现 perimeter() 方法) def describe(self): 描述图形。这是一个具体方法子类可以继承或重写。 return f我是一个图形。 class Rectangle(Shape): 矩形类继承自Shape。 def __init__(self, width, height): self.width width self.height height def area(self): # 重写父类方法 return self.width * self.height def perimeter(self): # 重写父类方法 return 2 * (self.width self.height) def describe(self): # 重写父类方法提供更具体的描述 return f我是一个矩形宽{self.width}高{self.height}。 class Circle(Shape): 圆形类继承自Shape。 def __init__(self, radius): self.radius radius def area(self): # 重写父类方法 return math.pi * self.radius ** 2 def perimeter(self): # 重写父类方法 (圆的周长) return 2 * math.pi * self.radius def describe(self): # 重写父类方法 return f我是一个圆形半径{self.radius}。 # 测试多态性 if __name__ __main__: # 创建一个矩形和一个圆形对象 shapes [Rectangle(5, 3), Circle(4)] for shape in shapes: print(shape.describe()) # 调用各自重写的describe方法 # 尽管变量shape在编译时是Shape类型但运行时调用的是子类重写的方法这就是多态。 print(f 面积: {shape.area():.2f}) print(f 周长/周长: {shape.perimeter():.2f}) print(- * 40)练习八高级数据结构与算法初探目标接触列表推导式、集合、生成器等进阶特性并实现简单的算法如冒泡排序。经典题型15列表推导式与集合操作情景使用列表推导式快速生成列表并使用集合进行去重和集合运算。知识点列表推导式、集合set的创建与操作交集、并集、差集。代码# 练习8-1列表推导式与集合操作 # 核心列表推导式是生成列表的简洁方式集合用于存储无序不重复元素。 # --- 列表推导式示例 --- print( 列表推导式 ) # 1. 生成0-9的平方列表 squares [x**2 for x in range(10)] print(f0-9的平方列表: {squares}) # 2. 生成一个列表中所有偶数的列表 numbers [1, 4, 2, 7, 9, 10, 15, 22] evens [num for num in numbers if num % 2 0] print(f列表{numbers}中的偶数: {evens}) # 3. 将字符串列表转换为大写并过滤掉长度小于4的单词 words [apple, cat, banana, dog, elephant] filtered_words [word.upper() for word in words if len(word) 4] print(f原单词列表: {words}) print(f转换并过滤后: {filtered_words}) # --- 集合操作示例 --- print( 集合操作 )# 创建两个集合set_a {1, 2, 3, 4, 5}set_b {4, 5, 6, 7, 8}print(f集合 A: {set_a})print(f集合 B: {set_b})# 并集包含所有出现在A或B中的元素 union_set set_a | set_b # 或使用 set_a.union(set_b) print(f并集 (A | B): {union_set}) # 交集包含同时出现在A和B中的元素 intersection_set set_a set_b # 或使用 set_a.intersection(set_b) print(f交集 (A B): {intersection_set}) # 差集包含在A中但不在B中的元素 difference_set set_a - set_b # 或使用 set_a.difference(set_b) print(f差集 (A - B): {difference_set}) # 对称差集包含只在A或只在B中的元素去除交集 symmetric_diff_set set_a ^ set_b # 或使用 set_a.symmetric_difference(set_b) print(f对称差集 (A ^ B): {symmetric_diff_set}) # 集合去重实用示例 print( 集合去重 )duplicate_list [1, 2, 2, 3, 4, 4, 4, 5, 1]unique_set set(duplicate_list) # 转换为集合自动去重unique_list_back list(unique_set) # 如果需要再转换回列表但会失去原顺序print(f原始列表: {duplicate_list})print(f去重后的集合: {unique_set})print(f去重后的列表无序: {unique_list_back})# 如需保持顺序可以使用dict.fromkeys()技巧Python 3.7字典保持插入顺序ordered_unique_list list(dict.fromkeys(duplicate_list))print(f去重后的列表保持顺序: {ordered_unique_list})经典题型16冒泡排序算法实现与生成器情景手动实现冒泡排序算法对列表进行排序并使用生成器函数按顺序产生斐波那契数列。知识点算法实现嵌套循环、生成器yield。代码# 练习8-2冒泡排序与生成器 # 核心理解基础排序算法逻辑掌握生成器惰性求值的特性。 # --- 冒泡排序实现 --- def bubble_sort(arr): 使用冒泡排序算法对列表进行原地升序排序。 参数: arr (list): 待排序的列表。 返回: list: 排序后的列表原列表已被修改。 n len(arr) # 外层循环控制排序的轮数最多需要n-1轮 for i in range(n - 1): swapped False # 标志位记录本轮是否发生交换 # 内层循环进行相邻元素的比较和交换 # 每轮结束后最大的元素会“冒泡”到末尾所以内层循环范围逐渐减小 for j in range(0, n - i - 1): if arr[j] arr[j 1]: # 交换元素 arr[j], arr[j 1] arr[j 1], arr[j] swapped True # 如果本轮没有发生任何交换说明列表已有序提前结束 if not swapped: break print(f第{i1}轮后: {arr}) # 打印每轮排序后的中间结果 return arr print( 冒泡排序 ) test_list [64, 34, 25, 12, 22, 11, 90] print(f排序前: {test_list}) sorted_list bubble_sort(test_list.copy()) # 使用copy()防止原列表被修改 print(f排序后: {sorted_list}) # --- 生成器斐波那契数列 --- def fibonacci_generator(limit): 生成斐波那契数列的生成器直到值超过limit为止。 参数: limit (int): 生成斐波那契数的上限。 生成: int: 下一个斐波那契数。 a, b 0, 1 # 初始化前两个数 while a limit: yield a # 使用yield产生一个值并暂停函数执行 a, b b, a b # 更新a和b的值为下一次yield做准备 print( 斐波那契数列生成器 )print(小于等于100的斐波那契数:)# 使用for循环迭代生成器for num in fibonacci_generator(100):print(num, end )print() # 换行# 生成器是惰性的可以按需获取值 print(--- 手动获取生成器的值 ---)fib_gen fibonacci_generator(50) # 创建生成器对象print(f第一次调用next(): {next(fib_gen)}) # 输出 0print(f第二次调用next(): {next(fib_gen)}) # 输出 1print(f第三次调用next(): {next(fib_gen)}) # 输出 1print(f第四次调用next(): {next(fib_gen)}) # 输出 2# 继续迭代直到耗尽print(f剩余的值: {list(fib_gen)}) # 将生成器中剩余的值转换为列表参考来源Python基础 - 程序中的注释 单行注释与多行注释python程序设计基础第二版pdf下载_Python程序设计基础董付国课后答案-Python程序设计基础第二版清华大学出版社PDF电子版完整高清版-精品下载...python编程入门与案例详解pdf-这些年我读过的技术经典图书(附电子版下载地址)...python编程入门与案例详解pdf-这些年我读过的技术经典图书(附电子版下载地址)...python编程入门与案例详解pdf-这些年我读过的技术经典图书(附电子版下载地址)...python编程入门与案例详解pdf-这些年我读过的技术经典图书(附电子版下载地址)...