【Python】Python90个基础练习代码

发布于:2025-06-26 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

Python 100个基础练习代码

本文档包含100个Python基础练习题目和解答,适合初学者循序渐进地学习Python编程。

目录


基础语法练习

1. Hello World

# 输出Hello World
print("Hello, World!")

2. 变量赋值

# 创建变量并赋值
name = "Python"
age = 30
height = 1.75
print(f"语言: {name}, 年龄: {age}, 版本: {height}")

3. 用户输入

# 获取用户输入
name = input("请输入您的姓名: ")
print(f"您好, {name}!")

4. 数据类型检查

# 检查数据类型
num = 42
text = "Hello"
flag = True
print(f"num的类型: {type(num)}")
print(f"text的类型: {type(text)}")
print(f"flag的类型: {type(flag)}")

5. 基本运算

# 基本数学运算
a = 10
b = 3
print(f"加法: {a + b}")
print(f"减法: {a - b}")
print(f"乘法: {a * b}")
print(f"除法: {a / b}")
print(f"整除: {a // b}")
print(f"取余: {a % b}")
print(f"幂运算: {a ** b}")

6. 字符串操作

# 字符串基本操作
text = "Python Programming"
print(f"原字符串: {text}")
print(f"转大写: {text.upper()}")
print(f"转小写: {text.lower()}")
print(f"字符串长度: {len(text)}")
print(f"替换: {text.replace('Python', 'Java')}")

7. 字符串格式化

# 字符串格式化的不同方法
name = "张三"
age = 25
score = 95.5

# 方法1: f-string
print(f"姓名: {name}, 年龄: {age}, 分数: {score:.1f}")

# 方法2: format方法
print("姓名: {}, 年龄: {}, 分数: {:.1f}".format(name, age, score))

# 方法3: %格式化
print("姓名: %s, 年龄: %d, 分数: %.1f" % (name, age, score))

8. 注释练习

# 这是单行注释
print("Hello")  # 行末注释

"""
这是多行注释
可以写很多行
用于详细说明
"""
print("World")

9. 常量定义

# Python中的常量约定(使用大写字母)
PI = 3.14159
MAX_SIZE = 100
APP_NAME = "我的应用"

print(f"圆周率: {PI}")
print(f"最大尺寸: {MAX_SIZE}")
print(f"应用名称: {APP_NAME}")

10. 多变量赋值

# 多变量同时赋值
a, b, c = 1, 2, 3
print(f"a={a}, b={b}, c={c}")

# 交换变量值
x, y = 10, 20
print(f"交换前: x={x}, y={y}")
x, y = y, x
print(f"交换后: x={x}, y={y}")

11. 转义字符

# 转义字符的使用
print("第一行\n第二行")  # 换行
print("制表符\t分隔")
print("引号: \"Hello\"")
print("反斜杠: \\")
print("回车: \r覆盖")

12. 原始字符串

# 原始字符串(r-string)
path = r"C:\Users\Documents\file.txt"
regex = r"\d+\w*"
print(f"文件路径: {path}")
print(f"正则表达式: {regex}")

13. 字符串切片

# 字符串切片操作
text = "Python Programming"
print(f"前6个字符: {text[:6]}")
print(f"后11个字符: {text[7:]}")
print(f"中间部分: {text[7:18]}")
print(f"每隔一个字符: {text[::2]}")
print(f"反转字符串: {text[::-1]}")

14. 字符串判断

# 字符串内容判断
text = "Python123"
print(f"是否为数字: {text.isdigit()}")
print(f"是否为字母: {text.isalpha()}")
print(f"是否为字母数字: {text.isalnum()}")
print(f"是否为小写: {text.islower()}")
print(f"是否为大写: {text.isupper()}")

15. 输入类型转换

# 输入数据类型转换
try:
    age = int(input("请输入您的年龄: "))
    height = float(input("请输入您的身高(米): "))
    print(f"您今年{age}岁,身高{height}米")
except ValueError:
    print("输入格式错误!")

16. 布尔运算

# 布尔运算和逻辑操作
a = True
b = False
print(f"a and b: {a and b}")
print(f"a or b: {a or b}")
print(f"not a: {not a}")
print(f"not b: {not b}")

# 比较运算
x, y = 5, 10
print(f"{x} > {y}: {x > y}")
print(f"{x} < {y}: {x < y}")
print(f"{x} == {y}: {x == y}")
print(f"{x} != {y}: {x != y}")

17. 成员运算符

# in 和 not in 运算符
text = "Hello World"
print(f"'Hello' in text: {'Hello' in text}")
print(f"'Python' in text: {'Python' in text}")
print(f"'Python' not in text: {'Python' not in text}")

numbers = [1, 2, 3, 4, 5]
print(f"3 in numbers: {3 in numbers}")
print(f"6 in numbers: {6 in numbers}")

18. 身份运算符

# is 和 is not 运算符
a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(f"a == b: {a == b}")  # 值相等
print(f"a is b: {a is b}")  # 不是同一个对象
print(f"a is c: {a is c}")  # 是同一个对象

x = None
print(f"x is None: {x is None}")
print(f"x is not None: {x is not None}")

19. 运算符优先级

# 运算符优先级示例
result1 = 2 + 3 * 4  # 乘法优先
result2 = (2 + 3) * 4  # 括号改变优先级
result3 = 2 ** 3 ** 2  # 幂运算从右到左
result4 = 2 ** (3 ** 2)  # 明确优先级

print(f"2 + 3 * 4 = {result1}")
print(f"(2 + 3) * 4 = {result2}")
print(f"2 ** 3 ** 2 = {result3}")
print(f"2 ** (3 ** 2) = {result4}")

20. 简单计算器

# 简单的计算器程序
def simple_calculator():
    try:
        num1 = float(input("请输入第一个数字: "))
        operator = input("请输入运算符 (+, -, *, /): ")
        num2 = float(input("请输入第二个数字: "))
        
        if operator == '+':
            result = num1 + num2
        elif operator == '-':
            result = num1 - num2
        elif operator == '*':
            result = num1 * num2
        elif operator == '/':
            if num2 != 0:
                result = num1 / num2
            else:
                print("错误:除数不能为零!")
                return
        else:
            print("错误:不支持的运算符!")
            return
        
        print(f"结果: {num1} {operator} {num2} = {result}")
    except ValueError:
        print("错误:请输入有效的数字!")

# simple_calculator()  # 取消注释来运行

数据类型练习

21. 列表基础操作

# 列表的创建和基本操作
fruits = ["苹果", "香蕉", "橙子"]
print(f"原列表: {fruits}")

# 添加元素
fruits.append("葡萄")
print(f"添加后: {fruits}")

# 插入元素
fruits.insert(1, "草莓")
print(f"插入后: {fruits}")

# 删除元素
fruits.remove("香蕉")
print(f"删除后: {fruits}")

# 访问元素
print(f"第一个水果: {fruits[0]}")
print(f"最后一个水果: {fruits[-1]}")

22. 列表切片和遍历

# 列表切片和遍历
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 切片操作
print(f"前5个数字: {numbers[:5]}")
print(f"后5个数字: {numbers[5:]}")
print(f"偶数位置: {numbers[::2]}")
print(f"反转列表: {numbers[::-1]}")

# 遍历列表
print("\n遍历列表:")
for i, num in enumerate(numbers):
    print(f"索引{i}: {num}")

23. 列表推导式

# 列表推导式
# 生成平方数
squares = [x**2 for x in range(1, 11)]
print(f"平方数: {squares}")

# 筛选偶数
even_numbers = [x for x in range(1, 21) if x % 2 == 0]
print(f"偶数: {even_numbers}")

# 字符串处理
words = ["hello", "world", "python"]
capitalized = [word.capitalize() for word in words]
print(f"首字母大写: {capitalized}")

24. 元组操作

# 元组的创建和操作
coordinates = (3, 4)
print(f"坐标: {coordinates}")
print(f"x坐标: {coordinates[0]}")
print(f"y坐标: {coordinates[1]}")

# 元组解包
x, y = coordinates
print(f"解包后: x={x}, y={y}")

# 命名元组
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(f"命名元组: {p}")
print(f"x坐标: {p.x}, y坐标: {p.y}")

25. 字典基础操作

# 字典的创建和操作
student = {
    "姓名": "张三",
    "年龄": 20,
    "专业": "计算机科学",
    "成绩": [85, 92, 78]
}

print(f"学生信息: {student}")
print(f"姓名: {student['姓名']}")
print(f"年龄: {student.get('年龄', '未知')}")

# 添加和修改
student["学号"] = "2023001"
student["年龄"] = 21
print(f"更新后: {student}")

# 遍历字典
for key, value in student.items():
    print(f"{key}: {value}")

26. 字典推导式

# 字典推导式
# 创建平方字典
square_dict = {x: x**2 for x in range(1, 6)}
print(f"平方字典: {square_dict}")

# 筛选字典
scores = {"张三": 85, "李四": 92, "王五": 78, "赵六": 95}
high_scores = {name: score for name, score in scores.items() if score >= 90}
print(f"高分学生: {high_scores}")

# 字符串长度字典
words = ["python", "java", "javascript", "go"]
length_dict = {word: len(word) for word in words}
print(f"单词长度: {length_dict}")

27. 集合操作

# 集合的创建和操作
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

print(f"集合1: {set1}")
print(f"集合2: {set2}")

# 集合运算
print(f"并集: {set1 | set2}")
print(f"交集: {set1 & set2}")
print(f"差集: {set1 - set2}")
print(f"对称差集: {set1 ^ set2}")

# 集合方法
set1.add(6)
print(f"添加元素后: {set1}")
set1.discard(1)
print(f"删除元素后: {set1}")

28. 字符串方法详解

# 字符串方法详细示例
text = "  Hello, Python World!  "

print(f"原字符串: '{text}'")
print(f"去除空格: '{text.strip()}'")
print(f"分割字符串: {text.strip().split(', ')}")
print(f"连接字符串: {'-'.join(['a', 'b', 'c'])}")
print(f"查找子串: {text.find('Python')}")
print(f"替换字符串: {text.replace('World', 'Universe')}")
print(f"字符串居中: '{text.strip().center(30, '*')}'")

29. 数字类型转换

# 数字类型转换和操作
# 整数
num_int = 42
print(f"整数: {num_int}, 类型: {type(num_int)}")

# 浮点数
num_float = 3.14159
print(f"浮点数: {num_float}, 类型: {type(num_float)}")

# 复数
num_complex = 3 + 4j
print(f"复数: {num_complex}, 类型: {type(num_complex)}")
print(f"实部: {num_complex.real}, 虚部: {num_complex.imag}")

