第40集:函数综合练习
学习目标
- 综合运用函数定义、参数、返回值等知识
- 掌握函数的实际应用场景
- 学会解决实际问题
- 提高编程能力和代码组织能力
一、综合练习1:简易计算器
需求描述
实现一个简易计算器,支持加减乘除、幂运算、取模等操作。
代码实现
def calculator(operation, a, b):
"""
简易计算器
参数:
operation (str): 操作类型(+, -, *, /, **, %)
a (float): 第一个操作数
b (float): 第二个操作数
返回:
tuple: (result, error)
- result: 计算结果
- error: 错误信息(无错误时为None)
"""
if operation == "+":
return a + b, None
elif operation == "-":
return a - b, None
elif operation == "*":
return a * b, None
elif operation == "/":
if b == 0:
return None, "除数不能为零"
return a / b, None
elif operation == "**":
return a ** b, None
elif operation == "%":
if b == 0:
return None, "取模运算的除数不能为零"
return a % b, None
else:
return None, f"不支持的操作:{operation}"
# 使用示例
result, error = calculator("+", 5, 3)
print(f"5 + 3 = {result}") # 输出:8
result, error = calculator("/", 10, 0)
if error:
print(f"错误:{error}") # 输出:除数不能为零扩展功能
def advanced_calculator(*args, operation="+"):
"""
高级计算器:支持多个操作数
参数:
*args: 任意数量的操作数
operation: 操作类型
返回:
计算结果
"""
if not args:
return 0
result = args[0]
if operation == "+":
for num in args[1:]:
result += num
elif operation == "*":
for num in args[1:]:
result *= num
elif operation == "-":
for num in args[1:]:
result -= num
return result
print(advanced_calculator(1, 2, 3, 4, 5)) # 输出:15
print(advanced_calculator(2, 3, 4, operation="*")) # 输出:24二、综合练习2:学生成绩管理系统
需求描述
实现一个学生成绩管理系统,支持添加学生、录入成绩、计算平均分、排名等功能。
代码实现
# 全局学生数据
students = []
def add_student(name, student_id, class_name):
"""
添加学生
参数:
name: 姓名
student_id: 学号
class_name: 班级
返回:
bool: 是否添加成功
"""
# 检查学号是否已存在
for student in students:
if student["id"] == student_id:
return False
student = {
"name": name,
"id": student_id,
"class": class_name,
"scores": {}
}
students.append(student)
return True
def add_score(student_id, subject, score):
"""
录入成绩
参数:
student_id: 学号
subject: 科目
score: 成绩
返回:
bool: 是否录入成功
"""
for student in students:
if student["id"] == student_id:
student["scores"][subject] = score
return True
return False
def get_average(student_id):
"""
计算平均分
参数:
student_id: 学号
返回:
float: 平均分,学生不存在返回None
"""
for student in students:
if student["id"] == student_id:
scores = student["scores"].values()
if scores:
return sum(scores) / len(scores)
return 0
return None
def get_ranking():
"""
获取排名
返回:
list: 排名后的学生列表
"""
# 计算每个学生的平均分
for student in students:
avg = get_average(student["id"])
student["average"] = avg
# 按平均分排序
ranked = sorted(students, key=lambda x: x["average"], reverse=True)
return ranked
# 使用示例
add_student("小明", "001", "一班")
add_student("小红", "002", "一班")
add_student("小华", "003", "二班")
add_score("001", "数学", 90)
add_score("001", "语文", 85)
add_score("002", "数学", 95)
add_score("002", "语文", 90)
add_score("003", "数学", 88)
add_score("003", "语文", 92)
print("学生排名:")
for i, student in enumerate(get_ranking(), 1):
print(f"{i}. {student['name']}: 平均分{student['average']:.1f}")三、综合练习3:文本处理工具
需求描述
实现一个文本处理工具,支持统计字数、查找替换、格式转换等功能。
代码实现
def count_words(text):
"""统计字数"""
words = text.split()
return len(words)
def count_characters(text, include_spaces=False):
"""
统计字符数
参数:
text: 文本
include_spaces: 是否包含空格
返回:
int: 字符数
"""
if include_spaces:
return len(text)
else:
return len(text.replace(" ", ""))
def find_and_replace(text, old, new, count=0):
"""
查找并替换
参数:
text: 文本
old: 要查找的字符串
new: 替换的字符串
count: 替换次数(0表示全部)
返回:
str: 替换后的文本
"""
return text.replace(old, new, count)
def to_title_case(text):
"""转为标题格式(每个单词首字母大写)"""
return text.title()
def reverse_text(text):
"""反转文本"""
return text[::-1]
def is_palindrome(text):
"""判断是否是回文"""
# 去除空格和标点,转为小写
cleaned = ''.join(char.lower() for char in text if char.isalnum())
return cleaned == cleaned[::-1]
# 使用示例
text = "Hello World! Python is amazing."
print(f"字数:{count_words(text)}")
print(f"字符数(含空格):{count_characters(text, True)}")
print(f"字符数(不含空格):{count_characters(text, False)}")
replaced = find_and_replace(text, "is", "was")
print(f"替换后:{replaced}")
print(f"标题格式:{to_title_case(text)}")
print(f"反转:{reverse_text(text)}")
print(f"是否是回文:{is_palindrome('racecar')}") # 输出:True四、综合练习4:密码生成器
需求描述
实现一个密码生成器,可以生成不同强度、不同长度的密码。
代码实现
import random
import string
def generate_password(length=12, use_uppercase=True, use_lowercase=True,
use_digits=True, use_symbols=True):
"""
生成密码
参数:
length: 密码长度
use_uppercase: 是否使用大写字母
use_lowercase: 是否使用小写字母
use_digits: 是否使用数字
use_symbols: 是否使用特殊符号
返回:
str: 生成的密码
"""
# 定义字符池
chars = ""
if use_uppercase:
chars += string.ascii_uppercase
if use_lowercase:
chars += string.ascii_lowercase
if use_digits:
chars += string.digits
if use_symbols:
chars += string.punctuation
if not chars:
raise ValueError("至少选择一种字符类型")
# 生成密码
password = ''.join(random.choice(chars) for _ in range(length))
return password
def generate_strong_password(length=16):
"""
生成强密码(包含所有字符类型)
参数:
length: 密码长度(至少12)
返回:
str: 强密码
"""
if length < 12:
length = 12
return generate_password(length, True, True, True, True)
def check_password_strength(password):
"""
检查密码强度
参数:
password: 密码
返回:
str: 密码强度(弱、中、强)
"""
strength = 0
if len(password) >= 8:
strength += 1
if len(password) >= 12:
strength += 1
if any(c.islower() for c in password):
strength += 1
if any(c.isupper() for c in password):
strength += 1
if any(c.isdigit() for c in password):
strength += 1
if any(c in string.punctuation for c in password):
strength += 1
if strength <= 3:
return "弱"
elif strength <= 5:
return "中"
else:
return "强"
# 使用示例
print("生成各种密码:")
print(f"普通密码:{generate_password(10)}")
print(f"不含符号的密码:{generate_password(12, use_symbols=False)}")
print(f"强密码:{generate_strong_password()}")
test_passwords = ["123456", "password", "Password123", "P@ssw0rd!23"]
print("\n密码强度检查:")
for pwd in test_passwords:
strength = check_password_strength(pwd)
print(f"{pwd:20} - {strength}")五、综合练习5:简易待办事项管理
需求描述
实现一个待办事项管理器,支持添加、删除、完成、标记等功能。
代码实现
# 全局待办事项列表
todos = []
def add_todo(title, priority="中"):
"""
添加待办事项
参数:
title: 待办事项内容
priority: 优先级(高、中、低)
返回:
bool: 是否添加成功
"""
todo = {
"id": len(todos) + 1,
"title": title,
"priority": priority,
"completed": False
}
todos.append(todo)
return True
def remove_todo(todo_id):
"""
删除待办事项
参数:
todo_id: 待办事项ID
返回:
bool: 是否删除成功
"""
for i, todo in enumerate(todos):
if todo["id"] == todo_id:
todos.pop(i)
return True
return False
def complete_todo(todo_id):
"""
标记待办事项为已完成
参数:
todo_id: 待办事项ID
返回:
bool: 是否标记成功
"""
for todo in todos:
if todo["id"] == todo_id:
todo["completed"] = True
return True
return False
def list_todos(show_completed=False, filter_priority=None):
"""
列出待办事项
参数:
show_completed: 是否显示已完成的
filter_priority: 过滤优先级(高、中、低)
返回:
list: 待办事项列表
"""
filtered = []
for todo in todos:
if not show_completed and todo["completed"]:
continue
if filter_priority and todo["priority"] != filter_priority:
continue
filtered.append(todo)
return filtered
# 使用示例
add_todo("学习Python函数", "高")
add_todo("完成作业", "中")
add_todo("锻炼身体", "低")
print("所有待办事项:")
for todo in list_todos():
status = "✓" if todo["completed"] else "○"
print(f"{status} [{todo['priority']}] {todo['title']}")
complete_todo(1)
print("\n高优先级的待办事项:")
for todo in list_todos(filter_priority="高"):
status = "✓" if todo["completed"] else "○"
print(f"{status} [{todo['priority']}] {todo['title']}")六、综合练习6:购物车系统
需求描述
实现一个购物车系统,支持添加商品、计算总价、应用折扣等功能。
代码实现
# 全局购物车
cart = []
# 商品数据库
products = {
"001": {"name": "手机", "price": 2999},
"002": {"name": "电脑", "price": 5999},
"003": {"name": "耳机", "price": 199},
"004": {"name": "键盘", "price": 299},
"005": {"name": "鼠标", "price": 99}
}
def add_to_cart(product_id, quantity=1):
"""
添加商品到购物车
参数:
product_id: 商品ID
quantity: 数量
返回:
bool: 是否添加成功
"""
if product_id not in products:
return False
# 检查购物车中是否已有该商品
for item in cart:
if item["id"] == product_id:
item["quantity"] += quantity
return True
# 添加新商品
cart.append({
"id": product_id,
"name": products[product_id]["name"],
"price": products[product_id]["price"],
"quantity": quantity
})
return True
def remove_from_cart(product_id):
"""
从购物车删除商品
参数:
product_id: 商品ID
返回:
bool: 是否删除成功
"""
for i, item in enumerate(cart):
if item["id"] == product_id:
cart.pop(i)
return True
return False
def calculate_total(discount=0):
"""
计算总价
参数:
discount: 折扣率(0-1)
返回:
float: 总价
"""
total = 0
for item in cart:
total += item["price"] * item["quantity"]
if discount > 0:
total *= (1 - discount)
return total
def display_cart():
"""显示购物车内容"""
if not cart:
print("购物车为空")
return
print("\n购物车内容:")
total = 0
for item in cart:
subtotal = item["price"] * item["quantity"]
total += subtotal
print(f" {item['name']} x{item['quantity']} = ¥{subtotal}")
print(f"\n小计:¥{total}")
# 使用示例
add_to_cart("001", 1)
add_to_cart("003", 2)
add_to_cart("004", 1)
display_cart()
total = calculate_total(0.1) # 9折
print(f"折后总价:¥{total:.2f}")七、综合练习7:数据分析工具
需求描述
实现一个数据分析工具,支持计算平均值、中位数、方差、标准差等统计量。
代码实现
def calculate_mean(data):
"""计算平均值"""
if not data:
return None
return sum(data) / len(data)
def calculate_median(data):
"""计算中位数"""
if not data:
return None
sorted_data = sorted(data)
n = len(sorted_data)
mid = n // 2
if n % 2 == 0:
return (sorted_data[mid - 1] + sorted_data[mid]) / 2
else:
return sorted_data[mid]
def calculate_variance(data):
"""计算方差"""
if not data:
return None
mean = calculate_mean(data)
variance = sum((x - mean) ** 2 for x in data) / len(data)
return variance
def calculate_std_deviation(data):
"""计算标准差"""
variance = calculate_variance(data)
if variance is None:
return None
return variance ** 0.5
def analyze_data(data):
"""
分析数据
参数:
data: 数据列表
返回:
dict: 统计结果
"""
return {
"count": len(data),
"mean": calculate_mean(data),
"median": calculate_median(data),
"min": min(data) if data else None,
"max": max(data) if data else None,
"variance": calculate_variance(data),
"std_deviation": calculate_std_deviation(data)
}
# 使用示例
data = [85, 90, 78, 92, 88, 76, 95, 89, 82, 91]
result = analyze_data(data)
print("数据分析结果:")
print(f" 数据个数:{result['count']}")
print(f" 平均值:{result['mean']:.2f}")
print(f" 中位数:{result['median']:.2f}")
print(f" 最小值:{result['min']}")
print(f" 最大值:{result['max']}")
print(f" 方差:{result['variance']:.2f}")
print(f" 标准差:{result['std_deviation']:.2f}")八、综合练习8:简易日志系统
需求描述
实现一个简易日志系统,支持不同级别的日志记录、日志过滤等功能。
代码实现
from datetime import datetime
# 全局日志存储
logs = []
def log(level, message, **metadata):
"""
记录日志
参数:
level: 日志级别(DEBUG, INFO, WARNING, ERROR)
message: 日志消息
**metadata: 元数据
"""
log_entry = {
"timestamp": datetime.now(),
"level": level,
"message": message,
"metadata": metadata
}
logs.append(log_entry)
def filter_logs(level=None, message_contains=None, start_time=None, end_time=None):
"""
过滤日志
参数:
level: 按级别过滤
message_contains: 消息包含的字符串
start_time: 开始时间
end_time: 结束时间
返回:
list: 过滤后的日志
"""
filtered = logs
if level:
filtered = [log for log in filtered if log["level"] == level]
if message_contains:
filtered = [log for log in filtered if message_contains in log["message"]]
if start_time:
filtered = [log for log in filtered if log["timestamp"] >= start_time]
if end_time:
filtered = [log for log in filtered if log["timestamp"] <= end_time]
return filtered
def display_logs(logs_to_show=None):
"""
显示日志
参数:
logs_to_show: 要显示的日志列表(None表示全部)
"""
logs_list = logs_to_show if logs_to_show is not None else logs
for entry in logs_list:
time_str = entry["timestamp"].strftime("%Y-%m-%d %H:%M:%S")
print(f"[{time_str}] [{entry['level']}] {entry['message']}")
if entry["metadata"]:
print(f" 元数据:{entry['metadata']}")
# 使用示例
log("INFO", "系统启动", version="1.0")
log("INFO", "用户登录", user_id=1001)
log("WARNING", "内存使用率较高", usage="85%")
log("ERROR", "数据库连接失败", error_code=500)
log("INFO", "用户登出", user_id=1001)
print("所有日志:")
display_logs()
print("\n错误日志:")
error_logs = filter_logs(level="ERROR")
display_logs(error_logs)
print("\n包含'用户'的日志:")
user_logs = filter_logs(message_contains="用户")
display_logs(user_logs)九、课后练习题
练习1
实现一个简易的图书管理系统,支持添加图书、借阅、归还、查询等功能。
练习2
实现一个简易的记账本系统,支持记录收入和支出、计算余额、分类统计等功能。
练习3
实现一个简易的日程提醒系统,支持添加日程、删除日程、显示今日日程等功能。
练习4
实现一个简易的成绩分析系统,支持录入多门课程成绩、计算总分、排名、分析成绩分布等功能。
练习5
实现一个简易的猜数字游戏,支持不同难度级别、记录猜测次数、显示提示信息等功能。
十、总结
函数核心知识回顾
| 知识点 | 说明 |
|---|---|
| 函数定义 | def 函数名(参数): |
| 参数类型 | 位置参数、默认参数、关键字参数、可变参数 |
| 返回值 | 使用return返回结果,可以返回多个值 |
| 作用域 | 局部变量、全局变量、global/nonlocal |
| lambda | 匿名函数,lambda 参数: 表达式 |
| 递归 | 函数调用自身,需要基准情况 |
编程建议
函数设计原则
- 单一职责:一个函数只做一件事
- 函数命名:清晰表达功能
- 参数设计:合理设计参数和默认值
- 返回值:返回有意义的结果
代码组织
- 将复杂问题分解为多个小函数
- 使用函数提高代码复用性
- 添加清晰的文档字符串
- 合理使用全局变量和局部变量
调试技巧
- 打印中间结果
- 使用调试工具
- 编写测试用例
- 边界条件测试
继续学习
完成第31-40集后,你可以:
- 深入学习面向对象编程
- 学习模块和包的使用
- 探索Python标准库
- 学习异常处理
- 接触文件操作和数据库
恭喜你完成了函数基础的学习!继续保持,加油! 🎉