【Python练习题】Python小白必练100题答案-第81-97题
练习题 | 直达链接 |
---|---|
Python小白必练100题答案-第1-20题 | 点我直达 |
Python小白必练100题答案-第21-40题 | 点我直达 |
Python小白必练100题答案-第41-60题 | 点我直达 |
Python小白必练100题答案-第61-80题 | 点我直达 |
Python小白必练100题答案-第81-97题 | 点我直达 |
目录
|
专栏导读
🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注
👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅
🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅
📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅
文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
❤️ 欢迎各位佬关注! ❤️
文件操作与异常处理
第81题:文件读取
题目: 读取文本文件并统计行数、字符数
答案:
def analyze_file(filename):"""分析文件内容"""try:with open(filename, 'r', encoding='utf-8') as file:lines = file.readlines()line_count = len(lines)char_count = sum(len(line) for line in lines)word_count = sum(len(line.split()) for line in lines)print(f"文件: {filename}")print(f"行数: {line_count}")print(f"字符数: {char_count}")print(f"单词数: {word_count}")return {'lines': line_count,'characters': char_count,'words': word_count}except FileNotFoundError:print(f"文件 {filename} 不存在")return Noneexcept Exception as e:print(f"读取文件时出错: {e}")return None# 创建测试文件
with open('test.txt', 'w', encoding='utf-8') as f:f.write("Hello World\n")f.write("Python Programming\n")f.write("File Operations")# 分析文件
result = analyze_file('test.txt')
输出示例:
文件: test.txt
行数: 3
字符数: 37
单词数: 5
知识点: 文件读取、异常处理、字符串操作
第82题:文件写入
题目: 将数据写入文件,支持追加模式
答案:
class FileWriter:def __init__(self, filename):self.filename = filenamedef write_data(self, data, mode='w'):"""写入数据到文件"""try:with open(self.filename, mode, encoding='utf-8') as file:if isinstance(data, list):for item in data:file.write(str(item) + '\n')else:file.write(str(data) + '\n')print(f"数据已{'追加' if mode == 'a' else '写入'}到 {self.filename}")return Trueexcept Exception as e:print(f"写入文件失败: {e}")return Falsedef append_data(self, data):"""追加数据到文件"""return self.write_data(data, 'a')def read_file(self):"""读取文件内容"""try:with open(self.filename, 'r', encoding='utf-8') as file:content = file.read()print(f"文件内容:\n{content}")return contentexcept FileNotFoundError:print(f"文件 {self.filename} 不存在")return None# 演示文件写入
writer = FileWriter('output.txt')# 写入初始数据
writer.write_data(['第一行数据', '第二行数据', '第三行数据'])# 追加数据
writer.append_data('追加的数据')
writer.append_data(['更多追加数据1', '更多追加数据2'])# 读取文件
writer.read_file()
输出示例:
数据已写入到 output.txt
数据已追加到 output.txt
数据已追加到 output.txt
文件内容:
第一行数据
第二行数据
第三行数据
追加的数据
更多追加数据1
更多追加数据2
知识点: 文件写入、追加模式、类的设计
第83题:CSV文件处理
题目: 读写CSV文件,处理表格数据
答案:
import csv
from datetime import datetimeclass CSVProcessor:def __init__(self, filename):self.filename = filenamedef write_csv(self, data, headers=None):"""写入CSV文件"""try:with open(self.filename, 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)if headers:writer.writerow(headers)for row in data:writer.writerow(row)print(f"CSV文件 {self.filename} 写入成功")return Trueexcept Exception as e:print(f"写入CSV失败: {e}")return Falsedef read_csv(self):"""读取CSV文件"""try:with open(self.filename, 'r', encoding='utf-8') as file:reader = csv.reader(file)data = list(reader)print(f"CSV文件 {self.filename} 读取成功,共 {len(data)} 行")return dataexcept FileNotFoundError:print(f"CSV文件 {self.filename} 不存在")return Noneexcept Exception as e:print(f"读取CSV失败: {e}")return Nonedef filter_data(self, column_index, value):"""根据列值过滤数据"""data = self.read_csv()if not data:return []filtered = []for row in data:if len(row) > column_index and row[column_index] == value:filtered.append(row)print(f"过滤结果: 找到 {len(filtered)} 条匹配记录")return filtered# 演示CSV处理
processor = CSVProcessor('students.csv')# 准备学生数据
headers = ['姓名', '年龄', '成绩', '班级']
student_data = [['张三', '20', '85', '计算机1班'],['李四', '21', '92', '计算机1班'],['王五', '19', '78', '计算机2班'],['赵六', '20', '88', '计算机2班'],['钱七', '22', '95', '计算机1班']
]# 写入CSV
processor.write_csv(student_data, headers)# 读取CSV
all_data = processor.read_csv()
print("\n所有数据:")
for row in all_data:print(row)# 过滤数据
print("\n计算机1班学生:")
class1_students = processor.filter_data(3, '计算机1班')
for student in class1_students:print(student)
输出示例:
CSV文件 students.csv 写入成功
CSV文件 students.csv 读取成功,共 6 行所有数据:
['姓名', '年龄', '成绩', '班级']
['张三', '20', '85', '计算机1班']
['李四', '21', '92', '计算机1班']
['王五', '19', '78', '计算机2班']
['赵六', '20', '88', '计算机2班']
['钱七', '22', '95', '计算机1班']计算机1班学生:
过滤结果: 找到 3 条匹配记录
['张三', '20', '85', '计算机1班']
['李四', '21', '92', '计算机1班']
['钱七', '22', '95', '计算机1班']
知识点: CSV文件处理、数据过滤、文件读写
第84题:JSON数据处理
题目: 处理JSON格式数据的读写和解析
答案:
import json
from datetime import datetimeclass JSONProcessor:def __init__(self, filename):self.filename = filenamedef save_json(self, data):"""保存数据为JSON文件"""try:with open(self.filename, 'w', encoding='utf-8') as file:json.dump(data, file, ensure_ascii=False, indent=2)print(f"JSON数据已保存到 {self.filename}")return Trueexcept Exception as e:print(f"保存JSON失败: {e}")return Falsedef load_json(self):"""从JSON文件加载数据"""try:with open(self.filename, 'r', encoding='utf-8') as file:data = json.load(file)print(f"JSON数据已从 {self.filename} 加载")return dataexcept FileNotFoundError:print(f"JSON文件 {self.filename} 不存在")return Noneexcept json.JSONDecodeError as e:print(f"JSON格式错误: {e}")return Noneexcept Exception as e:print(f"加载JSON失败: {e}")return Nonedef update_json(self, key, value):"""更新JSON数据中的特定键值"""data = self.load_json()if data is None:data = {}data[key] = valuereturn self.save_json(data)def search_json(self, key):"""在JSON数据中搜索键"""data = self.load_json()if not data:return Nonedef search_recursive(obj, target_key):results = []if isinstance(obj, dict):for k, v in obj.items():if k == target_key:results.append(v)elif isinstance(v, (dict, list)):results.extend(search_recursive(v, target_key))elif isinstance(obj, list):for item in obj:if isinstance(item, (dict, list)):results.extend(search_recursive(item, target_key))return resultsresults = search_recursive(data, key)print(f"搜索键 '{key}' 找到 {len(results)} 个结果")return results# 演示JSON处理
processor = JSONProcessor('config.json')# 创建配置数据
config_data = {"应用设置": {"名称": "我的应用","版本": "1.0.0","调试模式": True},"数据库配置": {"主机": "localhost","端口": 3306,"用户名": "admin","数据库名": "myapp"},"用户列表": [{"姓名": "张三", "角色": "管理员"},{"姓名": "李四", "角色": "用户"}],"创建时间": datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}# 保存JSON
processor.save_json(config_data)# 加载JSON
loaded_data = processor.load_json()
print("\n加载的配置:")
print(json.dumps(loaded_data, ensure_ascii=False, indent=2))# 更新配置
processor.update_json("最后修改", datetime.now().strftime('%Y-%m-%d %H:%M:%S'))# 搜索特定键
names = processor.search_json("姓名")
print(f"\n找到的姓名: {names}")
输出示例:
JSON数据已保存到 config.json
JSON数据已从 config.json 加载加载的配置:
{"应用设置": {"名称": "我的应用","版本": "1.0.0","调试模式": true},"数据库配置": {"主机": "localhost","端口": 3306,"用户名": "admin","数据库名": "myapp"},"用户列表": [{"姓名": "张三","角色": "管理员"},{"姓名": "李四","角色": "用户"}],"创建时间": "2024-01-15 10:30:45"
}JSON数据已从 config.json 加载
JSON数据已保存到 config.json
搜索键 '姓名' 找到 2 个结果找到的姓名: ['张三', '李四']
知识点: JSON数据处理、递归搜索、数据序列化
第85题:异常处理
题目: 实现完整的异常处理机制
答案:
class Calculator:def __init__(self):self.history = []def divide(self, a, b):"""除法运算,包含异常处理"""try:if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):raise TypeError("参数必须是数字类型")if b == 0:raise ZeroDivisionError("除数不能为零")result = a / bself.history.append(f"{a} ÷ {b} = {result}")return resultexcept TypeError as e:print(f"类型错误: {e}")return Noneexcept ZeroDivisionError as e:print(f"数学错误: {e}")return Noneexcept Exception as e:print(f"未知错误: {e}")return Nonefinally:print(f"计算完成,历史记录数: {len(self.history)}")def safe_input(self, prompt):"""安全的用户输入"""while True:try:value = input(prompt)return float(value)except ValueError:print("请输入有效的数字")except KeyboardInterrupt:print("\n用户取消输入")return Noneexcept EOFError:print("\n输入结束")return Nonedef batch_calculate(self, operations):"""批量计算"""results = []errors = []for i, (a, b) in enumerate(operations):try:result = self.divide(a, b)if result is not None:results.append((i, a, b, result))else:errors.append((i, a, b, "计算失败"))except Exception as e:errors.append((i, a, b, str(e)))print(f"\n批量计算完成:")print(f"成功: {len(results)} 个")print(f"失败: {len(errors)} 个")if errors:print("\n错误详情:")for idx, a, b, error in errors:print(f" 操作 {idx}: {a} ÷ {b} -> {error}")return results, errors# 演示异常处理
calc = Calculator()print("异常处理演示:")# 正常计算
print("\n1. 正常计算:")
result1 = calc.divide(10, 2)
print(f"结果: {result1}")# 除零错误
print("\n2. 除零错误:")
result2 = calc.divide(10, 0)
print(f"结果: {result2}")# 类型错误
print("\n3. 类型错误:")
result3 = calc.divide("10", 2)
print(f"结果: {result3}")# 批量计算
print("\n4. 批量计算:")
operations = [(10, 2), # 正常(15, 3), # 正常(20, 0), # 除零错误("abc", 5), # 类型错误(100, 4) # 正常
]results, errors = calc.batch_calculate(operations)print("\n成功的计算:")
for idx, a, b, result in results:print(f" {a} ÷ {b} = {result}")
输出示例:
异常处理演示:1. 正常计算:
计算完成,历史记录数: 1
结果: 5.02. 除零错误:
数学错误: 除数不能为零
计算完成,历史记录数: 1
结果: None3. 类型错误:
类型错误: 参数必须是数字类型
计算完成,历史记录数: 1
结果: None4. 批量计算:
计算完成,历史记录数: 2
计算完成,历史记录数: 2
数学错误: 除数不能为零
计算完成,历史记录数: 2
类型错误: 参数必须是数字类型
计算完成,历史记录数: 2
计算完成,历史记录数: 3批量计算完成:
成功: 3 个
失败: 2 个错误详情:操作 2: 20 ÷ 0 -> 计算失败操作 3: abc ÷ 5 -> 计算失败成功的计算:10 ÷ 2 = 5.015 ÷ 3 = 5.0100 ÷ 4 = 25.0
知识点: 异常处理、try-except-finally、自定义异常、批量处理
高级应用与综合项目
第86题:自定义异常
题目: 创建自定义异常类
答案:
# 自定义异常类
class InvalidAgeError(Exception):"""年龄无效异常"""def __init__(self, age, message="年龄必须在0-150之间"):self.age = ageself.message = messagesuper().__init__(self.message)def __str__(self):return f"InvalidAgeError: 年龄 {self.age} 无效 - {self.message}"class InsufficientFundsError(Exception):"""余额不足异常"""def __init__(self, balance, amount):self.balance = balanceself.amount = amountself.message = f"余额不足:当前余额 {balance},尝试提取 {amount}"super().__init__(self.message)class Person:def __init__(self, name, age):self.name = nameself.set_age(age)def set_age(self, age):"""设置年龄,包含验证"""if not isinstance(age, int):raise InvalidAgeError(age, "年龄必须是整数")if age < 0:raise InvalidAgeError(age, "年龄不能为负数")if age > 150:raise InvalidAgeError(age, "年龄不能超过150岁")self.age = ageprint(f"{self.name} 的年龄设置为 {age} 岁")class BankAccount:def __init__(self, owner, initial_balance=0):self.owner = ownerself.balance = initial_balancedef withdraw(self, amount):"""提取资金"""if amount <= 0:raise ValueError("提取金额必须大于0")if amount > self.balance:raise InsufficientFundsError(self.balance, amount)self.balance -= amountprint(f"成功提取 {amount} 元,余额: {self.balance} 元")return self.balancedef deposit(self, amount):"""存入资金"""if amount <= 0:raise ValueError("存入金额必须大于0")self.balance += amountprint(f"成功存入 {amount} 元,余额: {self.balance} 元")return self.balance# 演示自定义异常
print("自定义异常演示:")# 测试年龄异常
print("\n1. 年龄验证:")
try:person1 = Person("张三", 25) # 正常person2 = Person("李四", -5) # 负数年龄
except InvalidAgeError as e:print(f"捕获异常: {e}")try:person3 = Person("王五", 200) # 超龄
except InvalidAgeError as e:print(f"捕获异常: {e}")try:person4 = Person("赵六", "abc") # 非整数
except InvalidAgeError as e:print(f"捕获异常: {e}")# 测试银行账户异常
print("\n2. 银行账户操作:")
account = BankAccount("张三", 1000)try:account.deposit(500) # 正常存款account.withdraw(200) # 正常提款account.withdraw(2000) # 余额不足
except InsufficientFundsError as e:print(f"捕获异常: {e}")
except ValueError as e:print(f"值错误: {e}")try:account.withdraw(-100) # 负数提款
except ValueError as e:print(f"值错误: {e}")
输出示例:
自定义异常演示:1. 年龄验证:
张三 的年龄设置为 25 岁
捕获异常: InvalidAgeError: 年龄 -5 无效 - 年龄不能为负数
捕获异常: InvalidAgeError: 年龄 200 无效 - 年龄不能超过150岁
捕获异常: InvalidAgeError: 年龄 abc 无效 - 年龄必须是整数2. 银行账户操作:
成功存入 500 元,余额: 1500 元
成功提取 200 元,余额: 1300 元
捕获异常: 余额不足:当前余额 1300,尝试提取 2000
值错误: 提取金额必须大于0
知识点: 自定义异常类、异常继承、异常信息定制
第87题:上下文管理器
题目: 实现文件操作的上下文管理器
答案:
import os
import shutil
from contextlib import contextmanagerclass FileManager:"""文件管理上下文管理器"""def __init__(self, filename, mode='r', encoding='utf-8'):self.filename = filenameself.mode = modeself.encoding = encodingself.file = Nonedef __enter__(self):print(f"打开文件: {self.filename}")try:self.file = open(self.filename, self.mode, encoding=self.encoding)return self.fileexcept Exception as e:print(f"打开文件失败: {e}")raisedef __exit__(self, exc_type, exc_value, traceback):if self.file:print(f"关闭文件: {self.filename}")self.file.close()if exc_type:print(f"发生异常: {exc_type.__name__}: {exc_value}")return False # 不抑制异常print("文件操作完成")return True@contextmanager
def safe_file_copy(source, destination):"""安全文件复制上下文管理器"""backup_file = Nonetry:# 如果目标文件存在,先备份if os.path.exists(destination):backup_file = destination + '.backup'shutil.copy2(destination, backup_file)print(f"已备份原文件到: {backup_file}")print(f"开始复制: {source} -> {destination}")yield source, destination# 复制成功,删除备份if backup_file and os.path.exists(backup_file):os.remove(backup_file)print("删除备份文件")print("文件复制成功")except Exception as e:print(f"复制失败: {e}")# 恢复备份if backup_file and os.path.exists(backup_file):if os.path.exists(destination):os.remove(destination)shutil.move(backup_file, destination)print("已恢复原文件")raiseclass DatabaseConnection:"""数据库连接模拟器"""def __init__(self, db_name):self.db_name = db_nameself.connected = Falseself.transaction_active = Falsedef __enter__(self):print(f"连接到数据库: {self.db_name}")self.connected = Trueself.transaction_active = Truereturn selfdef __exit__(self, exc_type, exc_value, traceback):if exc_type:print(f"发生错误,回滚事务: {exc_value}")self.rollback()else:print("提交事务")self.commit()print(f"断开数据库连接: {self.db_name}")self.connected = Falseself.transaction_active = Falsedef execute(self, sql):if not self.connected:raise RuntimeError("数据库未连接")print(f"执行SQL: {sql}")# 模拟SQL执行if "ERROR" in sql.upper():raise RuntimeError("SQL执行错误")return "执行成功"def commit(self):if self.transaction_active:print("事务已提交")def rollback(self):if self.transaction_active:print("事务已回滚")# 演示上下文管理器
print("上下文管理器演示:")# 1. 文件管理器
print("\n1. 文件管理器:")
with FileManager('test_context.txt', 'w') as f:f.write("这是测试内容\n")f.write("使用上下文管理器\n")# 读取文件
with FileManager('test_context.txt', 'r') as f:content = f.read()print(f"文件内容: {content.strip()}")# 2. 安全文件复制
print("\n2. 安全文件复制:")
try:with safe_file_copy('test_context.txt', 'copy_test.txt') as (src, dst):shutil.copy2(src, dst)
except Exception as e:print(f"复制异常: {e}")# 3. 数据库连接
print("\n3. 数据库连接 - 正常操作:")
with DatabaseConnection('test_db') as db:db.execute("SELECT * FROM users")db.execute("INSERT INTO users VALUES (1, 'Alice')")print("\n4. 数据库连接 - 异常处理:")
try:with DatabaseConnection('test_db') as db:db.execute("SELECT * FROM users")db.execute("INSERT ERROR INTO users") # 故意出错
except Exception as e:print(f"捕获异常: {e}")
输出示例:
上下文管理器演示:1. 文件管理器:
打开文件: test_context.txt
关闭文件: test_context.txt
文件操作完成
打开文件: test_context.txt
文件内容: 这是测试内容
使用上下文管理器
关闭文件: test_context.txt
文件操作完成2. 安全文件复制:
开始复制: test_context.txt -> copy_test.txt
文件复制成功3. 数据库连接 - 正常操作:
连接到数据库: test_db
执行SQL: SELECT * FROM users
执行SQL: INSERT INTO users VALUES (1, 'Alice')
提交事务
断开数据库连接: test_db4. 数据库连接 - 异常处理:
连接到数据库: test_db
执行SQL: SELECT * FROM users
执行SQL: INSERT ERROR INTO users
发生错误,回滚事务: SQL执行错误
断开数据库连接: test_db
捕获异常: SQL执行错误
知识点: 上下文管理器、__enter__和__exit__方法、contextmanager装饰器
第88题:目录操作
题目: 实现目录的创建、遍历和管理
答案:
import os
import shutil
from pathlib import Path
from datetime import datetimedef list_directory_contents(directory, show_hidden=False, recursive=False):"""列出目录内容"""try:path = Path(directory)if not path.exists():print(f"目录不存在: {directory}")return []if not path.is_dir():print(f"不是目录: {directory}")return []contents = []def scan_directory(current_path, level=0):indent = " " * levelitems = list(current_path.iterdir())# 过滤隐藏文件if not show_hidden:items = [item for item in items if not item.name.startswith('.')]# 排序:目录在前,文件在后items.sort(key=lambda x: (x.is_file(), x.name.lower()))for item in items:item_info = {'name': item.name,'path': str(item),'is_dir': item.is_dir(),'size': item.stat().st_size if item.is_file() else 0,'modified': datetime.fromtimestamp(item.stat().st_mtime),'level': level}contents.append(item_info)# 显示信息size_str = f"{item_info['size']} bytes" if item.is_file() else "<DIR>"mod_time = item_info['modified'].strftime('%Y-%m-%d %H:%M:%S')print(f"{indent}{item.name} ({size_str}) - {mod_time}")# 递归处理子目录if recursive and item.is_dir():try:scan_directory(item, level + 1)except PermissionError:print(f"{indent} [权限不足]")print(f"目录内容: {directory}")scan_directory(path)return contentsexcept Exception as e:print(f"列出目录内容失败: {e}")return []def create_directory_structure(base_path, structure):"""创建目录结构"""try:base = Path(base_path)base.mkdir(parents=True, exist_ok=True)def create_items(current_path, items):for name, content in items.items():item_path = current_path / nameif isinstance(content, dict):# 创建目录item_path.mkdir(exist_ok=True)print(f"创建目录: {item_path}")create_items(item_path, content)elif isinstance(content, str):# 创建文件item_path.write_text(content, encoding='utf-8')print(f"创建文件: {item_path}")elif content is None:# 创建空目录item_path.mkdir(exist_ok=True)print(f"创建空目录: {item_path}")create_items(base, structure)print(f"目录结构创建完成: {base_path}")return Trueexcept Exception as e:print(f"创建目录结构失败: {e}")return Falseclass DirectoryManager:def __init__(self, base_directory):self.base_path = Path(base_directory)self.base_path.mkdir(parents=True, exist_ok=True)def create_file(self, filename, content=""):"""创建文件"""file_path = self.base_path / filenametry:file_path.parent.mkdir(parents=True, exist_ok=True)file_path.write_text(content, encoding='utf-8')print(f"文件已创建: {file_path}")return Trueexcept Exception as e:print(f"创建文件失败: {e}")return Falsedef delete_item(self, item_name):"""删除文件或目录"""item_path = self.base_path / item_nametry:if item_path.is_file():item_path.unlink()print(f"文件已删除: {item_path}")elif item_path.is_dir():shutil.rmtree(item_path)print(f"目录已删除: {item_path}")else:print(f"项目不存在: {item_path}")return Falsereturn Trueexcept Exception as e:print(f"删除失败: {e}")return Falsedef copy_item(self, source, destination):"""复制文件或目录"""src_path = self.base_path / sourcedst_path = self.base_path / destinationtry:if src_path.is_file():dst_path.parent.mkdir(parents=True, exist_ok=True)shutil.copy2(src_path, dst_path)print(f"文件已复制: {src_path} -> {dst_path}")elif src_path.is_dir():shutil.copytree(src_path, dst_path, dirs_exist_ok=True)print(f"目录已复制: {src_path} -> {dst_path}")else:print(f"源不存在: {src_path}")return Falsereturn Trueexcept Exception as e:print(f"复制失败: {e}")return Falsedef get_directory_size(self, directory="."):"""计算目录大小"""dir_path = self.base_path / directorytotal_size = 0file_count = 0dir_count = 0try:for item in dir_path.rglob('*'):if item.is_file():total_size += item.stat().st_sizefile_count += 1elif item.is_dir():dir_count += 1print(f"目录统计 - {dir_path}:")print(f" 总大小: {total_size} bytes ({total_size/1024:.2f} KB)")print(f" 文件数: {file_count}")print(f" 目录数: {dir_count}")return {'total_size': total_size,'file_count': file_count,'dir_count': dir_count}except Exception as e:print(f"计算目录大小失败: {e}")return None# 演示目录操作
print("目录操作演示:")# 1. 创建目录结构
print("\n1. 创建项目目录结构:")
project_structure = {"src": {"main.py": "# 主程序文件\nprint('Hello World')","utils": {"__init__.py": "","helpers.py": "# 辅助函数\ndef helper():\n pass"}},"tests": {"test_main.py": "# 测试文件\nimport unittest"},"docs": None, # 空目录"README.md": "# 项目说明\n这是一个示例项目。"
}create_directory_structure("demo_project", project_structure)# 2. 列出目录内容
print("\n2. 列出目录内容:")
contents = list_directory_contents("demo_project", recursive=True)# 3. 目录管理
print("\n3. 目录管理操作:")
manager = DirectoryManager("demo_project")# 创建新文件
manager.create_file("config/settings.py", "# 配置文件\nDEBUG = True")# 复制文件
manager.copy_item("README.md", "docs/README_copy.md")# 计算目录大小
stats = manager.get_directory_size()# 4. 最终目录结构
print("\n4. 最终目录结构:")
list_directory_contents("demo_project", recursive=True)
输出示例:
目录操作演示:1. 创建项目目录结构:
创建目录: demo_project\src
创建文件: demo_project\src\main.py
创建目录: demo_project\src\utils
创建文件: demo_project\src\utils\__init__.py
创建文件: demo_project\src\utils\helpers.py
创建目录: demo_project\tests
创建文件: demo_project\tests\test_main.py
创建空目录: demo_project\docs
创建文件: demo_project\README.md
目录结构创建完成: demo_project2. 列出目录内容:
目录内容: demo_project
docs (<DIR>) - 2024-01-15 10:30:45
src (<DIR>) - 2024-01-15 10:30:45utils (<DIR>) - 2024-01-15 10:30:45__init__.py (0 bytes) - 2024-01-15 10:30:45helpers.py (35 bytes) - 2024-01-15 10:30:45main.py (42 bytes) - 2024-01-15 10:30:45
tests (<DIR>) - 2024-01-15 10:30:45test_main.py (38 bytes) - 2024-01-15 10:30:45
README.md (31 bytes) - 2024-01-15 10:30:453. 目录管理操作:
文件已创建: demo_project\config\settings.py
文件已复制: demo_project\README.md -> demo_project\docs\README_copy.md
目录统计 - demo_project:总大小: 177 bytes (0.17 KB)文件数: 6目录数: 44. 最终目录结构:
目录内容: demo_project
config (<DIR>) - 2024-01-15 10:30:46settings.py (25 bytes) - 2024-01-15 10:30:46
docs (<DIR>) - 2024-01-15 10:30:45README_copy.md (31 bytes) - 2024-01-15 10:30:46
src (<DIR>) - 2024-01-15 10:30:45utils (<DIR>) - 2024-01-15 10:30:45__init__.py (0 bytes) - 2024-01-15 10:30:45helpers.py (35 bytes) - 2024-01-15 10:30:45main.py (42 bytes) - 2024-01-15 10:30:45
tests (<DIR>) - 2024-01-15 10:30:45test_main.py (38 bytes) - 2024-01-15 10:30:45
README.md (31 bytes) - 2024-01-15 10:30:45
知识点: 目录操作、Path对象、文件系统管理、递归遍历
第89题:日志记录
题目: 实现完整的日志记录系统
答案:
import logging
import os
from datetime import datetime
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler# 配置日志系统
def setup_logger(name, log_file, level=logging.INFO, max_bytes=1024*1024, backup_count=5):"""设置日志记录器"""# 创建日志目录log_dir = os.path.dirname(log_file)if log_dir and not os.path.exists(log_dir):os.makedirs(log_dir)# 创建日志记录器logger = logging.getLogger(name)logger.setLevel(level)# 避免重复添加处理器if logger.handlers:return logger# 创建格式化器formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')# 文件处理器(轮转)file_handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=backup_count,encoding='utf-8')file_handler.setLevel(level)file_handler.setFormatter(formatter)# 控制台处理器console_handler = logging.StreamHandler()console_handler.setLevel(logging.WARNING) # 控制台只显示警告及以上级别console_formatter = logging.Formatter('%(levelname)s - %(name)s - %(message)s')console_handler.setFormatter(console_formatter)# 添加处理器logger.addHandler(file_handler)logger.addHandler(console_handler)return loggerclass Calculator:def __init__(self):# 设置日志self.logger = setup_logger('Calculator', 'logs/calculator.log',level=logging.DEBUG)self.logger.info("计算器初始化完成")def add(self, a, b):"""加法运算"""self.logger.debug(f"执行加法: {a} + {b}")try:result = a + bself.logger.info(f"加法运算成功: {a} + {b} = {result}")return resultexcept Exception as e:self.logger.error(f"加法运算失败: {a} + {b}, 错误: {e}")raisedef divide(self, a, b):"""除法运算"""self.logger.debug(f"执行除法: {a} / {b}")try:if b == 0:self.logger.warning(f"尝试除零: {a} / {b}")raise ZeroDivisionError("除数不能为零")result = a / bself.logger.info(f"除法运算成功: {a} / {b} = {result}")return resultexcept Exception as e:self.logger.error(f"除法运算失败: {a} / {b}, 错误: {e}")raisedef batch_calculate(self, operations):"""批量计算"""self.logger.info(f"开始批量计算,共 {len(operations)} 个操作")results = []for i, (op, a, b) in enumerate(operations):try:self.logger.debug(f"执行操作 {i+1}: {a} {op} {b}")if op == '+':result = self.add(a, b)elif op == '/':result = self.divide(a, b)else:raise ValueError(f"不支持的操作: {op}")results.append(result)except Exception as e:self.logger.error(f"操作 {i+1} 失败: {e}")results.append(None)success_count = sum(1 for r in results if r is not None)self.logger.info(f"批量计算完成,成功: {success_count}/{len(operations)}")return resultsclass ApplicationLogger:"""应用程序日志管理器"""def __init__(self, app_name):self.app_name = app_name# 不同级别的日志文件self.loggers = {'debug': setup_logger(f'{app_name}.debug',f'logs/{app_name}_debug.log',logging.DEBUG),'info': setup_logger(f'{app_name}.info',f'logs/{app_name}_info.log',logging.INFO),'error': setup_logger(f'{app_name}.error',f'logs/{app_name}_error.log',logging.ERROR)}def debug(self, message):self.loggers['debug'].debug(message)def info(self, message):for logger in self.loggers.values():if logger.level <= logging.INFO:logger.info(message)def warning(self, message):for logger in self.loggers.values():if logger.level <= logging.WARNING:logger.warning(message)def error(self, message):for logger in self.loggers.values():if logger.level <= logging.ERROR:logger.error(message)def critical(self, message):for logger in self.loggers.values():logger.critical(message)def log_function_calls(func):"""函数调用日志装饰器"""logger = logging.getLogger(f'FunctionCall.{func.__name__}')def wrapper(*args, **kwargs):logger.info(f"调用函数 {func.__name__},参数: args={args}, kwargs={kwargs}")start_time = datetime.now()try:result = func(*args, **kwargs)end_time = datetime.now()duration = (end_time - start_time).total_seconds()logger.info(f"函数 {func.__name__} 执行成功,耗时: {duration:.4f}秒")return resultexcept Exception as e:end_time = datetime.now()duration = (end_time - start_time).total_seconds()logger.error(f"函数 {func.__name__} 执行失败,耗时: {duration:.4f}秒,错误: {e}")raisereturn wrapper@log_function_calls
def complex_calculation(x, y, z):"""复杂计算函数"""import timetime.sleep(0.1) # 模拟计算时间if z == 0:raise ValueError("z 不能为零")return (x + y) / z# 演示日志记录
print("日志记录演示:")# 1. 基本日志记录
print("\n1. 计算器日志:")
calc = Calculator()# 执行一些计算
result1 = calc.add(10, 5)
print(f"10 + 5 = {result1}")result2 = calc.divide(20, 4)
print(f"20 / 4 = {result2}")# 尝试除零
try:calc.divide(10, 0)
except ZeroDivisionError as e:print(f"除零错误: {e}")# 批量计算
operations = [('+', 1, 2),('/', 10, 2),('/', 5, 0), # 除零错误('+', 3, 4)
]results = calc.batch_calculate(operations)
print(f"批量计算结果: {results}")# 2. 应用程序日志
print("\n2. 应用程序日志:")
app_logger = ApplicationLogger('MyApp')app_logger.info("应用程序启动")
app_logger.debug("调试信息:初始化配置")
app_logger.warning("警告:配置文件缺少某些选项")
app_logger.error("错误:无法连接到数据库")# 3. 函数调用日志
print("\n3. 函数调用日志:")# 设置函数调用日志
func_logger = setup_logger('FunctionCall.complex_calculation','logs/function_calls.log',logging.INFO
)# 执行函数
try:result = complex_calculation(10, 5, 3)print(f"计算结果: {result}")
except Exception as e:print(f"计算错误: {e}")try:result = complex_calculation(10, 5, 0) # 会出错
except Exception as e:print(f"计算错误: {e}")print("\n日志文件已生成在 logs/ 目录中")
print("可以查看以下日志文件:")
print("- logs/calculator.log")
print("- logs/MyApp_debug.log")
print("- logs/MyApp_info.log")
print("- logs/MyApp_error.log")
print("- logs/function_calls.log")
输出示例:
日志记录演示:1. 计算器日志:
10 + 5 = 15
20 / 4 = 5.0
WARNING - Calculator - 尝试除零: 10 / 0
ERROR - Calculator - 除法运算失败: 10 / 0, 错误: 除数不能为零
除零错误: 除数不能为零
批量计算结果: [3, 5.0, None, 7]2. 应用程序日志:3. 函数调用日志:
计算结果: 5.0
计算错误: z 不能为零日志文件已生成在 logs/ 目录中
可以查看以下日志文件:
- logs/calculator.log
- logs/MyApp_debug.log
- logs/MyApp_info.log
- logs/MyApp_error.log
- logs/function_calls.log
知识点: 日志记录、日志级别、日志轮转、装饰器日志
第90题:配置文件
题目: 处理不同格式的配置文件
答案:
import configparser
import json
import os
from datetime import datetimeclass ConfigManager:"""配置文件管理器"""def __init__(self, config_dir='config'):self.config_dir = config_dirif not os.path.exists(config_dir):os.makedirs(config_dir)def create_ini_config(self, filename='app.ini'):"""创建INI配置文件"""config = configparser.ConfigParser()# 添加配置节和选项config['DEFAULT'] = {'debug': 'True','log_level': 'INFO','max_connections': '100'}config['database'] = {'host': 'localhost','port': '3306','username': 'admin','password': 'secret123','database_name': 'myapp'}config['server'] = {'host': '0.0.0.0','port': '8080','workers': '4'}config['features'] = {'enable_cache': 'True','enable_logging': 'True','enable_metrics': 'False'}# 保存配置文件config_path = os.path.join(self.config_dir, filename)with open(config_path, 'w', encoding='utf-8') as f:config.write(f)print(f"INI配置文件已创建: {config_path}")return config_pathdef read_ini_config(self, filename='app.ini'):"""读取INI配置文件"""config_path = os.path.join(self.config_dir, filename)if not os.path.exists(config_path):print(f"配置文件不存在: {config_path}")return Noneconfig = configparser.ConfigParser()config.read(config_path, encoding='utf-8')print(f"INI配置文件已读取: {config_path}")return configdef create_json_config(self, filename='app.json'):"""创建JSON配置文件"""config_data = {"application": {"name": "MyApplication","version": "1.0.0","debug": True,"environment": "development"},"database": {"type": "mysql","host": "localhost","port": 3306,"credentials": {"username": "admin","password": "secret123"},"database_name": "myapp","pool_size": 10},"server": {"host": "0.0.0.0","port": 8080,"ssl_enabled": False,"cors_origins": ["http://localhost:3000", "https://myapp.com"]},"logging": {"level": "INFO","file": "logs/app.log","max_size": "10MB","backup_count": 5},"features": {"cache": {"enabled": True,"ttl": 3600,"max_size": 1000},"metrics": {"enabled": False,"endpoint": "/metrics"}},"created_at": datetime.now().isoformat()}config_path = os.path.join(self.config_dir, filename)with open(config_path, 'w', encoding='utf-8') as f:json.dump(config_data, f, ensure_ascii=False, indent=2)print(f"JSON配置文件已创建: {config_path}")return config_pathdef read_json_config(self, filename='app.json'):"""读取JSON配置文件"""config_path = os.path.join(self.config_dir, filename)if not os.path.exists(config_path):print(f"配置文件不存在: {config_path}")return Nonetry:with open(config_path, 'r', encoding='utf-8') as f:config_data = json.load(f)print(f"JSON配置文件已读取: {config_path}")return config_dataexcept json.JSONDecodeError as e:print(f"JSON格式错误: {e}")return Nonedef update_config(self, filename, section, key, value, config_type='ini'):"""更新配置文件"""if config_type == 'ini':config = self.read_ini_config(filename)if config:if section not in config:config.add_section(section)config.set(section, key, str(value))config_path = os.path.join(self.config_dir, filename)with open(config_path, 'w', encoding='utf-8') as f:config.write(f)print(f"INI配置已更新: [{section}] {key} = {value}")elif config_type == 'json':config_data = self.read_json_config(filename)if config_data:if section not in config_data:config_data[section] = {}config_data[section][key] = valueconfig_data['updated_at'] = datetime.now().isoformat()config_path = os.path.join(self.config_dir, filename)with open(config_path, 'w', encoding='utf-8') as f:json.dump(config_data, f, ensure_ascii=False, indent=2)print(f"JSON配置已更新: {section}.{key} = {value}")def get_config_value(self, filename, section, key, config_type='ini', default=None):"""获取配置值"""if config_type == 'ini':config = self.read_ini_config(filename)if config and config.has_option(section, key):return config.get(section, key)elif config_type == 'json':config_data = self.read_json_config(filename)if config_data and section in config_data and key in config_data[section]:return config_data[section][key]return default# 演示配置文件处理
print("配置文件处理演示:")# 创建配置管理器
config_manager = ConfigManager()# 1. 创建和读取INI配置
print("\n1. INI配置文件:")
ini_file = config_manager.create_ini_config()
ini_config = config_manager.read_ini_config()print("\nINI配置内容:")
for section_name in ini_config.sections():print(f"[{section_name}]")for key, value in ini_config.items(section_name):print(f" {key} = {value}")print()# 2. 创建和读取JSON配置
print("\n2. JSON配置文件:")
json_file = config_manager.create_json_config()
json_config = config_manager.read_json_config()print("\nJSON配置内容:")
print(json.dumps(json_config, ensure_ascii=False, indent=2))# 3. 更新配置
print("\n3. 更新配置:")
config_manager.update_config('app.ini', 'database', 'port', '3307', 'ini')
config_manager.update_config('app.json', 'server', 'port', 9000, 'json')# 4. 获取配置值
print("\n4. 获取配置值:")
db_host = config_manager.get_config_value('app.ini', 'database', 'host', 'ini')
server_port = config_manager.get_config_value('app.json', 'server', 'port', 'json')
print(f"数据库主机 (INI): {db_host}")
print(f"服务器端口 (JSON): {server_port}")**输出示例:**
配置文件处理演示:
- INI配置文件:
INI配置文件已创建: config/app.ini
INI配置文件已读取: config/app.ini
INI配置内容:
[database]
host = localhost
port = 3306
username = admin
password = secret123
database_name = myapp
[server]
host = 0.0.0.0
port = 8080
workers = 4
[features]
enable_cache = True
enable_logging = True
enable_metrics = False
- JSON配置文件:
JSON配置文件已创建: config/app.json
JSON配置文件已读取: config/app.json
JSON配置内容:
{
“application”: {
“name”: “MyApplication”,
“version”: “1.0.0”,
“debug”: true,
“environment”: “development”
},
“database”: {
“type”: “mysql”,
“host”: “localhost”,
“port”: 3306
}
}
-
更新配置:
INI配置文件已读取: config/app.ini
INI配置已更新: [database] port = 3307
JSON配置文件已读取: config/app.json
JSON配置已更新: server.port = 9000 -
获取配置值:
INI配置文件已读取: config/app.ini
JSON配置文件已读取: config/app.json
数据库主机 (INI): localhost
服务器端口 (JSON): 9000
**知识点:** 配置文件处理、INI和JSON格式、配置管理---### 第91题:学生管理系统
**题目:** 综合应用 - 创建完整的学生管理系统**答案:**
```python
class Student:def __init__(self, student_id, name, age, grade, subjects=None):self.student_id = student_idself.name = nameself.age = ageself.grade = gradeself.subjects = subjects or {}self.enrollment_date = datetime.now().strftime('%Y-%m-%d')def add_score(self, subject, score):"""添加科目成绩"""if subject not in self.subjects:self.subjects[subject] = []self.subjects[subject].append(score)print(f"已为学生 {self.name} 添加 {subject} 成绩: {score}")def get_average_score(self, subject=None):"""获取平均成绩"""if subject:if subject in self.subjects and self.subjects[subject]:return sum(self.subjects[subject]) / len(self.subjects[subject])return 0# 计算总平均分all_scores = []for scores in self.subjects.values():all_scores.extend(scores)return sum(all_scores) / len(all_scores) if all_scores else 0def get_info(self):"""获取学生信息"""return {'student_id': self.student_id,'name': self.name,'age': self.age,'grade': self.grade,'subjects': self.subjects,'average_score': round(self.get_average_score(), 2),'enrollment_date': self.enrollment_date}class StudentManagementSystem:def __init__(self):self.students = {}self.next_id = 1def add_student(self, name, age, grade):"""添加学生"""student_id = f"STU{self.next_id:04d}"student = Student(student_id, name, age, grade)self.students[student_id] = studentself.next_id += 1print(f"学生添加成功: {student_id} - {name}")return student_iddef remove_student(self, student_id):"""删除学生"""if student_id in self.students:student_name = self.students[student_id].namedel self.students[student_id]print(f"学生已删除: {student_id} - {student_name}")return Trueelse:print(f"学生不存在: {student_id}")return Falsedef find_student(self, student_id=None, name=None):"""查找学生"""if student_id:return self.students.get(student_id)if name:for student in self.students.values():if student.name == name:return studentreturn Nonedef list_students(self, grade=None):"""列出学生"""students = list(self.students.values())if grade:students = [s for s in students if s.grade == grade]# 按平均成绩排序students.sort(key=lambda s: s.get_average_score(), reverse=True)print(f"\n学生列表 (共 {len(students)} 人):")print(f"{'学号':<10} {'姓名':<10} {'年龄':<5} {'年级':<8} {'平均分':<8}")print("-" * 50)for student in students:avg_score = student.get_average_score()print(f"{student.student_id:<10} {student.name:<10} {student.age:<5} "f"{student.grade:<8} {avg_score:<8.2f}")return studentsdef get_statistics(self):"""获取统计信息"""if not self.students:return {}# 按年级统计grade_stats = {}all_scores = []for student in self.students.values():grade = student.gradeif grade not in grade_stats:grade_stats[grade] = {'count': 0, 'total_score': 0}grade_stats[grade]['count'] += 1avg_score = student.get_average_score()grade_stats[grade]['total_score'] += avg_scoreall_scores.append(avg_score)# 计算各年级平均分for grade in grade_stats:count = grade_stats[grade]['count']total = grade_stats[grade]['total_score']grade_stats[grade]['average'] = total / count if count > 0 else 0stats = {'total_students': len(self.students),'grade_distribution': grade_stats,'overall_average': sum(all_scores) / len(all_scores) if all_scores else 0,'highest_score': max(all_scores) if all_scores else 0,'lowest_score': min(all_scores) if all_scores else 0}return statsdef export_data(self, filename):"""导出学生数据"""try:data = {'students': [student.get_info() for student in self.students.values()],'statistics': self.get_statistics(),'export_time': datetime.now().isoformat()}with open(filename, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)print(f"数据已导出到: {filename}")return Trueexcept Exception as e:print(f"导出失败: {e}")return False# 演示学生管理系统
print("学生管理系统演示:")
sms = StudentManagementSystem()# 添加学生
print("\n1. 添加学生:")
student_ids = [sms.add_student("张三", 18, "高一"),sms.add_student("李四", 17, "高一"),sms.add_student("王五", 19, "高二"),sms.add_student("赵六", 18, "高二"),sms.add_student("钱七", 16, "高一")
]# 添加成绩
print("\n2. 添加成绩:")
for student_id in student_ids[:3]:student = sms.find_student(student_id)if student:student.add_score("数学", 85 + hash(student_id) % 15)student.add_score("语文", 80 + hash(student_id) % 20)student.add_score("英语", 75 + hash(student_id) % 25)# 列出所有学生
print("\n3. 学生列表:")
sms.list_students()# 按年级列出
print("\n4. 高一学生:")
sms.list_students(grade="高一")# 统计信息
print("\n5. 统计信息:")
stats = sms.get_statistics()
print(f"总学生数: {stats['total_students']}")
print(f"整体平均分: {stats['overall_average']:.2f}")
print(f"最高分: {stats['highest_score']:.2f}")
print(f"最低分: {stats['lowest_score']:.2f}")print("\n年级分布:")
for grade, data in stats['grade_distribution'].items():print(f" {grade}: {data['count']}人, 平均分: {data['average']:.2f}")# 导出数据
print("\n6. 导出数据:")
sms.export_data('students_data.json')
输出示例:
学生管理系统演示:1. 添加学生:
学生添加成功: STU0001 - 张三
学生添加成功: STU0002 - 李四
学生添加成功: STU0003 - 王五
学生添加成功: STU0004 - 赵六
学生添加成功: STU0005 - 钱七2. 添加成绩:
已为学生 张三 添加 数学 成绩: 92
已为学生 张三 添加 语文 成绩: 88
已为学生 张三 添加 英语 成绩: 85
已为学生 李四 添加 数学 成绩: 87
已为学生 李四 添加 语文 成绩: 91
已为学生 李四 添加 英语 成绩: 793. 学生列表:学生列表 (共 5 人):
学号 姓名 年龄 年级 平均分
--------------------------------------------------
STU0002 李四 17 高一 85.67
STU0001 张三 18 高一 88.33
STU0003 王五 19 高二 83.00
STU0004 赵六 18 高二 0.00
STU0005 钱七 16 高一 0.004. 高一学生:学生列表 (共 3 人):
学号 姓名 年龄 年级 平均分
--------------------------------------------------
STU0001 张三 18 高一 88.33
STU0002 李四 17 高一 85.67
STU0005 钱七 16 高一 0.005. 统计信息:
总学生数: 5
整体平均分: 51.40
最高分: 88.33
最低分: 0.00年级分布:高一: 3人, 平均分: 58.00高二: 2人, 平均分: 41.506. 导出数据:
数据已导出到: students_data.json
知识点: 面向对象设计、数据管理、统计分析、文件导出
第92题:计算器程序
题目: 综合应用 - 创建功能完整的计算器程序
答案:
class Calculator:def __init__(self):self.history = []self.memory = 0self.last_result = 0def add(self, a, b):"""加法"""result = a + bself._record_operation(f"{a} + {b}", result)return resultdef subtract(self, a, b):"""减法"""result = a - bself._record_operation(f"{a} - {b}", result)return resultdef multiply(self, a, b):"""乘法"""result = a * bself._record_operation(f"{a} × {b}", result)return resultdef divide(self, a, b):"""除法"""if b == 0:raise ValueError("除数不能为零")result = a / bself._record_operation(f"{a} ÷ {b}", result)return resultdef power(self, base, exponent):"""幂运算"""result = base ** exponentself._record_operation(f"{base} ^ {exponent}", result)return resultdef sqrt(self, number):"""平方根"""if number < 0:raise ValueError("负数不能开平方根")result = number ** 0.5self._record_operation(f"√{number}", result)return resultdef factorial(self, n):"""阶乘"""if n < 0:raise ValueError("负数没有阶乘")if not isinstance(n, int):raise ValueError("阶乘只能计算整数")result = 1for i in range(1, n + 1):result *= iself._record_operation(f"{n}!", result)return resultdef percentage(self, number, percent):"""百分比计算"""result = number * (percent / 100)self._record_operation(f"{number} × {percent}%", result)return resultdef evaluate_expression(self, expression):"""计算表达式"""try:# 简单的表达式求值(仅支持基本运算符)allowed_chars = set('0123456789+-*/().^ ')if not all(c in allowed_chars for c in expression):raise ValueError("表达式包含不支持的字符")# 替换^为**expression = expression.replace('^', '**')result = eval(expression)self._record_operation(expression, result)return resultexcept Exception as e:raise ValueError(f"表达式计算错误: {e}")def memory_store(self, value):"""存储到内存"""self.memory = valueprint(f"已存储到内存: {value}")def memory_recall(self):"""从内存读取"""return self.memorydef memory_clear(self):"""清除内存"""self.memory = 0print("内存已清除")def memory_add(self, value):"""内存加法"""self.memory += valueprint(f"内存值更新为: {self.memory}")def _record_operation(self, operation, result):"""记录操作历史"""self.history.append({'operation': operation,'result': result,'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S')})self.last_result = resultdef get_history(self, limit=10):"""获取计算历史"""return self.history[-limit:] if limit else self.historydef clear_history(self):"""清除历史记录"""self.history.clear()print("历史记录已清除")def get_statistics(self):"""获取使用统计"""if not self.history:return {}operations = [item['operation'] for item in self.history]results = [item['result'] for item in self.history]return {'total_calculations': len(self.history),'average_result': sum(results) / len(results),'max_result': max(results),'min_result': min(results),'most_recent': self.history[-1] if self.history else None}class CalculatorInterface:def __init__(self):self.calc = Calculator()def run(self):"""运行计算器界面"""print("=== Python 计算器 ===")print("支持的操作:")print("1. 基本运算: +, -, *, /")print("2. 高级运算: ^(幂), sqrt(平方根), !(阶乘)")print("3. 内存操作: ms(存储), mr(读取), mc(清除), m+(加到内存)")print("4. 其他: history(历史), clear(清除历史), stats(统计), quit(退出)")print()while True:try:user_input = input("请输入计算表达式或命令: ").strip()if user_input.lower() in ['quit', 'exit', 'q']:print("感谢使用计算器!")breakelif user_input.lower() == 'history':self._show_history()elif user_input.lower() == 'clear':self.calc.clear_history()elif user_input.lower() == 'stats':self._show_statistics()elif user_input.lower() == 'mc':self.calc.memory_clear()elif user_input.lower() == 'mr':memory_value = self.calc.memory_recall()print(f"内存值: {memory_value}")elif user_input.lower().startswith('ms '):try:value = float(user_input[3:])self.calc.memory_store(value)except ValueError:print("错误: 请输入有效数字")elif user_input.lower().startswith('m+ '):try:value = float(user_input[3:])self.calc.memory_add(value)except ValueError:print("错误: 请输入有效数字")elif 'sqrt(' in user_input:# 处理平方根import rematch = re.search(r'sqrt\(([^)]+)\)', user_input)if match:number = float(match.group(1))result = self.calc.sqrt(number)print(f"结果: {result}")elif user_input.endswith('!'):# 处理阶乘number = int(user_input[:-1])result = self.calc.factorial(number)print(f"结果: {result}")else:# 处理普通表达式result = self.calc.evaluate_expression(user_input)print(f"结果: {result}")except ValueError as e:print(f"错误: {e}")except Exception as e:print(f"未知错误: {e}")def _show_history(self):"""显示计算历史"""history = self.calc.get_history()if not history:print("暂无计算历史")returnprint("\n=== 计算历史 ===")for i, item in enumerate(history, 1):print(f"{i}. {item['operation']} = {item['result']} ({item['timestamp']})")print()def _show_statistics(self):"""显示使用统计"""stats = self.calc.get_statistics()if not stats:print("暂无统计数据")returnprint("\n=== 使用统计 ===")print(f"总计算次数: {stats['total_calculations']}")print(f"平均结果: {stats['average_result']:.2f}")print(f"最大结果: {stats['max_result']}")print(f"最小结果: {stats['min_result']}")if stats['most_recent']:recent = stats['most_recent']print(f"最近计算: {recent['operation']} = {recent['result']}")print()# 演示计算器程序
print("计算器程序演示:")# 创建计算器实例
calc = Calculator()# 基本运算演示
print("\n1. 基本运算:")
print(f"10 + 5 = {calc.add(10, 5)}")
print(f"10 - 3 = {calc.subtract(10, 3)}")
print(f"6 × 7 = {calc.multiply(6, 7)}")
print(f"15 ÷ 3 = {calc.divide(15, 3)}")# 高级运算演示
print("\n2. 高级运算:")
print(f"2^8 = {calc.power(2, 8)}")
print(f"√16 = {calc.sqrt(16)}")
print(f"5! = {calc.factorial(5)}")
print(f"200的15% = {calc.percentage(200, 15)}")# 表达式计算
print("\n3. 表达式计算:")
print(f"(10 + 5) × 2 = {calc.evaluate_expression('(10 + 5) * 2')}")
print(f"2^3 + 4×5 = {calc.evaluate_expression('2^3 + 4*5')}")# 内存操作
print("\n4. 内存操作:")
calc.memory_store(100)
print(f"内存值: {calc.memory_recall()}")
calc.memory_add(50)
print(f"内存值: {calc.memory_recall()}")# 历史记录
print("\n5. 计算历史:")
history = calc.get_history(5)
for i, item in enumerate(history, 1):print(f"{i}. {item['operation']} = {item['result']}")# 统计信息
print("\n6. 使用统计:")
stats = calc.get_statistics()
print(f"总计算次数: {stats['total_calculations']}")
print(f"平均结果: {stats['average_result']:.2f}")
print(f"最大结果: {stats['max_result']}")
print(f"最小结果: {stats['min_result']}")
输出示例:
计算器程序演示:1. 基本运算:
10 + 5 = 15
10 - 3 = 7
6 × 7 = 42
15 ÷ 3 = 5.02. 高级运算:
2^8 = 256
√16 = 4.0
5! = 120
200的15% = 30.03. 表达式计算:
(10 + 5) × 2 = 30
2^3 + 4×5 = 284. 内存操作:
已存储到内存: 100
内存值: 100
内存值更新为: 150
内存值: 1505. 计算历史:
1. 10 + 5 = 15
2. 10 - 3 = 7
3. 6 × 7 = 42
4. 15 ÷ 3 = 5.0
5. 2 ^ 8 = 2566. 使用统计:
总计算次数: 10
平均结果: 55.7
最大结果: 256
最小结果: 4.0
知识点: 面向对象设计、异常处理、表达式求值、用户界面设计
第93题:密码生成器
题目: 实用工具 - 创建安全密码生成器
答案:
class PasswordGenerator:def __init__(self):self.lowercase = 'abcdefghijklmnopqrstuvwxyz'self.uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'self.digits = '0123456789'self.special_chars = '!@#$%^&*()_+-=[]{}|;:,.<>?'self.ambiguous_chars = 'il1Lo0O'def generate_password(self, length=12, use_uppercase=True, use_lowercase=True, use_digits=True, use_special=True, exclude_ambiguous=False):"""生成单个密码"""if length < 4:raise ValueError("密码长度至少为4位")# 构建字符集charset = ''required_chars = []if use_lowercase:chars = self.lowercaseif exclude_ambiguous:chars = ''.join(c for c in chars if c not in self.ambiguous_chars)charset += charsrequired_chars.append(random.choice(chars))if use_uppercase:chars = self.uppercaseif exclude_ambiguous:chars = ''.join(c for c in chars if c not in self.ambiguous_chars)charset += charsrequired_chars.append(random.choice(chars))if use_digits:chars = self.digitsif exclude_ambiguous:chars = ''.join(c for c in chars if c not in self.ambiguous_chars)charset += charsrequired_chars.append(random.choice(chars))if use_special:charset += self.special_charsrequired_chars.append(random.choice(self.special_chars))if not charset:raise ValueError("至少需要选择一种字符类型")# 生成密码password_chars = required_chars[:]remaining_length = length - len(required_chars)for _ in range(remaining_length):password_chars.append(random.choice(charset))# 随机打乱字符顺序random.shuffle(password_chars)return ''.join(password_chars)def generate_multiple_passwords(self, count=5, **kwargs):"""生成多个密码"""passwords = []for _ in range(count):password = self.generate_password(**kwargs)passwords.append(password)return passwordsdef check_password_strength(self, password):"""检查密码强度"""score = 0feedback = []# 长度检查if len(password) >= 12:score += 2elif len(password) >= 8:score += 1else:feedback.append("密码长度至少应为8位")# 字符类型检查has_lower = any(c in self.lowercase for c in password)has_upper = any(c in self.uppercase for c in password)has_digit = any(c in self.digits for c in password)has_special = any(c in self.special_chars for c in password)char_types = sum([has_lower, has_upper, has_digit, has_special])score += char_typesif not has_lower:feedback.append("建议包含小写字母")if not has_upper:feedback.append("建议包含大写字母")if not has_digit:feedback.append("建议包含数字")if not has_special:feedback.append("建议包含特殊字符")# 重复字符检查repeated_chars = len(password) - len(set(password))if repeated_chars > len(password) * 0.3:feedback.append("重复字符过多")score -= 1# 连续字符检查consecutive_count = 0for i in range(len(password) - 1):if ord(password[i+1]) - ord(password[i]) == 1:consecutive_count += 1if consecutive_count > 2:feedback.append("避免使用连续字符")score -= 1# 常见模式检查common_patterns = ['123', 'abc', 'qwe', 'password', '000', '111']for pattern in common_patterns:if pattern.lower() in password.lower():feedback.append(f"避免使用常见模式: {pattern}")score -= 1break# 确定强度等级if score >= 7:strength = "很强"elif score >= 5:strength = "强"elif score >= 3:strength = "中等"elif score >= 1:strength = "弱"else:strength = "很弱"return {'strength': strength,'score': max(0, score),'max_score': 8,'feedback': feedback,'details': {'length': len(password),'has_lowercase': has_lower,'has_uppercase': has_upper,'has_digits': has_digit,'has_special': has_special,'unique_chars': len(set(password)),'repeated_chars': repeated_chars}}def generate_memorable_password(self, word_count=3, separator='-', add_numbers=True):"""生成易记忆的密码"""# 简单的单词列表(实际应用中可以使用更大的词典)words = ['apple', 'brave', 'cloud', 'dance', 'eagle', 'flame', 'grace', 'happy','island', 'jungle', 'knight', 'light', 'magic', 'noble', 'ocean', 'peace','quiet', 'river', 'storm', 'tiger', 'unity', 'voice', 'water', 'youth','zebra', 'bright', 'strong', 'swift', 'gentle', 'golden']selected_words = random.sample(words, word_count)# 随机大写某些单词的首字母for i in range(len(selected_words)):if random.choice([True, False]):selected_words[i] = selected_words[i].capitalize()password = separator.join(selected_words)if add_numbers:# 添加随机数字numbers = str(random.randint(10, 999))password += numbers# 可选择添加特殊字符if random.choice([True, False]):password += random.choice('!@#$%')return passworddef save_passwords(self, passwords, filename='passwords.txt'):"""保存密码到文件"""try:with open(filename, 'w', encoding='utf-8') as f:f.write(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")f.write("=" * 50 + "\n")for i, password in enumerate(passwords, 1):strength_info = self.check_password_strength(password)f.write(f"{i}. {password} (强度: {strength_info['strength']})\n")print(f"密码已保存到: {filename}")return Trueexcept Exception as e:print(f"保存失败: {e}")return False# 演示密码生成器
print("密码生成器演示:")# 创建密码生成器
pg = PasswordGenerator()# 1. 生成基本密码
print("\n1. 基本密码生成:")
basic_password = pg.generate_password(length=12)
print(f"基本密码: {basic_password}")# 2. 生成多个密码
print("\n2. 生成多个密码:")
multiple_passwords = pg.generate_multiple_passwords(count=3, length=16, exclude_ambiguous=True
)
for i, pwd in enumerate(multiple_passwords, 1):print(f"密码{i}: {pwd}")# 3. 不同配置的密码
print("\n3. 不同配置的密码:")
configs = [{'length': 8, 'use_special': False, 'name': '简单密码'},{'length': 16, 'exclude_ambiguous': True, 'name': '无歧义密码'},{'length': 20, 'use_special': True, 'name': '复杂密码'}
]for config in configs:name = config.pop('name')password = pg.generate_password(**config)print(f"{name}: {password}")# 4. 易记忆密码
print("\n4. 易记忆密码:")
for i in range(3):memorable = pg.generate_memorable_password()print(f"易记密码{i+1}: {memorable}")# 5. 密码强度检查
print("\n5. 密码强度检查:")
test_passwords = ["123456","Password123","MyStr0ng!P@ssw0rd",basic_password
]for pwd in test_passwords:strength_info = pg.check_password_strength(pwd)print(f"\n密码: {pwd}")print(f"强度: {strength_info['strength']} ({strength_info['score']}/{strength_info['max_score']})")if strength_info['feedback']:print("建议:")for feedback in strength_info['feedback']:print(f" - {feedback}")# 6. 保存密码
print("\n6. 保存密码:")
all_passwords = [basic_password] + multiple_passwords
pg.save_passwords(all_passwords, 'generated_passwords.txt')
输出示例:
密码生成器演示:1. 基本密码生成:
基本密码: K9#mP2$vX8qL2. 生成多个密码:
密码1: R7@nF4&yU2sE9mK3
密码2: B5#wG8*pT6xN4hJ2
密码3: M9$dL3&vC7qR5kP83. 不同配置的密码:
简单密码: Kp9mX2vL
无歧义密码: R7nF4yU2sE9mK3pB
复杂密码: M9$dL3&vC7qR5kP8@nF44. 易记忆密码:
易记密码1: Apple-Brave-Cloud247!
易记密码2: dance-Eagle-flame89
易记密码3: Grace-happy-Island456@5. 密码强度检查:密码: 123456
强度: 很弱 (0/8)
建议:- 密码长度至少应为8位- 建议包含小写字母- 建议包含大写字母- 建议包含特殊字符- 避免使用常见模式: 123密码: Password123
强度: 中等 (3/8)
建议:- 建议包含特殊字符- 避免使用常见模式: password密码: MyStr0ng!P@ssw0rd
强度: 很强 (7/8)密码: K9#mP2$vX8qL
强度: 很强 (8/8)6. 保存密码:
密码已保存到: generated_passwords.txt
知识点: 随机数生成、字符串处理、密码安全、文件操作
第94题:文本分析器
题目: 数据分析 - 创建文本分析和统计工具
答案:
class TextAnalyzer:def __init__(self):self.text = ""self.analysis_results = {}def load_text(self, text):"""加载文本"""self.text = textself.analysis_results = {}print(f"已加载文本,长度: {len(text)} 字符")def load_from_file(self, filename):"""从文件加载文本"""try:with open(filename, 'r', encoding='utf-8') as f:self.text = f.read()self.analysis_results = {}print(f"已从文件加载文本: {filename}")print(f"文本长度: {len(self.text)} 字符")return Trueexcept Exception as e:print(f"文件加载失败: {e}")return Falsedef basic_statistics(self):"""基本统计信息"""if not self.text:return {}# 字符统计char_count = len(self.text)char_count_no_spaces = len(self.text.replace(' ', ''))# 单词统计words = self.text.split()word_count = len(words)# 行数统计lines = self.text.split('\n')line_count = len(lines)non_empty_lines = len([line for line in lines if line.strip()])# 段落统计(以空行分隔)paragraphs = [p.strip() for p in self.text.split('\n\n') if p.strip()]paragraph_count = len(paragraphs)# 句子统计(简单实现)import resentences = re.split(r'[.!?]+', self.text)sentence_count = len([s for s in sentences if s.strip()])stats = {'characters': char_count,'characters_no_spaces': char_count_no_spaces,'words': word_count,'lines': line_count,'non_empty_lines': non_empty_lines,'paragraphs': paragraph_count,'sentences': sentence_count,'average_words_per_sentence': word_count / sentence_count if sentence_count > 0 else 0,'average_chars_per_word': char_count_no_spaces / word_count if word_count > 0 else 0}self.analysis_results['basic_stats'] = statsreturn statsdef word_frequency(self, top_n=10, min_length=1):"""词频统计"""if not self.text:return {}import refrom collections import Counter# 提取单词(移除标点符号)words = re.findall(r'\b\w+\b', self.text.lower())# 过滤长度words = [word for word in words if len(word) >= min_length]# 统计频率word_freq = Counter(words)# 获取前N个最常见的单词top_words = word_freq.most_common(top_n)result = {'total_unique_words': len(word_freq),'top_words': top_words,'word_frequency_dict': dict(word_freq)}self.analysis_results['word_frequency'] = resultreturn resultdef character_frequency(self):"""字符频率统计"""if not self.text:return {}from collections import Counter# 所有字符频率char_freq = Counter(self.text.lower())# 字母频率letter_freq = Counter(c for c in self.text.lower() if c.isalpha())# 数字频率digit_freq = Counter(c for c in self.text if c.isdigit())# 标点符号频率punct_freq = Counter(c for c in self.text if not c.isalnum() and not c.isspace())result = {'all_characters': dict(char_freq.most_common()),'letters': dict(letter_freq.most_common()),'digits': dict(digit_freq.most_common()),'punctuation': dict(punct_freq.most_common())}self.analysis_results['char_frequency'] = resultreturn resultdef readability_analysis(self):"""可读性分析"""if not self.text:return {}import re# 基本统计words = self.text.split()sentences = re.split(r'[.!?]+', self.text)sentences = [s.strip() for s in sentences if s.strip()]if not words or not sentences:return {}# 计算平均值avg_words_per_sentence = len(words) / len(sentences)# 计算音节数(简化版本)def count_syllables(word):word = word.lower()vowels = 'aeiouy'syllable_count = 0prev_was_vowel = Falsefor char in word:if char in vowels:if not prev_was_vowel:syllable_count += 1prev_was_vowel = Trueelse:prev_was_vowel = False# 至少有一个音节return max(1, syllable_count)total_syllables = sum(count_syllables(word) for word in words)avg_syllables_per_word = total_syllables / len(words)# Flesch Reading Ease Score (简化版本)flesch_score = 206.835 - (1.015 * avg_words_per_sentence) - (84.6 * avg_syllables_per_word)# 可读性等级if flesch_score >= 90:reading_level = "非常容易"elif flesch_score >= 80:reading_level = "容易"elif flesch_score >= 70:reading_level = "较容易"elif flesch_score >= 60:reading_level = "标准"elif flesch_score >= 50:reading_level = "较难"elif flesch_score >= 30:reading_level = "难"else:reading_level = "非常难"result = {'flesch_score': round(flesch_score, 2),'reading_level': reading_level,'avg_words_per_sentence': round(avg_words_per_sentence, 2),'avg_syllables_per_word': round(avg_syllables_per_word, 2),'total_syllables': total_syllables}self.analysis_results['readability'] = resultreturn resultdef sentiment_analysis(self):"""情感分析(简化版本)"""if not self.text:return {}# 简单的情感词典positive_words = {'good', 'great', 'excellent', 'amazing', 'wonderful', 'fantastic', 'love', 'like', 'happy', 'joy', 'beautiful', 'perfect', 'best','awesome', 'brilliant', 'outstanding', 'superb', 'marvelous'}negative_words = {'bad', 'terrible', 'awful', 'horrible', 'hate', 'dislike', 'sad','angry', 'ugly', 'worst', 'disgusting', 'pathetic', 'useless','disappointing', 'frustrating', 'annoying', 'boring', 'stupid'}import rewords = re.findall(r'\b\w+\b', self.text.lower())positive_count = sum(1 for word in words if word in positive_words)negative_count = sum(1 for word in words if word in negative_words)neutral_count = len(words) - positive_count - negative_count# 计算情感分数if len(words) > 0:positive_ratio = positive_count / len(words)negative_ratio = negative_count / len(words)sentiment_score = positive_ratio - negative_ratioelse:positive_ratio = negative_ratio = sentiment_score = 0# 确定整体情感if sentiment_score > 0.1:overall_sentiment = "积极"elif sentiment_score < -0.1:overall_sentiment = "消极"else:overall_sentiment = "中性"result = {'positive_words': positive_count,'negative_words': negative_count,'neutral_words': neutral_count,'positive_ratio': round(positive_ratio, 3),'negative_ratio': round(negative_ratio, 3),'sentiment_score': round(sentiment_score, 3),'overall_sentiment': overall_sentiment}self.analysis_results['sentiment'] = resultreturn resultdef generate_report(self):"""生成完整分析报告"""if not self.text:return "没有加载文本"# 执行所有分析basic_stats = self.basic_statistics()word_freq = self.word_frequency()char_freq = self.character_frequency()readability = self.readability_analysis()sentiment = self.sentiment_analysis()# 生成报告report = []report.append("=" * 60)report.append("文本分析报告")report.append("=" * 60)report.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")report.append("")# 基本统计report.append("1. 基本统计信息")report.append("-" * 30)report.append(f"字符数: {basic_stats['characters']:,}")report.append(f"字符数(不含空格): {basic_stats['characters_no_spaces']:,}")report.append(f"单词数: {basic_stats['words']:,}")report.append(f"行数: {basic_stats['lines']:,}")report.append(f"非空行数: {basic_stats['non_empty_lines']:,}")report.append(f"段落数: {basic_stats['paragraphs']:,}")report.append(f"句子数: {basic_stats['sentences']:,}")report.append(f"平均每句单词数: {basic_stats['average_words_per_sentence']:.1f}")report.append(f"平均每词字符数: {basic_stats['average_chars_per_word']:.1f}")report.append("")# 词频统计report.append("2. 词频统计 (前10个)")report.append("-" * 30)report.append(f"独特单词数: {word_freq['total_unique_words']:,}")for word, count in word_freq['top_words']:report.append(f"{word}: {count}")report.append("")# 可读性分析report.append("3. 可读性分析")report.append("-" * 30)report.append(f"Flesch阅读难度分数: {readability['flesch_score']}")report.append(f"阅读难度等级: {readability['reading_level']}")report.append(f"平均每句单词数: {readability['avg_words_per_sentence']}")report.append(f"平均每词音节数: {readability['avg_syllables_per_word']}")report.append("")# 情感分析report.append("4. 情感分析")report.append("-" * 30)report.append(f"整体情感: {sentiment['overall_sentiment']}")report.append(f"情感分数: {sentiment['sentiment_score']}")report.append(f"积极词汇: {sentiment['positive_words']} ({sentiment['positive_ratio']:.1%})")report.append(f"消极词汇: {sentiment['negative_words']} ({sentiment['negative_ratio']:.1%})")report.append(f"中性词汇: {sentiment['neutral_words']}")report.append("")# 字符频率(前10个字母)report.append("5. 字符频率 (前10个字母)")report.append("-" * 30)letter_items = list(char_freq['letters'].items())[:10]for char, count in letter_items:report.append(f"{char}: {count}")return "\n".join(report)def save_report(self, filename='text_analysis_report.txt'):"""保存分析报告到文件"""try:report = self.generate_report()with open(filename, 'w', encoding='utf-8') as f:f.write(report)print(f"分析报告已保存到: {filename}")return Trueexcept Exception as e:print(f"保存报告失败: {e}")return False# 演示文本分析器
print("文本分析器演示:")# 创建分析器实例
analyzer = TextAnalyzer()# 示例文本
sample_text = """
Python is an amazing programming language that is widely used in various fields.
It has a simple and readable syntax, making it perfect for beginners.
Python is also powerful enough for advanced applications like machine learning,
web development, and data analysis. The language emphasizes code readability
and allows programmers to express concepts in fewer lines of code.Many companies use Python for their projects because it's efficient and versatile.
The Python community is very supportive and provides excellent documentation.
Overall, Python is a fantastic choice for both new and experienced programmers.
"""# 加载文本
print("\n1. 加载文本:")
analyzer.load_text(sample_text)# 基本统计
print("\n2. 基本统计:")
basic_stats = analyzer.basic_statistics()
for key, value in basic_stats.items():print(f"{key}: {value}")# 词频统计
print("\n3. 词频统计 (前5个):")
word_freq = analyzer.word_frequency(top_n=5)
print(f"独特单词数: {word_freq['total_unique_words']}")
for word, count in word_freq['top_words']:print(f"{word}: {count}")# 可读性分析
print("\n4. 可读性分析:")
readability = analyzer.readability_analysis()
for key, value in readability.items():print(f"{key}: {value}")# 情感分析
print("\n5. 情感分析:")
sentiment = analyzer.sentiment_analysis()
for key, value in sentiment.items():print(f"{key}: {value}")# 字符频率(前5个字母)
print("\n6. 字符频率 (前5个字母):")
char_freq = analyzer.character_frequency()
letter_items = list(char_freq['letters'].items())[:5]
for char, count in letter_items:print(f"{char}: {count}")# 生成完整报告
print("\n7. 完整分析报告:")
report = analyzer.generate_report()
print(report[:500] + "..." if len(report) > 500 else report)# 保存报告
print("\n8. 保存报告:")
analyzer.save_report('sample_text_analysis.txt')
输出示例:
文本分析器演示:1. 加载文本:
已加载文本,长度: 687 字符2. 基本统计:
characters: 687
characters_no_spaces: 571
words: 108
lines: 9
non_empty_lines: 7
paragraphs: 2
sentences: 8
average_words_per_sentence: 13.5
average_chars_per_word: 5.33. 词频统计 (前5个):
独特单词数: 78
and: 6
is: 4
python: 4
for: 3
the: 34. 可读性分析:
flesch_score: 45.23
reading_level: 较难
avg_words_per_sentence: 13.5
avg_syllables_per_word: 1.65
total_syllables: 1785. 情感分析:
positive_words: 6
negative_words: 0
neutral_words: 102
positive_ratio: 0.056
negative_ratio: 0.0
sentiment_score: 0.056
overall_sentiment: 中性6. 字符频率 (前5个字母):
a: 42
e: 41
n: 35
r: 34
i: 337. 完整分析报告:
============================================================
文本分析报告
============================================================
生成时间: 2024-01-15 10:30:451. 基本统计信息
------------------------------
字符数: 687
字符数(不含空格): 571
单词数: 108
行数: 9
非空行数: 7
段落数: 2
句子数: 8
平均每句单词数: 13.5
平均每词字符数: 5.32. 词频统计 (前10个)
------------------------------
独特单词数: 78
and: 6
is: 4
python: 4
for: 3
the: 3...8. 保存报告:
分析报告已保存到: sample_text_analysis.txt
知识点: 文本处理、统计分析、正则表达式、情感分析、可读性评估
第95题:简单爬虫模拟
题目: 网络编程 - 模拟网页爬虫功能
答案:
class WebScraper:def __init__(self):self.scraped_data = {}self.visited_urls = set()self.session_stats = {'pages_scraped': 0,'total_links_found': 0,'errors': 0,'start_time': None}def simulate_web_content(self, url):"""模拟网页内容(实际应用中会使用requests库)"""# 模拟不同网站的内容mock_contents = {'https://example.com': {'title': 'Example Domain','content': 'This domain is for use in illustrative examples in documents.','links': ['https://example.com/about', 'https://example.com/contact'],'status': 200},'https://example.com/about': {'title': 'About Us - Example','content': 'Learn more about our company and mission.','links': ['https://example.com', 'https://example.com/services'],'status': 200},'https://example.com/contact': {'title': 'Contact Us - Example','content': 'Get in touch with our team for support.','links': ['https://example.com', 'mailto:info@example.com'],'status': 200},'https://news.example.com': {'title': 'Latest News','content': 'Breaking news and updates from around the world.','links': ['https://news.example.com/tech', 'https://news.example.com/sports'],'status': 200},'https://blog.example.com': {'title': 'Our Blog','content': 'Insights and articles from our experts.','links': ['https://blog.example.com/python', 'https://blog.example.com/ai'],'status': 200}}# 模拟网络延迟import timetime.sleep(0.1)if url in mock_contents:return mock_contents[url]else:# 模拟404错误return {'title': 'Page Not Found','content': 'The requested page could not be found.','links': [],'status': 404}def extract_title(self, content_data):"""提取页面标题"""return content_data.get('title', 'No Title')def extract_links(self, content_data):"""提取页面链接"""return content_data.get('links', [])def extract_text(self, content_data):"""提取页面文本内容"""return content_data.get('content', '')def scrape_page(self, url):"""爬取单个页面"""try:print(f"正在爬取: {url}")# 检查是否已访问if url in self.visited_urls:print(f"页面已访问过: {url}")return self.scraped_data.get(url)# 获取页面内容content_data = self.simulate_web_content(url)if content_data['status'] != 200:print(f"页面访问失败: {url} (状态码: {content_data['status']})")self.session_stats['errors'] += 1return None# 提取信息page_info = {'url': url,'title': self.extract_title(content_data),'content': self.extract_text(content_data),'links': self.extract_links(content_data),'scraped_at': datetime.now().isoformat(),'content_length': len(self.extract_text(content_data)),'link_count': len(self.extract_links(content_data))}# 保存数据self.scraped_data[url] = page_infoself.visited_urls.add(url)# 更新统计self.session_stats['pages_scraped'] += 1self.session_stats['total_links_found'] += len(page_info['links'])print(f"成功爬取: {page_info['title']} ({page_info['content_length']} 字符)")return page_infoexcept Exception as e:print(f"爬取失败 {url}: {e}")self.session_stats['errors'] += 1return Nonedef scrape_multiple_pages(self, urls, delay=0.5):"""爬取多个页面"""import timeif not self.session_stats['start_time']:self.session_stats['start_time'] = datetime.now()results = []for url in urls:result = self.scrape_page(url)if result:results.append(result)# 添加延迟以避免过于频繁的请求if delay > 0:time.sleep(delay)return resultsdef crawl_website(self, start_url, max_pages=5, max_depth=2):"""爬取整个网站(广度优先)"""if not self.session_stats['start_time']:self.session_stats['start_time'] = datetime.now()to_visit = [(start_url, 0)] # (url, depth)visited = set()results = []while to_visit and len(results) < max_pages:current_url, depth = to_visit.pop(0)if current_url in visited or depth > max_depth:continue# 爬取当前页面page_info = self.scrape_page(current_url)if page_info:results.append(page_info)visited.add(current_url)# 添加新发现的链接到待访问列表if depth < max_depth:for link in page_info['links']:if link.startswith('http') and link not in visited:to_visit.append((link, depth + 1))# 添加延迟import timetime.sleep(0.3)print(f"\n爬取完成!共爬取 {len(results)} 个页面")return resultsdef search_content(self, keyword, case_sensitive=False):"""在爬取的内容中搜索关键词"""results = []for url, page_info in self.scraped_data.items():title = page_info['title']content = page_info['content']if not case_sensitive:title = title.lower()content = content.lower()keyword = keyword.lower()# 检查标题和内容中是否包含关键词title_matches = keyword in titlecontent_matches = keyword in contentif title_matches or content_matches:# 计算关键词出现次数title_count = title.count(keyword)content_count = content.count(keyword)results.append({'url': url,'title': page_info['title'],'title_matches': title_count,'content_matches': content_count,'total_matches': title_count + content_count,'scraped_at': page_info['scraped_at']})# 按匹配数量排序results.sort(key=lambda x: x['total_matches'], reverse=True)return resultsdef get_statistics(self):"""获取爬取统计信息"""if self.session_stats['start_time']:duration = datetime.now() - datetime.fromisoformat(self.session_stats['start_time'].isoformat())duration_seconds = duration.total_seconds()else:duration_seconds = 0total_content_length = sum(page['content_length'] for page in self.scraped_data.values())stats = {'pages_scraped': self.session_stats['pages_scraped'],'unique_urls': len(self.visited_urls),'total_links_found': self.session_stats['total_links_found'],'errors': self.session_stats['errors'],'total_content_length': total_content_length,'average_content_length': total_content_length / len(self.scraped_data) if self.scraped_data else 0,'session_duration': duration_seconds,'pages_per_minute': (self.session_stats['pages_scraped'] / duration_seconds * 60) if duration_seconds > 0 else 0}return statsdef export_data(self, filename='scraped_data.json', format='json'):"""导出爬取的数据"""try:if format.lower() == 'json':import jsonexport_data = {'scraped_data': self.scraped_data,'statistics': self.get_statistics(),'export_time': datetime.now().isoformat()}with open(filename, 'w', encoding='utf-8') as f:json.dump(export_data, f, ensure_ascii=False, indent=2)elif format.lower() == 'csv':import csvwith open(filename, 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['URL', 'Title', 'Content Length', 'Link Count', 'Scraped At'])for page_info in self.scraped_data.values():writer.writerow([page_info['url'],page_info['title'],page_info['content_length'],page_info['link_count'],page_info['scraped_at']])print(f"数据已导出到: {filename}")return Trueexcept Exception as e:print(f"导出失败: {e}")return Falsedef generate_report(self):"""生成爬取报告"""stats = self.get_statistics()report = []report.append("=" * 50)report.append("网页爬取报告")report.append("=" * 50)report.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")report.append("")# 统计信息report.append("1. 爬取统计")report.append("-" * 20)report.append(f"爬取页面数: {stats['pages_scraped']}")report.append(f"唯一URL数: {stats['unique_urls']}")report.append(f"发现链接数: {stats['total_links_found']}")report.append(f"错误次数: {stats['errors']}")report.append(f"总内容长度: {stats['total_content_length']:,} 字符")report.append(f"平均内容长度: {stats['average_content_length']:.0f} 字符")report.append(f"会话时长: {stats['session_duration']:.1f} 秒")report.append(f"爬取速度: {stats['pages_per_minute']:.1f} 页/分钟")report.append("")# 页面列表report.append("2. 爬取页面列表")report.append("-" * 20)for i, (url, page_info) in enumerate(self.scraped_data.items(), 1):report.append(f"{i}. {page_info['title']}")report.append(f" URL: {url}")report.append(f" 内容长度: {page_info['content_length']} 字符")report.append(f" 链接数: {page_info['link_count']}")report.append(f" 爬取时间: {page_info['scraped_at']}")report.append("")return "\n".join(report)# 演示网页爬虫
print("网页爬虫模拟演示:")# 创建爬虫实例
scraper = WebScraper()# 1. 爬取单个页面
print("\n1. 爬取单个页面:")
page_info = scraper.scrape_page('https://example.com')
if page_info:print(f"标题: {page_info['title']}")print(f"内容长度: {page_info['content_length']} 字符")print(f"链接数: {page_info['link_count']}")# 2. 爬取多个页面
print("\n2. 爬取多个页面:")
urls_to_scrape = ['https://example.com/about','https://example.com/contact','https://news.example.com'
]
results = scraper.scrape_multiple_pages(urls_to_scrape)
print(f"成功爬取 {len(results)} 个页面")# 3. 网站爬取(广度优先)
print("\n3. 网站爬取:")
crawl_results = scraper.crawl_website('https://blog.example.com', max_pages=3, max_depth=1)# 4. 内容搜索
print("\n4. 内容搜索:")
search_results = scraper.search_content('example')
print(f"找到 {len(search_results)} 个包含 'example' 的页面:")
for result in search_results[:3]:print(f" - {result['title']}: {result['total_matches']} 次匹配")# 5. 统计信息
print("\n5. 爬取统计:")
stats = scraper.get_statistics()
for key, value in stats.items():if isinstance(value, float):print(f"{key}: {value:.2f}")else:print(f"{key}: {value}")# 6. 导出数据
print("\n6. 导出数据:")
scraper.export_data('scraped_data.json', 'json')
scraper.export_data('scraped_data.csv', 'csv')# 7. 生成报告
print("\n7. 爬取报告:")
report = scraper.generate_report()
print(report[:800] + "..." if len(report) > 800 else report)
输出示例:
网页爬虫模拟演示:1. 爬取单个页面:
正在爬取: https://example.com
成功爬取: Example Domain (58 字符)
标题: Example Domain
内容长度: 58 字符
链接数: 22. 爬取多个页面:
正在爬取: https://example.com/about
成功爬取: About Us - Example (42 字符)
正在爬取: https://example.com/contact
成功爬取: Contact Us - Example (44 字符)
正在爬取: https://news.example.com
成功爬取: Latest News (54 字符)
成功爬取 3 个页面3. 网站爬取:
正在爬取: https://blog.example.com
成功爬取: Our Blog (42 字符)
正在爬取: https://blog.example.com/python
页面访问失败: https://blog.example.com/python (状态码: 404)
正在爬取: https://blog.example.com/ai
页面访问失败: https://blog.example.com/ai (状态码: 404)爬取完成!共爬取 1 个页面4. 内容搜索:
找到 4 个包含 'example' 的页面:- Example Domain: 1 次匹配- About Us - Example: 1 次匹配- Contact Us - Example: 1 次匹配5. 爬取统计:
pages_scraped: 5
unique_urls: 5
total_links_found: 8
errors: 2
total_content_length: 240
average_content_length: 48.00
session_duration: 2.15
pages_per_minute: 139.536. 导出数据:
数据已导出到: scraped_data.json
数据已导出到: scraped_data.csv7. 爬取报告:
==================================================
网页爬取报告
==================================================
生成时间: 2024-01-15 10:35:201. 爬取统计
--------------------
爬取页面数: 5
唯一URL数: 5
发现链接数: 8
错误次数: 2
总内容长度: 240 字符
平均内容长度: 48 字符
会话时长: 2.2 秒
爬取速度: 139.5 页/分钟2. 爬取页面列表
--------------------
1. Example DomainURL: https://example.com内容长度: 58 字符链接数: 2爬取时间: 2024-01-15T10:35:18...
知识点: 网络爬虫、数据提取、URL处理、内容搜索、数据导出
第96题:数据可视化
题目: 数据分析 - 创建简单的数据可视化工具
答案:
class DataVisualizer:def __init__(self):self.data = {}self.chart_settings = {'width': 60,'height': 20,'bar_char': '█','empty_char': ' ','border_char': '│'}def load_data(self, data, data_type='dict'):"""加载数据"""if data_type == 'dict':self.data = dataelif data_type == 'list':# 将列表转换为字典(索引作为键)self.data = {f'Item_{i+1}': value for i, value in enumerate(data)}elif data_type == 'csv':# 简单的CSV解析lines = data.strip().split('\n')headers = lines[0].split(',')if len(headers) == 2:self.data = {}for line in lines[1:]:parts = line.split(',')if len(parts) == 2:try:self.data[parts[0].strip()] = float(parts[1].strip())except ValueError:self.data[parts[0].strip()] = parts[1].strip()print(f"已加载 {len(self.data)} 个数据点")return self.datadef create_bar_chart(self, title="Bar Chart", show_values=True, sort_data=False):"""创建文本条形图"""if not self.data:return "没有数据可显示"# 准备数据data_items = list(self.data.items())if sort_data:data_items.sort(key=lambda x: x[1], reverse=True)# 获取数值数据numeric_data = []for key, value in data_items:try:numeric_data.append((key, float(value)))except (ValueError, TypeError):continueif not numeric_data:return "没有数值数据可显示"# 计算缩放比例max_value = max(item[1] for item in numeric_data)min_value = min(item[1] for item in numeric_data)if max_value == min_value:scale = 1else:scale = (self.chart_settings['width'] - 10) / (max_value - min_value)# 生成图表chart_lines = []chart_lines.append("=" * (self.chart_settings['width'] + 10))chart_lines.append(f"{title:^{self.chart_settings['width'] + 10}}")chart_lines.append("=" * (self.chart_settings['width'] + 10))chart_lines.append("")# 找到最长的标签长度max_label_length = max(len(str(item[0])) for item in numeric_data)max_label_length = min(max_label_length, 15) # 限制标签长度for label, value in numeric_data:# 截断过长的标签display_label = str(label)[:max_label_length]display_label = display_label.ljust(max_label_length)# 计算条形长度if max_value == min_value:bar_length = 1else:bar_length = max(1, int((value - min_value) * scale))# 创建条形bar = self.chart_settings['bar_char'] * bar_length# 添加数值显示if show_values:if isinstance(value, float) and value.is_integer():value_str = f" {int(value)}"else:value_str = f" {value:.1f}"else:value_str = ""chart_lines.append(f"{display_label} │{bar}{value_str}")chart_lines.append("")chart_lines.append(f"最大值: {max_value:.1f}, 最小值: {min_value:.1f}")chart_lines.append(f"数据点数: {len(numeric_data)}")return "\n".join(chart_lines)# 演示数据可视化
print("数据可视化演示:")# 创建可视化器实例
visualizer = DataVisualizer()# 示例数据
sample_data = {'Python': 85,'JavaScript': 72,'Java': 68,'C++': 45,'Go': 38,'Rust': 25,'Swift': 20
}# 加载数据
print("\n1. 加载数据:")
visualizer.load_data(sample_data)# 创建条形图
print("\n2. 条形图:")
bar_chart = visualizer.create_bar_chart(title="编程语言流行度", sort_data=True)
print(bar_chart)
输出示例:
数据可视化演示:1. 加载数据:
已加载 7 个数据点2. 条形图:
======================================================================编程语言流行度
======================================================================Python │████████████████████████████████████████████████████ 85
JavaScript │██████████████████████████████████████████ 72
Java │████████████████████████████████████████ 68
C++ │██████████████████████████ 45
Go │███████████████████████ 38
Rust │███████████████ 25
Swift │████████████ 20最大值: 85.0, 最小值: 20.0
数据点数: 7
知识点: 数据可视化、统计分析、文本图表、数据处理、文件导出
第97题:数据库操作
题目: 数据库 - 创建简单的数据库管理系统
答案:
class DatabaseManager:def __init__(self, db_name='test.db'):self.db_name = db_nameself.connection = Noneself.tables = {}self.init_database()def init_database(self):"""初始化数据库(模拟)"""try:# 在实际应用中,这里会使用sqlite3或其他数据库# 这里我们用字典模拟数据库表print(f"初始化数据库: {self.db_name}")# 创建用户表self.create_table('users', {'id': 'INTEGER PRIMARY KEY','username': 'TEXT UNIQUE NOT NULL','email': 'TEXT UNIQUE NOT NULL','age': 'INTEGER','created_at': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'})# 创建产品表self.create_table('products', {'id': 'INTEGER PRIMARY KEY','name': 'TEXT NOT NULL','price': 'REAL NOT NULL','category': 'TEXT','stock': 'INTEGER DEFAULT 0','created_at': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'})print("数据库初始化完成")return Trueexcept Exception as e:print(f"数据库初始化失败: {e}")return Falsedef create_table(self, table_name, columns):"""创建表"""try:# 模拟表结构self.tables[table_name] = {'columns': columns,'data': [],'next_id': 1}column_defs = []for col_name, col_type in columns.items():column_defs.append(f"{col_name} {col_type}")sql = f"CREATE TABLE {table_name} ({', '.join(column_defs)})"print(f"创建表: {table_name}")return Trueexcept Exception as e:print(f"创建表失败: {e}")return Falsedef insert_record(self, table_name, data):"""插入记录"""try:if table_name not in self.tables:raise ValueError(f"表 {table_name} 不存在")table = self.tables[table_name]# 自动分配IDif 'id' in table['columns'] and 'id' not in data:data['id'] = table['next_id']table['next_id'] += 1# 添加时间戳if 'created_at' in table['columns'] and 'created_at' not in data:from datetime import datetimedata['created_at'] = datetime.now().isoformat()# 插入数据table['data'].append(data.copy())print(f"成功插入记录到表 {table_name}: {data}")return data.get('id', len(table['data']))except Exception as e:print(f"插入记录失败: {e}")return Nonedef select_records(self, table_name, conditions=None, limit=None):"""查询记录"""try:if table_name not in self.tables:raise ValueError(f"表 {table_name} 不存在")table = self.tables[table_name]results = table['data'].copy()# 应用条件过滤if conditions:filtered_results = []for record in results:match = Truefor field, value in conditions.items():if record.get(field) != value:match = Falsebreakif match:filtered_results.append(record)results = filtered_results# 限制结果数量if limit:results = results[:limit]print(f"查询表 {table_name} 返回 {len(results)} 条记录")return resultsexcept Exception as e:print(f"查询记录失败: {e}")return []# 演示数据库操作
print("数据库管理系统演示:")# 创建数据库管理器
db = DatabaseManager('demo.db')# 插入用户数据
user_data = [{'username': 'alice', 'email': 'alice@example.com', 'age': 25},{'username': 'bob', 'email': 'bob@example.com', 'age': 30}
]for user in user_data:db.insert_record('users', user)# 查询数据
users = db.select_records('users')
for user in users:print(f" {user['username']} ({user['email']}) - {user['age']}岁")
输出示例:
数据库管理系统演示:
初始化数据库: demo.db
创建表: users
创建表: products
数据库初始化完成
成功插入记录到表 users: {'username': 'alice', 'email': 'alice@example.com', 'age': 25, 'id': 1, 'created_at': '2024-01-15T10:40:15.123456'}
成功插入记录到表 users: {'username': 'bob', 'email': 'bob@example.com', 'age': 30, 'id': 2, 'created_at': '2024-01-15T10:40:15.124567'}
查询表 users 返回 2 条记录alice (alice@example.com) - 25岁bob (bob@example.com) - 30岁
知识点: 数据库设计、CRUD操作、数据验证、查询优化、数据备份
-
希望对初学者有帮助;致力于办公自动化的小小程序员一枚
-
希望能得到大家的【❤️一个免费关注❤️】感谢!
-
求个 🤞 关注 🤞 +❤️ 喜欢 ❤️ +👍 收藏 👍
-
此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
-
此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
-
此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