# 类型转换
print(f"浮点转整数: {int(num_float)}")
print(f"整数转浮点: {float(num_int)}")
print(f"字符串转数字: {int('123')}, {float('3.14')}")

30. 数据类型判断

# 数据类型判断
def check_type(value):
    print(f"值: {value}")
    print(f"类型: {type(value)}")
    print(f"是否为整数: {isinstance(value, int)}")
    print(f"是否为字符串: {isinstance(value, str)}")
    print(f"是否为列表: {isinstance(value, list)}")
    print(f"是否为数字: {isinstance(value, (int, float))}")
    print("-" * 30)

# 测试不同类型
check_type(42)
check_type("Hello")
check_type([1, 2, 3])
check_type(3.14)

31. 嵌套数据结构

# 嵌套数据结构
company = {
    "名称": "科技公司",
    "部门": {
        "研发部": {
            "员工": ["张三", "李四", "王五"],
            "项目": ["项目A", "项目B"]
        },
        "销售部": {
            "员工": ["赵六", "钱七"],
            "目标": 1000000
        }
    }
}

print(f"公司名称: {company['名称']}")
print(f"研发部员工: {company['部门']['研发部']['员工']}")
print(f"销售部目标: {company['部门']['销售部']['目标']}")

# 遍历嵌套结构
for dept_name, dept_info in company["部门"].items():
    print(f"\n{dept_name}:")
    for key, value in dept_info.items():
        print(f"  {key}: {value}")

32. 列表排序和搜索

# 列表排序和搜索
numbers = [64, 34, 25, 12, 22, 11, 90]
print(f"原列表: {numbers}")

# 排序
sorted_asc = sorted(numbers)
sorted_desc = sorted(numbers, reverse=True)
print(f"升序排序: {sorted_asc}")
print(f"降序排序: {sorted_desc}")

# 原地排序
numbers.sort()
print(f"原地排序: {numbers}")

# 搜索
target = 25
if target in numbers:
    index = numbers.index(target)
    print(f"找到 {target},位置: {index}")
else:
    print(f"未找到 {target}")

33. 字符串编码解码

# 字符串编码和解码
text = "你好,Python!"
print(f"原字符串: {text}")

# 编码
utf8_bytes = text.encode('utf-8')
gbk_bytes = text.encode('gbk')
print(f"UTF-8编码: {utf8_bytes}")
print(f"GBK编码: {gbk_bytes}")

# 解码
decoded_utf8 = utf8_bytes.decode('utf-8')
decoded_gbk = gbk_bytes.decode('gbk')
print(f"UTF-8解码: {decoded_utf8}")
print(f"GBK解码: {decoded_gbk}")

# 处理编码错误
try:
    wrong_decode = utf8_bytes.decode('ascii')
except UnicodeDecodeError as e:
    print(f"解码错误: {e}")

34. 数据结构转换

# 数据结构之间的转换
# 列表转换
list_data = [1, 2, 3, 4, 5]
tuple_data = tuple(list_data)
set_data = set(list_data)
print(f"列表: {list_data}")
print(f"元组: {tuple_data}")
print(f"集合: {set_data}")

# 字符串转换
string_data = "hello"
list_from_string = list(string_data)
tuple_from_string = tuple(string_data)
set_from_string = set(string_data)
print(f"\n字符串: {string_data}")
print(f"转列表: {list_from_string}")
print(f"转元组: {tuple_from_string}")
print(f"转集合: {set_from_string}")

# 字典转换
dict_data = {"a": 1, "b": 2, "c": 3}
keys_list = list(dict_data.keys())
values_list = list(dict_data.values())
items_list = list(dict_data.items())
print(f"\n字典: {dict_data}")
print(f"键列表: {keys_list}")
print(f"值列表: {values_list}")
print(f"项列表: {items_list}")

35. 深拷贝和浅拷贝

# 深拷贝和浅拷贝
import copy

# 原始数据
original = [[1, 2, 3], [4, 5, 6]]
print(f"原始数据: {original}")

# 浅拷贝
shallow_copy = copy.copy(original)
shallow_copy[0][0] = 999
print(f"浅拷贝修改后原始数据: {original}")
print(f"浅拷贝数据: {shallow_copy}")

# 重置数据
original = [[1, 2, 3], [4, 5, 6]]

# 深拷贝
deep_copy = copy.deepcopy(original)
deep_copy[0][0] = 999
print(f"\n深拷贝修改后原始数据: {original}")
print(f"深拷贝数据: {deep_copy}")

36. 数据统计

# 数据统计分析
numbers = [85, 92, 78, 96, 87, 91, 83, 89, 94, 88]

# 基本统计
print(f"数据: {numbers}")
print(f"总数: {len(numbers)}")
print(f"最大值: {max(numbers)}")
print(f"最小值: {min(numbers)}")
print(f"总和: {sum(numbers)}")
print(f"平均值: {sum(numbers) / len(numbers):.2f}")

# 排序后的统计
sorted_numbers = sorted(numbers)
print(f"排序后: {sorted_numbers}")
print(f"中位数: {sorted_numbers[len(sorted_numbers)//2]}")

# 计数统计
from collections import Counter
counter = Counter(numbers)
print(f"计数统计: {counter}")
print(f"最常见的3个: {counter.most_common(3)}")

37. 字符串格式化高级用法

# 字符串格式化高级用法
name = "张三"
age = 25
score = 95.678

# f-string高级格式化
print(f"姓名: {name:>10}")  # 右对齐,宽度10
print(f"年龄: {age:0>5}")   # 用0填充,宽度5
print(f"分数: {score:.2f}")  # 保留2位小数
print(f"分数: {score:8.2f}")  # 宽度8,保留2位小数
print(f"百分比: {score/100:.2%}")  # 百分比格式

# 数字格式化
number = 1234567
print(f"千分位分隔: {number:,}")
print(f"科学计数法: {number:.2e}")

# 日期格式化
from datetime import datetime
now = datetime.now()
print(f"当前时间: {now:%Y-%m-%d %H:%M:%S}")

38. 数据验证

# 数据验证函数
def validate_data(data):
    """验证数据的有效性"""
    results = {}
    
    # 检查是否为空
    results['is_empty'] = len(data) == 0
    
    # 检查数据类型
    results['all_numbers'] = all(isinstance(x, (int, float)) for x in data)
    results['all_strings'] = all(isinstance(x, str) for x in data)
    
    # 检查数值范围(如果是数字)
    if results['all_numbers']:
        results['all_positive'] = all(x > 0 for x in data)
        results['in_range_0_100'] = all(0 <= x <= 100 for x in data)
    
    # 检查字符串(如果是字符串)
    if results['all_strings']:
        results['all_non_empty'] = all(len(x.strip()) > 0 for x in data)
        results['all_alpha'] = all(x.isalpha() for x in data)
    
    return results

# 测试数据验证
test_data1 = [85, 92, 78, 96]
test_data2 = ["张三", "李四", "王五"]
test_data3 = []

print("数字数据验证:", validate_data(test_data1))
print("字符串数据验证:", validate_data(test_data2))
print("空数据验证:", validate_data(test_data3))

39. 数据过滤和映射

# 数据过滤和映射
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用filter过滤
even_numbers = list(filter(lambda x: x % 2 == 0, data))
print(f"偶数: {even_numbers}")

# 使用map映射
squared_numbers = list(map(lambda x: x**2, data))
print(f"平方数: {squared_numbers}")

# 使用列表推导式(更Pythonic)
even_squares = [x**2 for x in data if x % 2 == 0]
print(f"偶数的平方: {even_squares}")

# 字符串处理
words = ["hello", "world", "python", "programming"]
# 过滤长度大于5的单词并转大写
long_words_upper = [word.upper() for word in words if len(word) > 5]
print(f"长单词大写: {long_words_upper}")

40. 数据分组

# 数据分组
from itertools import groupby
from collections import defaultdict

# 学生数据
students = [
    {"姓名": "张三", "班级": "A班", "分数": 85},
    {"姓名": "李四", "班级": "B班", "分数": 92},
    {"姓名": "王五", "班级": "A班", "分数": 78},
    {"姓名": "赵六", "班级": "B班", "分数": 96},
    {"姓名": "钱七", "班级": "A班", "分数": 89}
]

# 按班级分组
class_groups = defaultdict(list)
for student in students:
    class_groups[student["班级"]].append(student)

for class_name, students_in_class in class_groups.items():
    print(f"\n{class_name}:")
    for student in students_in_class:
        print(f"  {student['姓名']}: {student['分数']}分")
    
    # 计算班级平均分
    avg_score = sum(s["分数"] for s in students_in_class) / len(students_in_class)
    print(f"  平均分: {avg_score:.1f}")

控制结构练习

41. 条件判断基础

# 基础条件判断
score = 85

if score >= 90:
    grade = "优秀"
elif score >= 80:
    grade = "良好"
elif score >= 70:
    grade = "中等"
elif score >= 60:
    grade = "及格"
else:
    grade = "不及格"

print(f"分数: {score}, 等级: {grade}")

42. 多条件判断

# 多条件判断
age = 25
income = 50000
has_job = True

# 贷款审批条件
if age >= 18 and income >= 30000 and has_job:
    if age < 65 and income >= 50000:
        loan_amount = 500000
    else:
        loan_amount = 200000
    print(f"贷款审批通过,额度: {loan_amount}元")
else:
    print("贷款审批未通过")
    if age < 18:
        print("原因: 年龄不足")
    if income < 30000:
        print("原因: 收入不足")
    if not has_job:
        print("原因: 无工作")

43. 三元运算符

# 三元运算符(条件表达式)
a = 10
b = 20

# 传统if-else
if a > b:
    max_value = a
else:
    max_value = b

# 三元运算符
max_value_ternary = a if a > b else b

print(f"较大值: {max_value}")
print(f"三元运算符结果: {max_value_ternary}")

# 复杂的三元运算符
status = "成年人" if age >= 18 else "未成年人"
print(f"状态: {status}")

# 嵌套三元运算符
grade = "优" if score >= 90 else "良" if score >= 80 else "中" if score >= 70 else "差"
print(f"等级: {grade}")

44. for循环基础

# for循环基础用法
# 遍历数字
print("数字遍历:")
for i in range(5):
    print(f"数字: {i}")

# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
print("\n水果遍历:")
for fruit in fruits:
    print(f"水果: {fruit}")

# 遍历字符串
print("\n字符遍历:")
for char in "Python":
    print(f"字符: {char}")

# 带索引的遍历
print("\n带索引遍历:")
for index, fruit in enumerate(fruits):
    print(f"索引{index}: {fruit}")

