第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 参数: 表达式
递归 函数调用自身,需要基准情况

编程建议

  1. 函数设计原则

    • 单一职责:一个函数只做一件事
    • 函数命名:清晰表达功能
    • 参数设计:合理设计参数和默认值
    • 返回值:返回有意义的结果
  2. 代码组织

    • 将复杂问题分解为多个小函数
    • 使用函数提高代码复用性
    • 添加清晰的文档字符串
    • 合理使用全局变量和局部变量
  3. 调试技巧

    • 打印中间结果
    • 使用调试工具
    • 编写测试用例
    • 边界条件测试

继续学习

完成第31-40集后,你可以:

  • 深入学习面向对象编程
  • 学习模块和包的使用
  • 探索Python标准库
  • 学习异常处理
  • 接触文件操作和数据库

恭喜你完成了函数基础的学习!继续保持,加油! 🎉

« 上一篇 递归函数基础 下一篇 » 模块导入与使用