45. for循环高级用法

# for循环高级用法
# range的不同用法
print("range(start, stop, step):")
for i in range(2, 10, 2):  # 从2开始,到10结束(不包含),步长为2
    print(f"偶数: {i}")

# 反向遍历
print("\n反向遍历:")
for i in range(10, 0, -1):
    print(f"倒数: {i}")

# 遍历多个列表
names = ["张三", "李四", "王五"]
ages = [25, 30, 35]
print("\n同时遍历多个列表:")
for name, age in zip(names, ages):
    print(f"{name}: {age}岁")

# 嵌套循环
print("\n九九乘法表:")
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # 换行

46. while循环

# while循环
# 基础while循环
count = 0
print("基础while循环:")
while count < 5:
    print(f"计数: {count}")
    count += 1

# 用户输入循环
print("\n猜数字游戏:")
import random
target = random.randint(1, 100)
guess_count = 0

while True:
    try:
        guess = int(input("请猜一个1-100的数字 (输入0退出): "))
        if guess == 0:
            print("游戏结束")
            break
        
        guess_count += 1
        
        if guess == target:
            print(f"恭喜!你猜对了!用了{guess_count}次")
            break
        elif guess < target:
            print("太小了")
        else:
            print("太大了")
            
    except ValueError:
        print("请输入有效数字")

47. break和continue

# break和continue的使用
# break示例
print("break示例 - 找到第一个偶数:")
numbers = [1, 3, 5, 8, 9, 10, 11]
for num in numbers:
    if num % 2 == 0:
        print(f"找到第一个偶数: {num}")
        break
    print(f"检查数字: {num}")

# continue示例
print("\ncontinue示例 - 跳过偶数:")
for num in range(1, 11):
    if num % 2 == 0:
        continue  # 跳过偶数
    print(f"奇数: {num}")

# 嵌套循环中的break和continue
print("\n嵌套循环示例:")
for i in range(3):
    print(f"外层循环: {i}")
    for j in range(5):
        if j == 3:
            break  # 只跳出内层循环
        print(f"  内层循环: {j}")

48. else子句

# for-else和while-else
# for-else: 循环正常结束时执行else
print("for-else示例:")
numbers = [2, 4, 6, 8, 10]
for num in numbers:
    if num % 2 != 0:
        print(f"找到奇数: {num}")
        break
else:
    print("所有数字都是偶数")

# while-else示例
print("\nwhile-else示例:")
count = 0
while count < 3:
    print(f"计数: {count}")
    count += 1
else:
    print("while循环正常结束")

# 带break的情况
print("\n带break的for-else:")
for num in range(10):
    if num == 5:
        print("找到5,跳出循环")
        break
    print(num)
else:
    print("这行不会执行,因为有break")

49. 循环优化

# 循环优化技巧
import time

# 避免重复计算
print("优化前 - 重复计算:")
start_time = time.time()
data = list(range(1000))
result = []
for i in range(len(data)):
    if len(data) > 500:  # 每次都计算len(data)
        result.append(data[i] * 2)
end_time = time.time()
print(f"耗时: {end_time - start_time:.6f}秒")

# 优化后 - 避免重复计算
print("\n优化后 - 避免重复计算:")
start_time = time.time()
data = list(range(1000))
result = []
data_len = len(data)  # 只计算一次
for i in range(data_len):
    if data_len > 500:
        result.append(data[i] * 2)
end_time = time.time()
print(f"耗时: {end_time - start_time:.6f}秒")

# 使用列表推导式
print("\n使用列表推导式:")
start_time = time.time()
data = list(range(1000))
result = [x * 2 for x in data if len(data) > 500]
end_time = time.time()
print(f"耗时: {end_time - start_time:.6f}秒")

50. 模式匹配(Python 3.10+)

# 模式匹配 (match-case)
def handle_data(data):
    match data:
        case int() if data > 0:
            return f"正整数: {data}"
        case int() if data < 0:
            return f"负整数: {data}"
        case 0:
            return "零"
        case str() if len(data) > 0:
            return f"非空字符串: {data}"
        case []:
            return "空列表"
        case [x] if isinstance(x, int):
            return f"包含一个整数的列表: {x}"
        case [x, y]:
            return f"包含两个元素的列表: {x}, {y}"
        case {"name": name, "age": age}:
            return f"包含姓名和年龄的字典: {name}, {age}岁"
        case _:
            return f"其他类型: {type(data)}"

# 测试模式匹配
test_cases = [
    42, -10, 0, "Hello", [], [5], [1, 2], 
    {"name": "张三", "age": 25}, (1, 2, 3)
]

print("模式匹配示例:")
for case in test_cases:
    result = handle_data(case)
    print(f"{case} -> {result}")

51. 异常处理基础

# 异常处理基础
def safe_divide(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("错误: 除数不能为零")
        return None
    except TypeError:
        print("错误: 参数类型不正确")
        return None
    except Exception as e:
        print(f"未知错误: {e}")
        return None
    finally:
        print("计算完成")

# 测试异常处理
print("异常处理测试:")
print(f"10 / 2 = {safe_divide(10, 2)}")
print(f"10 / 0 = {safe_divide(10, 0)}")
print(f"'10' / 2 = {safe_divide('10', 2)}")

52. 多重异常处理

# 多重异常处理
def process_user_input():
    try:
        # 获取用户输入
        num_str = input("请输入一个数字: ")
        num = float(num_str)
        
        # 计算平方根
        if num < 0:
            raise ValueError("不能计算负数的平方根")
        
        result = num ** 0.5
        print(f"{num} 的平方根是 {result:.2f}")
        
    except ValueError as e:
        if "could not convert" in str(e):
            print("错误: 输入的不是有效数字")
        else:
            print(f"数值错误: {e}")
    except KeyboardInterrupt:
        print("\n用户中断了程序")
    except Exception as e:
        print(f"未预期的错误: {e}")
    else:
        print("计算成功完成")
    finally:
        print("程序执行结束")

# process_user_input()  # 取消注释来运行

53. 自定义异常

# 自定义异常
class CustomError(Exception):
    """自定义异常基类"""
    pass

class AgeError(CustomError):
    """年龄相关异常"""
    def __init__(self, age, message="年龄值无效"):
        self.age = age
        self.message = message
        super().__init__(self.message)

class ScoreError(CustomError):
    """分数相关异常"""
    def __init__(self, score, message="分数值无效"):
        self.score = score
        self.message = message
        super().__init__(self.message)

def validate_student_info(name, age, score):
    """验证学生信息"""
    if not isinstance(name, str) or len(name.strip()) == 0:
        raise ValueError("姓名不能为空")
    
    if not isinstance(age, int) or age < 0 or age > 150:
        raise AgeError(age, f"年龄 {age} 不在有效范围内 (0-150)")
    
    if not isinstance(score, (int, float)) or score < 0 or score > 100:
        raise ScoreError(score, f"分数 {score} 不在有效范围内 (0-100)")
    
    return True

# 测试自定义异常
test_cases = [
    ("张三", 20, 85),
    ("", 20, 85),
    ("李四", -5, 85),
    ("王五", 20, 150)
]

for name, age, score in test_cases:
    try:
        validate_student_info(name, age, score)
        print(f"✓ {name} 的信息验证通过")
    except (ValueError, AgeError, ScoreError) as e:
        print(f"✗ 验证失败: {e}")

54. 断言

# 断言的使用
def calculate_average(numbers):
    """计算平均值"""
    # 使用断言检查前置条件
    assert isinstance(numbers, list), "参数必须是列表"
    assert len(numbers) > 0, "列表不能为空"
    assert all(isinstance(x, (int, float)) for x in numbers), "列表元素必须是数字"
    
    total = sum(numbers)
    average = total / len(numbers)
    
    # 使用断言检查后置条件
    assert isinstance(average, (int, float)), "平均值必须是数字"
    
    return average

# 测试断言
test_data = [
    [1, 2, 3, 4, 5],
    [],  # 空列表
    [1, 2, "3", 4],  # 包含非数字
    "not a list"  # 不是列表
]

for data in test_data:
    try:
        result = calculate_average(data)
        print(f"✓ {data} 的平均值: {result}")
    except AssertionError as e:
        print(f"✗ 断言失败: {e}")
    except Exception as e:
        print(f"✗ 其他错误: {e}")

55. 上下文管理器

# 上下文管理器
class Timer:
    """计时器上下文管理器"""
    def __init__(self, name="操作"):
        self.name = name
    
    def __enter__(self):
        import time
        self.start_time = time.time()
        print(f"开始 {self.name}...")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        import time
        end_time = time.time()
        duration = end_time - self.start_time
        print(f"{self.name} 完成,耗时: {duration:.4f}秒")
        
        if exc_type is not None:
            print(f"发生异常: {exc_type.__name__}: {exc_val}")
        return False  # 不抑制异常

# 使用上下文管理器
with Timer("数据处理"):
    # 模拟一些耗时操作
    import time
    time.sleep(0.1)
    data = [i**2 for i in range(1000)]
    print(f"处理了 {len(data)} 个数据")

# 使用contextlib简化上下文管理器
from contextlib import contextmanager

@contextmanager
def database_transaction():
    print("开始数据库事务")
    try:
        yield "数据库连接"
        print("提交事务")
    except Exception as e:
        print(f"回滚事务: {e}")
        raise
    finally:
        print("关闭数据库连接")

# 使用简化的上下文管理器
with database_transaction() as db:
    print(f"使用 {db} 执行操作")
    # 模拟数据库操作

56. 生成器基础

# 生成器基础
def number_generator(n):
    """生成0到n-1的数字"""
    for i in range(n):
        print(f"生成数字: {i}")
        yield i

# 使用生成器
print("生成器示例:")
gen = number_generator(5)
print(f"生成器对象: {gen}")

# 逐个获取值
for num in gen:
    print(f"接收到: {num}")

# 斐波那契数列生成器
def fibonacci_generator(n):
    """生成斐波那契数列的前n项"""
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

print("\n斐波那契数列:")
fib_gen = fibonacci_generator(10)
fib_numbers = list(fib_gen)
print(f"前10项: {fib_numbers}")

57. 生成器表达式

# 生成器表达式
# 与列表推导式的对比
print("列表推导式 vs 生成器表达式:")

# 列表推导式 - 立即创建所有元素
list_comp = [x**2 for x in range(10)]
print(f"列表推导式: {list_comp}")
print(f"内存占用: {list_comp.__sizeof__()} 字节")

# 生成器表达式 - 按需生成元素
gen_exp = (x**2 for x in range(10))
print(f"生成器表达式: {gen_exp}")
print(f"内存占用: {gen_exp.__sizeof__()} 字节")

# 使用生成器表达式
print("\n生成器表达式的值:")
for value in gen_exp:
    print(value, end=" ")
print()

# 大数据处理示例
def process_large_data():
    """处理大量数据的示例"""
    # 模拟大数据集
    large_data = range(1000000)
    
    # 使用生成器表达式节省内存
    even_squares = (x**2 for x in large_data if x % 2 == 0)
    
    # 只处理前10个结果
    result = []
    for i, value in enumerate(even_squares):
        if i >= 10:
            break
        result.append(value)
    
    return result

print("\n大数据处理结果:")
result = process_large_data()
print(f"前10个偶数的平方: {result}")

58. 迭代器

# 自定义迭代器
class CountDown:
    """倒计时迭代器"""
    def __init__(self, start):
        self.start = start
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.start <= 0:
            raise StopIteration
        self.start -= 1
        return self.start + 1

# 使用自定义迭代器
print("倒计时迭代器:")
countdown = CountDown(5)
for num in countdown:
    print(f"倒计时: {num}")

# 使用iter()函数
print("\n使用iter()函数:")
data = [1, 2, 3, 4, 5]
iterator = iter(data)

try:
    while True:
        value = next(iterator)
        print(f"迭代值: {value}")
except StopIteration:
    print("迭代结束")

# 无限迭代器
class InfiniteCounter:
    """无限计数器"""
    def __init__(self, start=0, step=1):
        self.current = start
        self.step = step
    
    def __iter__(self):
        return self
    
    def __next__(self):
        value = self.current
        self.current += self.step
        return value

# 使用无限迭代器(注意要有退出条件)
print("\n无限计数器(前10个值):")
counter = InfiniteCounter(1, 2)
for i, value in enumerate(counter):
    if i >= 10:
        break
    print(f"第{i+1}个值: {value}")

59. 装饰器基础

# 装饰器基础
def timer_decorator(func):
    """计时装饰器"""
    import time
    import functools
    
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 执行时间: {end_time - start_time:.4f}秒")
        return result
    return wrapper

def log_decorator(func):
    """日志装饰器"""
    import functools
    
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"调用函数: {func.__name__}")
        print(f"参数: args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        print(f"返回值: {result}")
        return result
    return wrapper

# 使用装饰器
@timer_decorator
@log_decorator
def calculate_sum(n):
    """计算1到n的和"""
    return sum(range(1, n + 1))

# 测试装饰器
print("装饰器测试:")
result = calculate_sum(1000)
print(f"最终结果: {result}")

60. 综合练习:学生管理系统

# 综合练习:简单的学生管理系统
class StudentManager:
    """学生管理系统"""
    
    def __init__(self):
        self.students = {}
    
    def add_student(self, student_id, name, age, scores=None):
        """添加学生"""
        if student_id in self.students:
            raise ValueError(f"学号 {student_id} 已存在")
        
        if not isinstance(age, int) or age < 0 or age > 150:
            raise ValueError("年龄必须是0-150之间的整数")
        
        self.students[student_id] = {
            "name": name,
            "age": age,
            "scores": scores or []
        }
        print(f"✓ 学生 {name} (学号: {student_id}) 添加成功")
    
    def remove_student(self, student_id):
        """删除学生"""
        if student_id not in self.students:
            raise ValueError(f"学号 {student_id} 不存在")
        
        name = self.students[student_id]["name"]
        del self.students[student_id]
        print(f"✓ 学生 {name} (学号: {student_id}) 删除成功")
    
    def update_student(self, student_id, **kwargs):
        """更新学生信息"""
        if student_id not in self.students:
            raise ValueError(f"学号 {student_id} 不存在")
        
        student = self.students[student_id]
        for key, value in kwargs.items():
            if key in ["name", "age", "scores"]:
                student[key] = value
        
        print(f"✓ 学生 {student['name']} 信息更新成功")
    
    def add_score(self, student_id, score):
        """添加成绩"""
        if student_id not in self.students:
            raise ValueError(f"学号 {student_id} 不存在")
        
        if not isinstance(score, (int, float)) or score < 0 or score > 100:
            raise ValueError("成绩必须是0-100之间的数字")
        
        self.students[student_id]["scores"].append(score)
        print(f"✓ 成绩 {score} 添加成功")
    
    def get_student_average(self, student_id):
        """获取学生平均分"""
        if student_id not in self.students:
            raise ValueError(f"学号 {student_id} 不存在")
        
        scores = self.students[student_id]["scores"]
        if not scores:
            return 0
        
        return sum(scores) / len(scores)
    
    def list_students(self):
        """列出所有学生"""
        if not self.students:
            print("暂无学生信息")
            return
        
        print("\n学生列表:")
        print("-" * 60)
        for student_id, info in self.students.items():
            avg_score = self.get_student_average(student_id)
            print(f"学号: {student_id}")
            print(f"姓名: {info['name']}")
            print(f"年龄: {info['age']}")
            print(f"成绩: {info['scores']}")
            print(f"平均分: {avg_score:.2f}")
            print("-" * 60)
    
    def search_student(self, keyword):
        """搜索学生"""
        results = []
        for student_id, info in self.students.items():
            if (keyword.lower() in info["name"].lower() or 
                keyword in student_id):
                results.append((student_id, info))
        
        if results:
            print(f"\n找到 {len(results)} 个匹配结果:")
            for student_id, info in results:
                print(f"学号: {student_id}, 姓名: {info['name']}")
        else:
            print("未找到匹配的学生")

# 测试学生管理系统
if __name__ == "__main__":
    sm = StudentManager()
    
    try:
        # 添加学生
        sm.add_student("2023001", "张三", 20)
        sm.add_student("2023002", "李四", 21)
        sm.add_student("2023003", "王五", 19)
        
        # 添加成绩
        sm.add_score("2023001", 85)
        sm.add_score("2023001", 92)
        sm.add_score("2023002", 78)
        sm.add_score("2023002", 88)
        
        # 列出所有学生
        sm.list_students()
        
        # 搜索学生
        sm.search_student("张")
        
    except ValueError as e:
        print(f"错误: {e}")

---

## 函数练习

### 61. 函数基础定义
```python
# 函数基础定义和调用
def greet(name):
    """问候函数"""
    return f"你好, {name}!"

def add_numbers(a, b):
    """加法函数"""
    return a + b

def get_user_info():
    """获取用户信息(无参数函数)"""
    name = input("请输入姓名: ")
    age = int(input("请输入年龄: "))
    return name, age

# 调用函数
print(greet("张三"))
print(f"5 + 3 = {add_numbers(5, 3)}")

# name, age = get_user_info()  # 取消注释来运行
# print(f"用户信息: {name}, {age}岁")

62. 参数类型

# 不同类型的参数
def function_parameters(required, default_param="默认值", *args, **kwargs):
    """演示不同类型的参数"""
    print(f"必需参数: {required}")
    print(f"默认参数: {default_param}")
    print(f"可变位置参数: {args}")
    print(f"可变关键字参数: {kwargs}")
    print("-" * 30)

# 测试不同的调用方式
function_parameters("必需值")
function_parameters("必需值", "自定义默认值")
function_parameters("必需值", "自定义默认值", 1, 2, 3)
function_parameters("必需值", extra1="额外1", extra2="额外2")
function_parameters("必需值", "自定义", 1, 2, name="张三", age=25)

63. 关键字参数

# 关键字参数和位置参数
def create_profile(name, age, city="未知", *, email, phone=None):
    """创建用户档案
    
    Args:
        name: 姓名(位置参数)
        age: 年龄(位置参数)
        city: 城市(默认参数)
        email: 邮箱(仅关键字参数)
        phone: 电话(仅关键字参数,可选)
    """
    profile = {
        "姓名": name,
        "年龄": age,
        "城市": city,
        "邮箱": email
    }
    
    if phone:
        profile["电话"] = phone
    
    return profile

# 正确的调用方式
profile1 = create_profile("张三", 25, email="zhang@example.com")
profile2 = create_profile("李四", 30, "北京", email="li@example.com", phone="123456789")

print("档案1:", profile1)
print("档案2:", profile2)

# 错误的调用方式(会报错)
# profile3 = create_profile("王五", 28, "上海", "wang@example.com")  # email必须用关键字

64. 函数作为参数

# 函数作为参数(高阶函数)
def apply_operation(numbers, operation):
    """对数字列表应用操作"""
    return [operation(num) for num in numbers]

def square(x):
    """平方函数"""
    return x ** 2

def cube(x):
    """立方函数"""
    return x ** 3

def double(x):
    """双倍函数"""
    return x * 2

# 使用函数作为参数
numbers = [1, 2, 3, 4, 5]

print(f"原数字: {numbers}")
print(f"平方: {apply_operation(numbers, square)}")
print(f"立方: {apply_operation(numbers, cube)}")
print(f"双倍: {apply_operation(numbers, double)}")

# 使用lambda函数
print(f"加10: {apply_operation(numbers, lambda x: x + 10)}")

65. 返回函数

# 返回函数(闭包)
def create_multiplier(factor):
    """创建乘法器函数"""
    def multiplier(x):
        return x * factor
    return multiplier

def create_counter(start=0):
    """创建计数器函数"""
    count = start
    
    def counter():
        nonlocal count
        count += 1
        return count
    
    return counter

# 使用返回的函数
double_func = create_multiplier(2)
triple_func = create_multiplier(3)

print(f"5 * 2 = {double_func(5)}")
print(f"5 * 3 = {triple_func(5)}")

# 使用计数器
counter1 = create_counter()
counter2 = create_counter(10)

print(f"计数器1: {counter1()}, {counter1()}, {counter1()}")
print(f"计数器2: {counter2()}, {counter2()}, {counter2()}")

66. 递归函数

# 递归函数
def factorial(n):
    """计算阶乘"""
    if n <= 1:
        return 1
    return n * factorial(n - 1)

def fibonacci(n):
    """计算斐波那契数列第n项"""
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

def fibonacci_memo(n, memo={}):
    """带记忆化的斐波那契数列"""
    if n in memo:
        return memo[n]
    if n <= 1:
        return n
    memo[n] = fibonacci_memo(n - 1, memo) + fibonacci_memo(n - 2, memo)
    return memo[n]

# 测试递归函数
print(f"5的阶乘: {factorial(5)}")
print(f"斐波那契数列前10项:")
for i in range(10):
    print(f"F({i}) = {fibonacci_memo(i)}")

67. 装饰器函数

# 装饰器函数
def retry(max_attempts=3):
    """重试装饰器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if attempt == max_attempts - 1:
                        raise e
                    print(f"第{attempt + 1}次尝试失败: {e}")
            return None
        return wrapper
    return decorator

def validate_types(**types):
    """类型验证装饰器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            # 验证位置参数
            import inspect
            sig = inspect.signature(func)
            bound_args = sig.bind(*args, **kwargs)
            bound_args.apply_defaults()
            
            for param_name, expected_type in types.items():
                if param_name in bound_args.arguments:
                    value = bound_args.arguments[param_name]
                    if not isinstance(value, expected_type):
                        raise TypeError(f"参数 {param_name} 应该是 {expected_type.__name__} 类型")
            
            return func(*args, **kwargs)
        return wrapper
    return decorator

# 使用装饰器
@retry(max_attempts=3)
def unreliable_function():
    import random
    if random.random() < 0.7:
        raise Exception("随机失败")
    return "成功!"

@validate_types(name=str, age=int)
def create_person(name, age):
    return f"创建了 {name}, 年龄 {age}"

# 测试装饰器
try:
    result = unreliable_function()
    print(f"结果: {result}")
except Exception as e:
    print(f"最终失败: {e}")

try:
    person = create_person("张三", 25)
    print(person)
    # person = create_person("李四", "25")  # 会报错
except TypeError as e:
    print(f"类型错误: {e}")

68. 生成器函数

# 生成器函数
def read_file_lines(filename):
    """逐行读取文件的生成器"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            for line_num, line in enumerate(file, 1):
                yield line_num, line.strip()
    except FileNotFoundError:
        print(f"文件 {filename} 不存在")

def prime_generator(limit):
    """生成质数的生成器"""
    def is_prime(n):
        if n < 2:
            return False
        for i in range(2, int(n ** 0.5) + 1):
            if n % i == 0:
                return False
        return True
    
    for num in range(2, limit + 1):
        if is_prime(num):
            yield num

def batch_generator(data, batch_size):
    """批量处理数据的生成器"""
    for i in range(0, len(data), batch_size):
        yield data[i:i + batch_size]

# 使用生成器
print("前20个质数:")
primes = list(prime_generator(100))
print(primes[:20])

print("\n批量处理数据:")
data = list(range(1, 21))
for batch in batch_generator(data, 5):
    print(f"批次: {batch}")

69. 函数注解

# 函数注解
def calculate_area(length: float, width: float) -> float:
    """计算矩形面积
    
    Args:
        length: 长度
        width: 宽度
    
    Returns:
        面积
    """
    return length * width

def process_data(data: list[int], multiplier: int = 2) -> list[int]:
    """处理数据"""
    return [x * multiplier for x in data]

from typing import Union, Optional, Dict, List

def advanced_function(
    name: str,
    age: int,
    scores: Optional[List[float]] = None,
    metadata: Dict[str, Union[str, int]] = None
) -> Dict[str, Union[str, int, float]]:
    """高级函数注解示例"""
    result = {
        "name": name,
        "age": age
    }
    
    if scores:
        result["average_score"] = sum(scores) / len(scores)
    
    if metadata:
        result.update(metadata)
    
    return result

# 使用带注解的函数
area = calculate_area(10.5, 8.2)
print(f"面积: {area}")

processed = process_data([1, 2, 3, 4, 5], 3)
print(f"处理后的数据: {processed}")

result = advanced_function(
    "张三", 
    25, 
    [85.5, 92.0, 78.5], 
    {"city": "北京", "grade": 3}
)
print(f"高级函数结果: {result}")

70. 偏函数

# 偏函数
from functools import partial

def power(base, exponent):
    """计算幂"""
    return base ** exponent

def log_message(level, message, timestamp=None):
    """记录日志"""
    import datetime
    if timestamp is None:
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"[{timestamp}] {level}: {message}")

# 创建偏函数
square = partial(power, exponent=2)
cube = partial(power, exponent=3)

info_log = partial(log_message, "INFO")
error_log = partial(log_message, "ERROR")
warning_log = partial(log_message, "WARNING")

# 使用偏函数
print(f"5的平方: {square(5)}")
print(f"3的立方: {cube(3)}")

info_log("程序启动")
warning_log("内存使用率较高")
error_log("数据库连接失败")

71. 函数缓存

# 函数缓存
from functools import lru_cache
import time

@lru_cache(maxsize=128)
def expensive_function(n):
    """模拟耗时计算"""
    print(f"计算 expensive_function({n})")
    time.sleep(0.1)  # 模拟耗时操作
    return n * n * n

def manual_cache(func):
    """手动实现缓存装饰器"""
    cache = {}
    
    def wrapper(*args, **kwargs):
        key = str(args) + str(sorted(kwargs.items()))
        if key not in cache:
            cache[key] = func(*args, **kwargs)
            print(f"缓存未命中,计算结果")
        else:
            print(f"缓存命中,直接返回")
        return cache[key]
    
    wrapper.cache = cache
    return wrapper

@manual_cache
def fibonacci_cached(n):
    """带缓存的斐波那契数列"""
    if n <= 1:
        return n
    return fibonacci_cached(n - 1) + fibonacci_cached(n - 2)

# 测试缓存
print("测试LRU缓存:")
start_time = time.time()
result1 = expensive_function(5)
print(f"第一次调用耗时: {time.time() - start_time:.3f}秒")

start_time = time.time()
result2 = expensive_function(5)  # 从缓存获取
print(f"第二次调用耗时: {time.time() - start_time:.3f}秒")

print("\n测试手动缓存:")
result = fibonacci_cached(10)
print(f"fibonacci(10) = {result}")

72. 函数组合

# 函数组合
def compose(*functions):
    """组合多个函数"""
    def composed_function(x):
        result = x
        for func in reversed(functions):
            result = func(result)
        return result
    return composed_function

def pipe(*functions):
    """管道式函数组合"""
    def piped_function(x):
        result = x
        for func in functions:
            result = func(result)
        return result
    return piped_function

# 基础函数
def add_ten(x):
    return x + 10

def multiply_by_two(x):
    return x * 2

def square(x):
    return x ** 2

# 组合函数
composed = compose(square, multiply_by_two, add_ten)
piped = pipe(add_ten, multiply_by_two, square)

# 测试函数组合
test_value = 5
print(f"原值: {test_value}")
print(f"组合函数结果: {composed(test_value)}")  # ((5+10)*2)^2 = 900
print(f"管道函数结果: {piped(test_value)}")      # ((5+10)*2)^2 = 900

# 链式调用示例
class Calculator:
    def __init__(self, value=0):
        self.value = value
    
    def add(self, x):
        self.value += x
        return self
    
    def multiply(self, x):
        self.value *= x
        return self
    
    def power(self, x):
        self.value **= x
        return self
    
    def result(self):
        return self.value

# 链式调用
result = Calculator(5).add(10).multiply(2).power(2).result()
print(f"链式调用结果: {result}")

73. 异步函数基础

# 异步函数基础(需要Python 3.7+)
import asyncio
import time

async def async_task(name, duration):
    """异步任务"""
    print(f"任务 {name} 开始")
    await asyncio.sleep(duration)  # 模拟异步操作
    print(f"任务 {name} 完成")
    return f"任务 {name} 的结果"

async def fetch_data(url):
    """模拟异步获取数据"""
    print(f"开始获取 {url}")
    await asyncio.sleep(1)  # 模拟网络请求
    return f"来自 {url} 的数据"

async def main():
    """主异步函数"""
    print("开始异步操作")
    
    # 并发执行多个任务
    tasks = [
        async_task("任务1", 2),
        async_task("任务2", 1),
        async_task("任务3", 3)
    ]
    
    results = await asyncio.gather(*tasks)
    print(f"所有任务完成: {results}")
    
    # 并发获取数据
    urls = ["http://api1.com", "http://api2.com", "http://api3.com"]
    data_tasks = [fetch_data(url) for url in urls]
    data_results = await asyncio.gather(*data_tasks)
    print(f"获取的数据: {data_results}")

# 运行异步函数
if __name__ == "__main__":
    start_time = time.time()
    # asyncio.run(main())  # 取消注释来运行
    print(f"总耗时: {time.time() - start_time:.2f}秒")

74. 函数性能分析

# 函数性能分析
import time
import functools
from memory_profiler import profile  # 需要安装: pip install memory-profiler

def timing_decorator(func):
    """计时装饰器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        print(f"{func.__name__} 执行时间: {end_time - start_time:.6f}秒")
        return result
    return wrapper

def memory_usage_decorator(func):
    """内存使用装饰器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        import tracemalloc
        tracemalloc.start()
        result = func(*args, **kwargs)
        current, peak = tracemalloc.get_traced_memory()
        tracemalloc.stop()
        print(f"{func.__name__} 内存使用: 当前 {current / 1024 / 1024:.2f}MB, 峰值 {peak / 1024 / 1024:.2f}MB")
        return result
    return wrapper

@timing_decorator
@memory_usage_decorator
def list_comprehension_test(n):
    """列表推导式性能测试"""
    return [x**2 for x in range(n)]

@timing_decorator
@memory_usage_decorator
def generator_test(n):
    """生成器性能测试"""
    return list(x**2 for x in range(n))

@timing_decorator
def loop_test(n):
    """循环性能测试"""
    result = []
    for x in range(n):
        result.append(x**2)
    return result

# 性能测试
print("性能测试 (n=100000):")
n = 100000

result1 = list_comprehension_test(n)
result2 = generator_test(n)
result3 = loop_test(n)

print(f"结果长度: {len(result1)}, {len(result2)}, {len(result3)}")

75. 函数文档和测试

# 函数文档和测试
def calculate_bmi(weight, height):
    """
    计算身体质量指数(BMI)
    
    Args:
        weight (float): 体重,单位为千克
        height (float): 身高,单位为米
    
    Returns:
        float: BMI值
    
    Raises:
        ValueError: 当体重或身高为负数或零时
    
    Examples:
        >>> calculate_bmi(70, 1.75)
        22.857142857142858
        >>> calculate_bmi(80, 1.8)
        24.691358024691358
    """
    if weight <= 0 or height <= 0:
        raise ValueError("体重和身高必须为正数")
    
    bmi = weight / (height ** 2)
    return bmi

def get_bmi_category(bmi):
    """
    根据BMI值获取体重分类
    
    Args:
        bmi (float): BMI值
    
    Returns:
        str: 体重分类
    
    Examples:
        >>> get_bmi_category(18.5)
        '正常体重'
        >>> get_bmi_category(25)
        '超重'
    """
    if bmi < 18.5:
        return "体重过轻"
    elif bmi < 24:
        return "正常体重"
    elif bmi < 28:
        return "超重"
    else:
        return "肥胖"

# 单元测试
import unittest

class TestBMIFunctions(unittest.TestCase):
    def test_calculate_bmi(self):
        """测试BMI计算"""
        self.assertAlmostEqual(calculate_bmi(70, 1.75), 22.857, places=3)
        self.assertAlmostEqual(calculate_bmi(80, 1.8), 24.691, places=3)
    
    def test_calculate_bmi_invalid_input(self):
        """测试无效输入"""
        with self.assertRaises(ValueError):
            calculate_bmi(-70, 1.75)
        with self.assertRaises(ValueError):
            calculate_bmi(70, 0)
    
    def test_get_bmi_category(self):
        """测试BMI分类"""
        self.assertEqual(get_bmi_category(17), "体重过轻")
        self.assertEqual(get_bmi_category(20), "正常体重")
        self.assertEqual(get_bmi_category(26), "超重")
        self.assertEqual(get_bmi_category(30), "肥胖")

# 运行测试
if __name__ == "__main__":
    # 运行doctest
    import doctest
    doctest.testmod()
    
    # 运行unittest
    unittest.main(argv=[''], exit=False)
    
    # 实际使用示例
    try:
        weight = 70
        height = 1.75
        bmi = calculate_bmi(weight, height)
        category = get_bmi_category(bmi)
        print(f"\n体重: {weight}kg, 身高: {height}m")
        print(f"BMI: {bmi:.2f}, 分类: {category}")
    except ValueError as e:
        print(f"错误: {e}")

76. 函数式编程

# 函数式编程
from functools import reduce
from operator import add, mul

# 高阶函数
def map_reduce_filter_example():
    """map, reduce, filter示例"""
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    # map: 应用函数到每个元素
    squared = list(map(lambda x: x**2, numbers))
    print(f"平方: {squared}")
    
    # filter: 过滤元素
    evens = list(filter(lambda x: x % 2 == 0, numbers))
    print(f"偶数: {evens}")
    
    # reduce: 累积操作
    sum_all = reduce(add, numbers)
    product_all = reduce(mul, numbers)
    print(f"求和: {sum_all}")
    print(f"求积: {product_all}")
    
    # 组合使用
    result = reduce(add, map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers)))
    print(f"偶数平方和: {result}")

# 纯函数示例
def pure_function(x, y):
    """纯函数:相同输入总是产生相同输出,无副作用"""
    return x * 2 + y

# 不纯函数示例
counter = 0
def impure_function(x):
    """不纯函数:有副作用"""
    global counter
    counter += 1
    return x + counter

# 柯里化
def curry_add(x):
    """柯里化加法函数"""
    def add_x(y):
        return x + y
    return add_x

# 测试函数式编程
map_reduce_filter_example()

print(f"\n纯函数测试:")
print(f"pure_function(3, 4) = {pure_function(3, 4)}")
print(f"pure_function(3, 4) = {pure_function(3, 4)}")  # 结果相同

print(f"\n不纯函数测试:")
print(f"impure_function(5) = {impure_function(5)}")
print(f"impure_function(5) = {impure_function(5)}")  # 结果不同

print(f"\n柯里化测试:")
add_5 = curry_add(5)
print(f"add_5(3) = {add_5(3)}")
print(f"add_5(7) = {add_5(7)}")

77. 动态函数创建

# 动态函数创建
def create_validator(min_val, max_val):
    """创建验证器函数"""
    def validator(value):
        return min_val <= value <= max_val
    
    validator.__name__ = f"validate_{min_val}_to_{max_val}"
    validator.__doc__ = f"验证值是否在 {min_val}{max_val} 之间"
    return validator

def create_operation(operation):
    """根据字符串创建运算函数"""
    operations = {
        'add': lambda x, y: x + y,
        'sub': lambda x, y: x - y,
        'mul': lambda x, y: x * y,
        'div': lambda x, y: x / y if y != 0 else None
    }
    return operations.get(operation)

# 使用exec动态创建函数
def create_function_from_string(func_name, func_body):
    """从字符串创建函数"""
    func_code = f"""
def {func_name}(x):
    {func_body}
"""
    
    local_vars = {}
    exec(func_code, globals(), local_vars)
    return local_vars[func_name]

# 测试动态函数创建
age_validator = create_validator(0, 150)
score_validator = create_validator(0, 100)

print(f"年龄验证 25: {age_validator(25)}")
print(f"年龄验证 200: {age_validator(200)}")
print(f"分数验证 85: {score_validator(85)}")
print(f"分数验证 150: {score_validator(150)}")

# 动态运算
add_func = create_operation('add')
mul_func = create_operation('mul')

print(f"\n动态运算:")
print(f"5 + 3 = {add_func(5, 3)}")
print(f"5 * 3 = {mul_func(5, 3)}")

# 从字符串创建函数
square_func = create_function_from_string('square', 'return x * x')
cube_func = create_function_from_string('cube', 'return x ** 3')

print(f"\n从字符串创建的函数:")
print(f"square(5) = {square_func(5)}")
print(f"cube(3) = {cube_func(3)}")

78. 函数重载模拟

# 函数重载模拟
from functools import singledispatch
from typing import Union

class FunctionOverloader:
    """函数重载器"""
    def __init__(self):
        self.functions = {}
    
    def register(self, *types):
        """注册函数重载"""
        def decorator(func):
            key = tuple(types)
            self.functions[key] = func
            return func
        return decorator
    
    def __call__(self, *args):
        """调用匹配的函数"""
        arg_types = tuple(type(arg) for arg in args)
        
        # 精确匹配
        if arg_types in self.functions:
            return self.functions[arg_types](*args)
        
        # 尝试兼容匹配
        for types, func in self.functions.items():
            if len(types) == len(args):
                if all(isinstance(arg, expected_type) for arg, expected_type in zip(args, types)):
                    return func(*args)
        
        raise TypeError(f"没有找到匹配的函数重载: {arg_types}")

# 使用singledispatch实现重载
@singledispatch
def process_data(data):
    """处理数据的通用函数"""
    return f"处理未知类型数据: {type(data)}"

@process_data.register
def _(data: int):
    """处理整数"""
    return f"处理整数: {data * 2}"

@process_data.register
def _(data: str):
    """处理字符串"""
    return f"处理字符串: {data.upper()}"

@process_data.register
def _(data: list):
    """处理列表"""
    return f"处理列表: {len(data)} 个元素"

# 自定义重载器
calculate = FunctionOverloader()

@calculate.register(int, int)
def add_ints(a, b):
    return a + b

@calculate.register(str, str)
def add_strings(a, b):
    return a + " " + b

@calculate.register(list, list)
def add_lists(a, b):
    return a + b

# 测试函数重载
print("singledispatch测试:")
print(process_data(42))
print(process_data("hello"))
print(process_data([1, 2, 3]))
print(process_data(3.14))

print("\n自定义重载器测试:")
print(calculate(5, 3))
print(calculate("Hello", "World"))
print(calculate([1, 2], [3, 4]))

try:
    print(calculate(5, "3"))  # 会报错
except TypeError as e:
    print(f"错误: {e}")

79. 函数元编程

# 函数元编程
import inspect
from types import FunctionType

def function_inspector(func):
    """函数检查器"""
    print(f"函数名: {func.__name__}")
    print(f"文档字符串: {func.__doc__}")
    print(f"模块: {func.__module__}")
    
    # 获取函数签名
    sig = inspect.signature(func)
    print(f"签名: {sig}")
    
    # 获取参数信息
    for param_name, param in sig.parameters.items():
        print(f"  参数 {param_name}: {param.kind}, 默认值: {param.default}")
    
    # 获取源代码
    try:
        source = inspect.getsource(func)
        print(f"源代码:\n{source}")
    except OSError:
        print("无法获取源代码")

def modify_function(func, new_name=None, new_doc=None):
    """修改函数属性"""
    if new_name:
        func.__name__ = new_name
    if new_doc:
        func.__doc__ = new_doc
    return func

def create_function_dynamically(name, args, body, globals_dict=None):
    """动态创建函数"""
    if globals_dict is None:
        globals_dict = {}
    
    # 创建函数代码
    func_code = f"def {name}({', '.join(args)}):\n    {body}"
    
    # 编译并执行
    compiled = compile(func_code, '<dynamic>', 'exec')
    local_dict = {}
    exec(compiled, globals_dict, local_dict)
    
    return local_dict[name]

# 函数装饰器工厂
def create_decorator(before_func=None, after_func=None):
    """创建装饰器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            if before_func:
                before_func(func.__name__, args, kwargs)
            
            result = func(*args, **kwargs)
            
            if after_func:
                after_func(func.__name__, result)
            
            return result
        return wrapper
    return decorator

# 测试函数
def sample_function(x: int, y: str = "default") -> str:
    """示例函数"""
    return f"{y}: {x}"

# 测试元编程
print("函数检查:")
function_inspector(sample_function)

# 修改函数
modified_func = modify_function(sample_function, "new_sample", "新的文档字符串")
print(f"\n修改后的函数名: {modified_func.__name__}")
print(f"修改后的文档: {modified_func.__doc__}")

# 动态创建函数
dynamic_func = create_function_dynamically(
    "multiply", 
    ["a", "b"], 
    "return a * b"
)
print(f"\n动态函数结果: {dynamic_func(5, 3)}")

# 使用装饰器工厂
def log_before(func_name, args, kwargs):
    print(f"调用 {func_name},参数: {args}, {kwargs}")

def log_after(func_name, result):
    print(f"{func_name} 返回: {result}")

logging_decorator = create_decorator(log_before, log_after)

@logging_decorator
def test_function(x, y):
    return x + y

print("\n装饰器测试:")
result = test_function(10, 20)

80. 函数性能优化

# 函数性能优化
import time
import sys
from functools import lru_cache, wraps

# 尾递归优化
class TailRecursionOptimizer:
    """尾递归优化器"""
    def __init__(self, func):
        self.func = func
        self.firstcall = True
        self.CONTINUE = object()
    
    def __call__(self, *args, **kwargs):
        if self.firstcall:
            func = self.func
            CONTINUE = self.CONTINUE
            self.firstcall = False
            try:
                while True:
                    result = func(*args, **kwargs)
                    if result is CONTINUE:
                        continue
                    else:
                        return result
            finally:
                self.firstcall = True
        else:
            return self.CONTINUE

# 记忆化装饰器
def memoize(func):
    """记忆化装饰器"""
    cache = {}
    
    @wraps(func)
    def wrapper(*args, **kwargs):
        key = str(args) + str(sorted(kwargs.items()))
        if key not in cache:
            cache[key] = func(*args, **kwargs)
        return cache[key]
    
    wrapper.cache = cache
    wrapper.cache_clear = cache.clear
    return wrapper

# 性能测试函数
def performance_test(func, *args, iterations=1000):
    """性能测试"""
    start_time = time.perf_counter()
    for _ in range(iterations):
        result = func(*args)
    end_time = time.perf_counter()
    
    avg_time = (end_time - start_time) / iterations
    return result, avg_time

# 普通递归斐波那契
def fibonacci_recursive(n):
    if n <= 1:
        return n
    return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

# 记忆化斐波那契
@memoize
def fibonacci_memoized(n):
    if n <= 1:
        return n
    return fibonacci_memoized(n - 1) + fibonacci_memoized(n - 2)

# 迭代斐波那契
def fibonacci_iterative(n):
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

# 尾递归斐波那契
@TailRecursionOptimizer
def fibonacci_tail_recursive(n, a=0, b=1):
    if n == 0:
        return a
    if n == 1:
        return b
    return fibonacci_tail_recursive(n - 1, b, a + b)

# 性能比较
print("斐波那契数列性能比较 (n=30):")
n = 30

# 测试不同实现
result1, time1 = performance_test(fibonacci_iterative, n, 1000)
print(f"迭代版本: 结果={result1}, 平均时间={time1:.6f}秒")

result2, time2 = performance_test(fibonacci_memoized, n, 1000)
print(f"记忆化版本: 结果={result2}, 平均时间={time2:.6f}秒")

result3, time3 = performance_test(fibonacci_tail_recursive, n, 1000)
print(f"尾递归版本: 结果={result3}, 平均时间={time3:.6f}秒")

# 普通递归版本太慢,只测试一次
start = time.perf_counter()
result4 = fibonacci_recursive(n)
time4 = time.perf_counter() - start
print(f"普通递归版本: 结果={result4}, 时间={time4:.6f}秒")

# 内存使用优化示例
def memory_efficient_sum(numbers):
    """内存高效的求和(使用生成器)"""
    return sum(x for x in numbers)

def memory_inefficient_sum(numbers):
    """内存低效的求和(创建中间列表)"""
    return sum([x for x in numbers])

# 比较内存使用
import tracemalloc

def measure_memory(func, *args):
    """测量内存使用"""
    tracemalloc.start()
    result = func(*args)
    current, peak = tracemalloc.get_traced_memory()
    tracemalloc.stop()
    return result, current, peak

test_data = range(1000000)

print("\n内存使用比较:")
result1, current1, peak1 = measure_memory(memory_efficient_sum, test_data)
print(f"高效版本: 当前={current1/1024/1024:.2f}MB, 峰值={peak1/1024/1024:.2f}MB")

result2, current2, peak2 = measure_memory(memory_inefficient_sum, test_data)
print(f"低效版本: 当前={current2/1024/1024:.2f}MB, 峰值={peak2/1024/1024:.2f}MB")

面向对象练习

81. 类的基础定义

# 类的基础定义
class Person:
    """人员类"""
    
    # 类变量
    species = "Homo sapiens"
    population = 0
    
    def __init__(self, name, age, gender):
        """初始化方法"""
        self.name = name        # 实例变量
        self.age = age
        self.gender = gender
        Person.population += 1  # 更新类变量
    
    def introduce(self):
        """自我介绍方法"""
        return f"我是{self.name},今年{self.age}岁,性别{self.gender}"
    
    def have_birthday(self):
        """过生日方法"""
        self.age += 1
        print(f"{self.name}过生日了!现在{self.age}岁")
    
    @classmethod
    def get_population(cls):
        """类方法:获取人口数量"""
        return cls.population
    
    @staticmethod
    def is_adult(age):
        """静态方法:判断是否成年"""
        return age >= 18
    
    def __str__(self):
        """字符串表示"""
        return f"Person(name='{self.name}', age={self.age}, gender='{self.gender}')"
    
    def __repr__(self):
        """开发者表示"""
        return f"Person('{self.name}', {self.age}, '{self.gender}')"

# 使用类
print("创建Person对象:")
person1 = Person("张三", 25, "男")
person2 = Person("李四", 30, "女")

print(person1.introduce())
print(person2.introduce())

person1.have_birthday()
print(f"当前人口: {Person.get_population()}")
print(f"张三是否成年: {Person.is_adult(person1.age)}")
print(f"15岁是否成年: {Person.is_adult(15)}")

print(f"\nstr表示: {str(person1)}")
print(f"repr表示: {repr(person1)}")

82. 类的继承

# 类的继承
class Animal:
    """动物基类"""
    
    def __init__(self, name, species):
        self.name = name
        self.species = species
    
    def make_sound(self):
        """发出声音(抽象方法)"""
        pass
    
    def move(self):
        """移动"""
        return f"{self.name}正在移动"
    
    def info(self):
        """基本信息"""
        return f"{self.name}是一只{self.species}"

class Dog(Animal):
    """狗类,继承自Animal"""
    
    def __init__(self, name, breed):
        super().__init__(name, "狗")
        self.breed = breed
    
    def make_sound(self):
        """重写父类方法"""
        return f"{self.name}汪汪叫"
    
    def fetch(self):
        """狗特有的方法"""
        return f"{self.name}去捡球"

class Cat(Animal):
    """猫类,继承自Animal"""
    
    def __init__(self, name, color):
        super().__init__(name, "猫")
        self.color = color
    
    def make_sound(self):
        """重写父类方法"""
        return f"{self.name}喵喵叫"
    
    def climb(self):
        """猫特有的方法"""
        return f"{self.name}爬树"

# 使用继承
dog = Dog("旺财", "金毛")
cat = Cat("咪咪", "橘色")

print("继承示例:")
print(dog.info())
print(dog.make_sound())
print(dog.move())
print(dog.fetch())

print("\n" + cat.info())
print(cat.make_sound())
print(cat.move())
print(cat.climb())

# 多态性
animals = [dog, cat]
print("\n多态性演示:")
for animal in animals:
    print(f"{animal.name}: {animal.make_sound()}")

83. 类的多重继承

# 多重继承
class Flyable:
    """可飞行的混入类"""
    
    def fly(self):
        return f"{self.name}正在飞行"
    
    def land(self):
        return f"{self.name}降落了"

class Swimmable:
    """可游泳的混入类"""
    
    def swim(self):
        return f"{self.name}正在游泳"
    
    def dive(self):
        return f"{self.name}潜水了"

class Bird(Animal, Flyable):
    """鸟类,多重继承"""
    
    def __init__(self, name, wing_span):
        super().__init__(name, "鸟")
        self.wing_span = wing_span
    
    def make_sound(self):
        return f"{self.name}啾啾叫"

class Duck(Bird, Swimmable):
    """鸭子类,多重继承"""
    
    def __init__(self, name):
        super().__init__(name, "中等")
    
    def make_sound(self):
        return f"{self.name}嘎嘎叫"

# 使用多重继承
duck = Duck("唐老鸭")

print("多重继承示例:")
print(duck.info())
print(duck.make_sound())
print(duck.move())
print(duck.fly())
print(duck.swim())
print(duck.dive())

# 查看方法解析顺序
print(f"\nMRO: {Duck.__mro__}")

84. 属性装饰器

# 属性装饰器
class Circle:
    """圆形类"""
    
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        """半径属性"""
        return self._radius
    
    @radius.setter
    def radius(self, value):
        """设置半径"""
        if value <= 0:
            raise ValueError("半径必须大于0")
        self._radius = value
    
    @property
    def area(self):
        """面积属性(只读)"""
        import math
        return math.pi * self._radius ** 2
    
    @property
    def circumference(self):
        """周长属性(只读)"""
        import math
        return 2 * math.pi * self._radius
    
    def __str__(self):
        return f"Circle(radius={self.radius})"

class Temperature:
    """温度类"""
    
    def __init__(self, celsius=0):
        self._celsius = celsius
    
    @property
    def celsius(self):
        """摄氏度"""
        return self._celsius
    
    @celsius.setter
    def celsius(self, value):
        if value < -273.15:
            raise ValueError("温度不能低于绝对零度")
        self._celsius = value
    
    @property
    def fahrenheit(self):
        """华氏度"""
        return self._celsius * 9/5 + 32
    
    @fahrenheit.setter
    def fahrenheit(self, value):
        self.celsius = (value - 32) * 5/9
    
    @property
    def kelvin(self):
        """开尔文"""
        return self._celsius + 273.15
    
    @kelvin.setter
    def kelvin(self, value):
        self.celsius = value - 273.15

# 使用属性装饰器
print("属性装饰器示例:")
circle = Circle(5)
print(f"圆: {circle}")
print(f"面积: {circle.area:.2f}")
print(f"周长: {circle.circumference:.2f}")

circle.radius = 10
print(f"\n修改半径后: {circle}")
print(f"面积: {circle.area:.2f}")

temp = Temperature(25)
print(f"\n温度转换:")
print(f"摄氏度: {temp.celsius}°C")
print(f"华氏度: {temp.fahrenheit:.1f}°F")
print(f"开尔文: {temp.kelvin:.1f}K")

temp.fahrenheit = 100
print(f"\n设置华氏度100°F后:")
print(f"摄氏度: {temp.celsius:.1f}°C")

85. 特殊方法(魔术方法)

# 特殊方法
class Vector:
    """向量类"""
    
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        """字符串表示"""
        return f"Vector({self.x}, {self.y})"
    
    def __repr__(self):
        """开发者表示"""
        return f"Vector({self.x!r}, {self.y!r})"
    
    def __add__(self, other):
        """向量加法"""
        if isinstance(other, Vector):
            return Vector(self.x + other.x, self.y + other.y)
        return NotImplemented
    
    def __sub__(self, other):
        """向量减法"""
        if isinstance(other, Vector):
            return Vector(self.x - other.x, self.y - other.y)
        return NotImplemented
    
    def __mul__(self, scalar):
        """标量乘法"""
        if isinstance(scalar, (int, float)):
            return Vector(self.x * scalar, self.y * scalar)
        return NotImplemented
    
    def __rmul__(self, scalar):
        """右乘法"""
        return self.__mul__(scalar)
    
    def __eq__(self, other):
        """相等比较"""
        if isinstance(other, Vector):
            return self.x == other.x and self.y == other.y
        return False
    
    def __abs__(self):
        """向量长度"""
        return (self.x ** 2 + self.y ** 2) ** 0.5
    
    def __bool__(self):
        """布尔值"""
        return bool(abs(self))
    
    def __getitem__(self, index):
        """索引访问"""
        if index == 0:
            return self.x
        elif index == 1:
            return self.y
        else:
            raise IndexError("向量索引超出范围")
    
    def __setitem__(self, index, value):
        """索引设置"""
        if index == 0:
            self.x = value
        elif index == 1:
            self.y = value
        else:
            raise IndexError("向量索引超出范围")
    
    def __len__(self):
        """长度(维度)"""
        return 2

# 使用特殊方法
print("特殊方法示例:")
v1 = Vector(3, 4)
v2 = Vector(1, 2)

print(f"v1 = {v1}")
print(f"v2 = {v2}")
print(f"v1 + v2 = {v1 + v2}")
print(f"v1 - v2 = {v1 - v2}")
print(f"v1 * 2 = {v1 * 2}")
print(f"3 * v1 = {3 * v1}")
print(f"|v1| = {abs(v1)}")
print(f"v1 == v2: {v1 == v2}")
print(f"bool(v1): {bool(v1)}")
print(f"bool(Vector(0, 0)): {bool(Vector(0, 0))}")
print(f"v1[0] = {v1[0]}, v1[1] = {v1[1]}")
print(f"len(v1) = {len(v1)}")

v1[0] = 5
print(f"修改后 v1 = {v1}")

86. 类的组合

# 类的组合
class Engine:
    """引擎类"""
    
    def __init__(self, power, fuel_type):
        self.power = power  # 功率
        self.fuel_type = fuel_type  # 燃料类型
        self.running = False
    
    def start(self):
        """启动引擎"""
        self.running = True
        return f"引擎启动,功率{self.power}马力"
    
    def stop(self):
        """停止引擎"""
        self.running = False
        return "引擎停止"
    
    def __str__(self):
        status = "运行中" if self.running else "停止"
        return f"Engine({self.power}HP, {self.fuel_type}, {status})"

class Wheel:
    """轮子类"""
    
    def __init__(self, size, brand):
        self.size = size
        self.brand = brand
    
    def __str__(self):
        return f"Wheel({self.size}inch, {self.brand})"

class Car:
    """汽车类(组合)"""
    
    def __init__(self, make, model, engine, wheels):
        self.make = make
        self.model = model
        self.engine = engine  # 组合引擎
        self.wheels = wheels  # 组合轮子列表
        self.speed = 0
    
    def start(self):
        """启动汽车"""
        return self.engine.start()
    
    def stop(self):
        """停止汽车"""
        self.speed = 0
        return self.engine.stop()
    
    def accelerate(self, increment):
        """加速"""
        if self.engine.running:
            self.speed += increment
            return f"加速到{self.speed}km/h"
        return "请先启动引擎"
    
    def brake(self, decrement):
        """刹车"""
        self.speed = max(0, self.speed - decrement)
        return f"减速到{self.speed}km/h"
    
    def info(self):
        """汽车信息"""
        wheel_info = ", ".join(str(wheel) for wheel in self.wheels)
        return f"{self.make} {self.model}\n引擎: {self.engine}\n轮子: {wheel_info}\n速度: {self.speed}km/h"

# 使用组合
print("类的组合示例:")
engine = Engine(200, "汽油")
wheels = [Wheel(18, "米其林") for _ in range(4)]
car = Car("丰田", "凯美瑞", engine, wheels)

print(car.info())
print("\n" + car.start())
print(car.accelerate(50))
print(car.accelerate(30))
print(car.brake(20))
print("\n" + car.info())
print(car.stop())

87. 抽象基类

# 抽象基类
from abc import ABC, abstractmethod

class Shape(ABC):
    """抽象形状类"""
    
    @abstractmethod
    def area(self):
        """计算面积(抽象方法)"""
        pass
    
    @abstractmethod
    def perimeter(self):
        """计算周长(抽象方法)"""
        pass
    
    def description(self):
        """具体方法"""
        return f"这是一个{self.__class__.__name__}"

class Rectangle(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 __str__(self):
        return f"Rectangle({self.width}x{self.height})"

class Circle(Shape):
    """圆形类"""
    
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        """实现抽象方法"""
        import math
        return math.pi * self.radius ** 2
    
    def perimeter(self):
        """实现抽象方法"""
        import math
        return 2 * math.pi * self.radius
    
    def __str__(self):
        return f"Circle(radius={self.radius})"

def print_shape_info(shape):
    """打印形状信息"""
    print(f"{shape}")
    print(f"描述: {shape.description()}")
    print(f"面积: {shape.area():.2f}")
    print(f"周长: {shape.perimeter():.2f}")
    print()

# 使用抽象基类
print("抽象基类示例:")
rectangle = Rectangle(5, 3)
circle = Circle(4)

shapes = [rectangle, circle]
for shape in shapes:
    print_shape_info(shape)

# 尝试实例化抽象类会报错
# shape = Shape()  # TypeError

88. 单例模式

# 单例模式
class Singleton:
    """单例模式实现"""
    _instance = None
    _initialized = False
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
    
    def __init__(self):
        if not self._initialized:
            self.value = 0
            self._initialized = True
    
    def increment(self):
        self.value += 1
    
    def get_value(self):
        return self.value

class DatabaseConnection:
    """数据库连接单例"""
    _instance = None
    _lock = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.connected = False
            cls._instance.connection_count = 0
        return cls._instance
    
    def connect(self):
        """连接数据库"""
        if not self.connected:
            self.connected = True
            self.connection_count += 1
            return f"数据库连接成功,连接次数: {self.connection_count}"
        return "数据库已连接"
    
    def disconnect(self):
        """断开连接"""
        if self.connected:
            self.connected = False
            return "数据库连接已断开"
        return "数据库未连接"
    
    def query(self, sql):
        """执行查询"""
        if self.connected:
            return f"执行SQL: {sql}"
        return "请先连接数据库"

# 使用单例模式
print("单例模式示例:")
s1 = Singleton()
s2 = Singleton()

print(f"s1 is s2: {s1 is s2}")  # True
print(f"s1.get_value(): {s1.get_value()}")

s1.increment()
print(f"s1.increment()后 s2.get_value(): {s2.get_value()}")

db1 = DatabaseConnection()
db2 = DatabaseConnection()

print(f"\ndb1 is db2: {db1 is db2}")  # True
print(db1.connect())
print(db2.connect())  # 已连接
print(db1.query("SELECT * FROM users"))
print(db2.disconnect())
print(db1.query("SELECT * FROM users"))  # 需要重新连接

89. 上下文管理器

# 上下文管理器
class FileManager:
    """文件管理器上下文管理器"""
    
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
    
    def __enter__(self):
        """进入上下文"""
        print(f"打开文件: {self.filename}")
        self.file = open(self.filename, self.mode, encoding='utf-8')
        return self.file
    
    def __exit__(self, exc_type, exc_value, traceback):
        """退出上下文"""
        if self.file:
            print(f"关闭文件: {self.filename}")
            self.file.close()
        
        if exc_type is not None:
            print(f"发生异常: {exc_type.__name__}: {exc_value}")
            return False  # 不抑制异常
        return True

class Timer:
    """计时器上下文管理器"""
    
    def __init__(self, name="操作"):
        self.name = name
        self.start_time = None
    
    def __enter__(self):
        """开始计时"""
        import time
        self.start_time = time.time()
        print(f"开始{self.name}...")
        return self
    
    def __exit__(self, exc_type, exc_value, traceback):
        """结束计时"""
        import time
        end_time = time.time()
        duration = end_time - self.start_time
        print(f"{self.name}完成,耗时: {duration:.4f}秒")
        return False

from contextlib import contextmanager

@contextmanager
def database_transaction():
    """数据库事务上下文管理器"""
    print("开始事务")
    try:
        yield "数据库连接"
        print("提交事务")
    except Exception as e:
        print(f"回滚事务: {e}")
        raise
    finally:
        print("关闭连接")

# 使用上下文管理器
print("上下文管理器示例:")

# 文件管理器
with FileManager("test.txt", "w") as f:
    f.write("Hello, World!")
    f.write("\n这是测试文件")

with FileManager("test.txt", "r") as f:
    content = f.read()
    print(f"文件内容: {content}")

# 计时器
with Timer("数据处理"):
    import time
    time.sleep(0.1)  # 模拟耗时操作
    result = sum(range(1000000))

# 数据库事务
with database_transaction() as db:
    print(f"使用{db}执行操作")
    # 模拟数据库操作

90. 元类基础

# 元类基础
class SingletonMeta(type):
    """单例元类"""
    _instances = {}
    
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class Database(metaclass=SingletonMeta):
    """使用单例元类的数据库类"""
    
    def __init__(self):
        self.connected = False
    
    def connect(self):
        self.connected = True
        return "数据库连接成功"

class ValidatedMeta(type):
    """验证元类"""
    
    def __new__(mcs, name, bases, namespace):
        # 验证类必须有特定方法
        required_methods = ['validate']
        for method in required_methods:
            if method not in namespace:
                raise TypeError(f"类{name}必须实现{method}方法")
        
        # 自动添加验证装饰器
        for key, value in namespace.items():
            if callable(value) and not key.startswith('_'):
                namespace[key] = mcs.add_validation(value)
        
        return super().__new__(mcs, name, bases, namespace)
    
    @staticmethod
    def add_validation(func):
        """添加验证装饰器"""
        def wrapper(self, *args, **kwargs):
            if hasattr(self, 'validate'):
                self.validate()
            return func(self, *args, **kwargs)
        return wrapper

class User(metaclass=ValidatedMeta):
    """使用验证元类的用户类"""
    
    def __init__(self, name, email):
        self.name = name
        self.email = email
    
    def validate(self):
        """验证方法"""
        if not self.name:
            raise ValueError("姓名不能为空")
        if '@' not in self.email:
            raise ValueError("邮箱格式不正确")
    
    def get_info(self):
        """获取信息"""
        return f"用户: {self.name}, 邮箱: {self.email}"
    
    def update_email(self, new_email):
        """更新邮箱"""
        self.email = new_email
        return "邮箱更新成功"

# 使用元类
print("元类示例:")

# 单例元类
db1 = Database()
db2 = Database()
print(f"db1 is db2: {db1 is db2}")  # True

# 验证元类
user = User("张三", "zhangsan@example.com")
print(user.get_info())
print(user.update_email("newemail@example.com"))

# 尝试创建无效用户
try:
    invalid_user = User("", "invalid-email")
    invalid_user.get_info()  # 会触发验证
except ValueError as e:
    print(f"验证失败: {e}")

网站公告

今日签到

点亮在社区的每一天
去签到