Python全栈(基础篇)——Day06:后端内容(定义函数+调用函数+实战演示+每日一题)

目录

一、什么是函数?------深入理解函数的概念

[1.1 函数的基本概念详解](#1.1 函数的基本概念详解)

[1.2 为什么函数如此重要?](#1.2 为什么函数如此重要?)

[1.3 函数的四大优势](#1.3 函数的四大优势)

二、定义函数------从零开始创建函数

[2.1 函数定义的完整语法结构](#2.1 函数定义的完整语法结构)

[2.2 函数定义的实际示例](#2.2 函数定义的实际示例)

[2.3 函数定义的注意事项](#2.3 函数定义的注意事项)

三、调用函数------让函数真正工作起来

[3.1 函数调用的基本原理](#3.1 函数调用的基本原理)

[3.2 不同类型的函数调用](#3.2 不同类型的函数调用)

[3.3 函数调用的实际场景](#3.3 函数调用的实际场景)

四、函数的返回值------理解函数的输出机制

[4.1 return语句的详细解析](#4.1 return语句的详细解析)

[4.2 各种return情况的示例](#4.2 各种return情况的示例)

[4.3 return语句的特殊用法](#4.3 return语句的特殊用法)

五、实战演示------综合应用案例

[5.1 实战项目一:个人日记管理系统](#5.1 实战项目一:个人日记管理系统)

[5.2 实战项目二:简易银行账户系统](#5.2 实战项目二:简易银行账户系统)

六、函数的最佳实践和编程习惯

[6.1 编写高质量函数的指导原则](#6.1 编写高质量函数的指导原则)

[6.2 文档字符串和注释的规范](#6.2 文档字符串和注释的规范)

[6.3 错误处理和输入验证](#6.3 错误处理和输入验证)

七、每日一题:简单电影管理系统

题目要求

系统功能需求

技术要求

数据结构建议

界面要求

示例交互

评分标准

提示

示例电影数据(用于测试)

八、结语


嘿,朋友们!👋

我是你们的学习伙伴,一个热爱编程、喜欢把复杂技术讲简单的普通开发者。在写这些教程的时候,我总是在想:怎么才能让你们学得更轻松、更有趣呢?

如果你觉得我的讲解方式对你有帮助,或者喜欢我这种"不装高深、只说人话"的风格,欢迎来我的小窝坐坐~

我的技术博客python全栈蛇行者-CSDN博客那里有更多精心整理的学习笔记、实战项目,还有我在学习中踩过的坑和总结的经验。

专栏订阅也不容错过哦!我会持续更新这个Python全栈系列,从基础到实战,手把手带你走进编程的世界。订阅之后,新文章会第一时间推送到你面前,再也不用担心错过精彩内容啦!

好啦,唠叨完毕,让我们开始今天的学习吧!

一、什么是函数?------深入理解函数的概念

1.1 函数的基本概念详解

函数是编程中最重要的概念之一,它是组织代码的基本单元。让我们用一个更加生活化的方式来理解函数。

想象一下日常生活中的场景:

  • 咖啡机:你只需要按下按钮,咖啡机就会自动完成磨豆、加热、冲泡等一系列复杂操作,最终给你一杯香浓的咖啡。你不需要知道内部如何工作,只需要知道按哪个按钮得到什么结果。

  • 快递服务:你告诉快递员收件地址和寄件地址,快递员就会完成取件、运输、派送的整个过程。你不需要关心具体走哪条路线、用什么交通工具。

在编程中,函数就是这样的"黑盒子":

  • 输入 → 处理 → 输出

  • 你只需要知道给函数什么(输入),它会返回什么(输出)

  • 不需要关心函数内部是如何实现的

1.2 为什么函数如此重要?

让我们通过对比来理解函数的价值:

没有函数的情况:

python 复制代码
# 计算三个圆的面积,没有使用函数
radius1 = 5
area1 = 3.14 * radius1 * radius1
print(f"半径{radius1}的圆面积是: {area1}")
​
radius2 = 8
area2 = 3.14 * radius2 * radius2
print(f"半径{radius2}的圆面积是: {area2}")
​
radius3 = 10
area3 = 3.14 * radius3 * radius3
print(f"半径{radius3}的圆面积是: {area3}")

使用函数的情况:

python 复制代码
def calculate_circle_area(radius):
    """计算圆的面积"""
    area = 3.14 * radius * radius
    return area
​
# 计算三个圆的面积,使用函数
print(f"半径5的圆面积是: {calculate_circle_area(5)}")
print(f"半径8的圆面积是: {calculate_circle_area(8)}")
print(f"半径10的圆面积是: {calculate_circle_area(10)}")

对比分析:

  1. 代码重复:没有函数的代码重复了计算公式

  2. 维护困难:如果要修改计算公式,需要修改多处

  3. 可读性差:没有函数的代码意图不够明确

  4. 错误风险:重复代码增加了出错的可能性

1.3 函数的四大优势

1. 代码重用(Reusability)

  • 一次定义,多次使用

  • 避免重复编写相同代码

  • 提高开发效率

2. 模块化(Modularity)

  • 将复杂问题分解为小问题

  • 每个函数解决一个特定问题

  • 便于团队协作开发

3. 可维护性(Maintainability)

  • 修改只需在一处进行

  • 不影响其他部分的代码

  • 降低维护成本

4. 可读性(Readability)

  • 有意义的函数名让代码自文档化

  • 隐藏实现细节,突出业务逻辑

  • 便于其他人理解和维护

二、定义函数------从零开始创建函数

2.1 函数定义的完整语法结构

python 复制代码
def 函数名(参数列表):
    """文档字符串(描述函数功能)"""
    函数体代码块
    return 返回值

让我们详细分解每个部分:

def关键字

  • 必须的关键字,告诉Python"我要定义一个函数"

  • 类似于说"我要创建一个新的工具"

函数名

  • 函数的名称,要遵循标识符命名规则

  • 应该使用小写字母,单词间用下划线分隔

  • 要有描述性,让人一看就知道函数做什么

  • 好的例子:calculate_area, get_user_info

  • 不好的例子:func1, abc, do_something

括号和参数

  • 括号是必须的,即使没有参数也要写空括号

  • 参数是函数的输入,今天我们先学习无参数函数

冒号

  • 非常重要的符号,表示函数定义的开始

  • 忘记冒号是初学者常见错误

文档字符串

  • 用三引号包围的字符串,描述函数功能

  • 不是必须的,但强烈推荐使用

  • 可以通过函数名.__doc__访问

函数体

  • 缩进的代码块,实现函数的具体功能

  • Python使用缩进来标识代码块,通常用4个空格

return语句

  • 用于返回函数的结果

  • 不是必须的,没有return的函数返回None

  • 遇到return语句,函数立即结束执行

2.2 函数定义的实际示例

让我们通过多个例子来深入理解函数定义:

示例1:最简单的函数

python 复制代码
def say_hello():
    """这个函数用于向世界打招呼"""
    print("Hello, World!")
    print("欢迎来到Python编程世界!")

示例2:执行特定任务的函数

python 复制代码
def show_current_time():
    """显示当前时间信息(模拟)"""
    print("当前时间:2024年1月1日 10:30:00")
    print("今天是星期一")
    print("天气:晴朗")

示例3:计算型函数

python 复制代码
def calculate_rectangle_area():
    """计算矩形的面积(使用固定值)"""
    length = 10
    width = 5
    area = length * width
    print(f"长为{length},宽为{width}的矩形面积是:{area}")
    return area

示例4:返回多个值的函数

python 复制代码
def get_student_info():
    """返回学生信息"""
    name = "张三"
    age = 18
    grade = "三年级"
    score = 95.5
    
    return name, age, grade, score

2.3 函数定义的注意事项

1. 命名规范

python 复制代码
# 好的命名
def calculate_total_price():
def get_user_name():
def validate_email_format():
​
# 不好的命名  
def func1():
def abc():
def do_it():

2. 文档字符串的重要性

python 复制代码
def process_data():
    """
    处理用户数据
    
    这个函数执行以下操作:
    1. 读取数据文件
    2. 清洗数据
    3. 计算统计信息
    4. 生成报告
    
    返回:
        dict: 包含处理结果的字典
    """
    # 函数实现...
    pass

3. 代码缩进

python 复制代码
# 正确的缩进
def correct_function():
    print("这一行有4个空格的缩进")
    print("这一行也有4个空格的缩进")
​
# 错误的缩进(会导致错误)
def wrong_function():
print("这一行没有缩进")  # 这会报错!
    print("这一行有缩进")

三、调用函数------让函数真正工作起来

3.1 函数调用的基本原理

函数定义只是创建了函数,就像买了一台咖啡机放在厨房里。只有当你按下按钮(调用函数)时,咖啡机才会开始工作。

调用函数的语法:

复制代码
函数名()

调用过程详解:

  1. Python找到函数定义

  2. 跳转到函数体的第一行代码

  3. 按顺序执行函数体内的所有语句

  4. 遇到return语句或函数体结束,返回到调用位置

  5. 继续执行调用位置后面的代码

3.2 不同类型的函数调用

1. 调用无返回值的函数

python 复制代码
def display_welcome_message():
    """显示欢迎信息"""
    print("🌟" * 30)
    print("      欢迎使用学生管理系统")
    print("🌟" * 30)
    print("请选择您要执行的操作:")
    print("1. 添加学生")
    print("2. 查询学生")
    print("3. 删除学生")
​
# 调用函数
display_welcome_message()

2. 调用有返回值的函数

python 复制代码
def get_pi_value():
    """返回圆周率的近似值"""
    return 3.1415926
​
# 方式1:直接使用返回值
print(f"圆周率的值是: {get_pi_value()}")
​
# 方式2:保存返回值到变量
pi = get_pi_value()
print(f"使用变量存储的圆周率: {pi}")
​
# 方式3:在表达式中使用返回值
circle_length = 2 * get_pi_value() * 5
print(f"半径为5的圆周长: {circle_length}")

3. 调用返回多个值的函数

python 复制代码
def get_system_info():
    """返回系统信息"""
    os_name = "Windows 10"
    version = "21H2"
    architecture = "64位"
    return os_name, version, architecture
​
# 接收多个返回值
os, ver, arch = get_system_info()
print(f"操作系统: {os}")
print(f"版本: {ver}") 
print(f"架构: {arch}")
​
# 也可以用一个变量接收(得到元组)
all_info = get_system_info()
print(f"所有信息: {all_info}")

3.3 函数调用的实际场景

场景1:组织程序流程

python 复制代码
def initialize_system():
    """初始化系统"""
    print("正在加载配置文件...")
    print("正在连接数据库...")
    print("系统初始化完成!")
​
def load_user_data():
    """加载用户数据"""
    print("正在读取用户信息...")
    print("用户数据加载完成!")
    return ["用户1", "用户2", "用户3"]
​
def show_main_interface():
    """显示主界面"""
    print("\n=== 主界面 ===")
    print("1. 用户管理")
    print("2. 数据统计")
    print("3. 系统设置")
​
# 组织程序执行流程
print("程序启动中...")
initialize_system()
users = load_user_data()
show_main_interface()
print(f"当前在线用户: {len(users)}人")

场景2:重复执行相同任务

python 复制代码
def print_separator():
    """打印分隔线"""
    print("-" * 50)
​
def show_section_header(title):
    """显示章节标题"""
    print_separator()
    print(f"    {title}")
    print_separator()
​
# 在多个地方使用相同的格式
show_section_header("个人信息")
print("姓名: 张三")
print("年龄: 25")
​
show_section_header("教育背景") 
print("学校: 某某大学")
print("专业: 计算机科学")
​
show_section_header("工作经历")
print("公司: 科技公司")
print("职位: 软件工程师")

四、函数的返回值------理解函数的输出机制

4.1 return语句的详细解析

return语句是函数与外部世界沟通的桥梁,它决定了函数执行后会产生什么结果。

return语句的作用:

  1. 结束函数的执行

  2. 返回一个值给调用者

  3. 没有return或return后面没有值,函数返回None

4.2 各种return情况的示例

情况1:没有return语句

python 复制代码
def no_return_function():
    """这个函数没有return语句"""
    print("这个函数会执行打印操作")
    # 函数执行完自动返回None
​
result = no_return_function()
print(f"没有return的函数的返回值: {result}")  # 输出: None
print(f"返回值类型: {type(result)}")          # 输出: <class 'NoneType'>

情况2:有return但没有值

python 复制代码
def empty_return_function():
    """这个函数有return但没有返回值"""
    print("执行一些操作...")
    return  # 相当于 return None
​
result = empty_return_function()
print(f"空return的函数的返回值: {result}")  # 输出: None

情况3:返回单个值

python 复制代码
def get_current_temperature():
    """返回当前温度(模拟)"""
    return 25.5
​
temperature = get_current_temperature()
print(f"当前温度: {temperature}°C")

情况4:返回多个值(实际上是返回元组)

python 复制代码
def analyze_numbers(numbers):
    """分析数字列表,返回统计信息"""
    if not numbers:
        return 0, 0, 0  # 如果列表为空,返回默认值
    
    total = sum(numbers)
    average = total / len(numbers)
    maximum = max(numbers)
    
    return total, average, maximum
​
# 使用函数
scores = [85, 92, 78, 96, 88]
total_score, avg_score, max_score = analyze_numbers(scores)
​
print(f"总分: {total_score}")
print(f"平均分: {avg_score:.2f}")
print(f"最高分: {max_score}")

4.3 return语句的特殊用法

提前返回(Early Return)

python 复制代码
def check_eligibility(age, has_id):
    """检查是否具备资格"""
    # 如果年龄不够,立即返回
    if age < 18:
        return "年龄不符合要求"
    
    # 如果没有身份证,立即返回
    if not has_id:
        return "需要提供身份证"
    
    # 所有条件都满足
    return "符合资格,可以继续"
​
# 测试
print(check_eligibility(16, True))   # 输出: 年龄不符合要求
print(check_eligibility(20, False))  # 输出: 需要提供身份证
print(check_eligibility(20, True))   # 输出: 符合资格,可以继续

条件返回

python 复制代码
def get_grade_level(score):
    """根据分数返回等级"""
    if score >= 90:
        return "优秀"
    elif score >= 80:
        return "良好"
    elif score >= 70:
        return "中等"
    elif score >= 60:
        return "及格"
    else:
        return "不及格"
​
# 使用
score = 85
level = get_grade_level(score)
print(f"分数{score}对应的等级是: {level}")

五、实战演示------综合应用案例

5.1 实战项目一:个人日记管理系统

让我们创建一个完整的日记管理系统,展示函数在实际项目中的应用:

python 复制代码
# 个人日记管理系统
​
def display_system_header():
    """
    显示系统标题和欢迎信息
    """
    print("📖" * 40)
    print("           个人日记管理系统")
    print("📖" * 40)
    print("记录生活点滴,珍藏美好回忆")
​
def show_main_menu():
    """
    显示主菜单选项
    """
    print("\n" + "=" * 50)
    print("请选择操作:")
    print("1. 写新日记")
    print("2. 查看日记列表")
    print("3. 阅读日记")
    print("4. 系统信息")
    print("5. 退出系统")
    print("=" * 50)
​
def create_new_diary():
    """
    创建新日记
    """
    print("\n🎨 开始写新日记...")
    
    # 获取日记信息
    title = input("请输入日记标题: ")
    weather = input("请输入天气: ")
    mood = input("请输入心情: ")
    
    print("\n请输入日记内容(输入'END'结束):")
    content_lines = []
    while True:
        line = input()
        if line.upper() == 'END':
            break
        content_lines.append(line)
    
    content = '\n'.join(content_lines)
    
    # 创建日记对象
    diary = {
        'title': title,
        'weather': weather,
        'mood': mood,
        'content': content,
        'create_time': '2024-01-01 10:00:00'  # 模拟时间
    }
    
    print(f"\n✅ 日记 '{title}' 保存成功!")
    return diary
​
def display_diary_list(diaries):
    """
    显示日记列表
    """
    if not diaries:
        print("\n📭 还没有日记,快去写一篇吧!")
        return
    
    print(f"\n📚 我的日记本(共{len(diaries)}篇)")
    print("-" * 60)
    
    for i, diary in enumerate(diaries, 1):
        print(f"{i}. {diary['title']} - {diary['create_time']}")
        print(f"   天气: {diary['weather']} | 心情: {diary['mood']}")
​
def read_diary_detail(diary):
    """
    阅读日记详情
    """
    print("\n" + "📄" * 30)
    print(f"标题: {diary['title']}")
    print(f"时间: {diary['create_time']}")
    print(f"天气: {diary['weather']}")
    print(f"心情: {diary['mood']}")
    print("-" * 40)
    print("内容:")
    print(diary['content'])
    print("📄" * 30)
​
def show_system_info():
    """
    显示系统信息
    """
    print("\n" + "ℹ️ " * 15)
    print("系统信息:")
    print("版本: v1.0")
    print("作者: Python学习者")
    print("功能: 日记的创建、查看、管理")
    print("特点: 简单易用,保护隐私")
    print("ℹ️ " * 15)
​
def run_diary_system():
    """
    日记管理系统主函数
    """
    diaries = []  # 存储所有日记
    
    # 显示欢迎信息
    display_system_header()
    
    # 主循环
    while True:
        show_main_menu()
        choice = input("\n请输入您的选择 (1-5): ").strip()
        
        if choice == '1':
            # 写新日记
            new_diary = create_new_diary()
            diaries.append(new_diary)
            
        elif choice == '2':
            # 查看日记列表
            display_diary_list(diaries)
            
        elif choice == '3':
            # 阅读日记
            if not diaries:
                print("\n📭 还没有日记,无法阅读!")
                continue
                
            display_diary_list(diaries)
            try:
                diary_index = int(input("\n请选择要阅读的日记编号: ")) - 1
                if 0 <= diary_index < len(diaries):
                    read_diary_detail(diaries[diary_index])
                else:
                    print("❌ 编号无效!")
            except ValueError:
                print("❌ 请输入有效的数字!")
                
        elif choice == '4':
            # 显示系统信息
            show_system_info()
            
        elif choice == '5':
            # 退出系统
            print("\n感谢使用个人日记管理系统!")
            print("再见!👋")
            break
            
        else:
            print("❌ 无效的选择,请重新输入!")
​
# 启动系统
if __name__ == "__main__":
    run_diary_system()

5.2 实战项目二:简易银行账户系统

python 复制代码
# 简易银行账户系统
​
def display_bank_header():
    """
    显示银行系统标题
    """
    print("🏦" * 35)
    print("           简易银行账户系统")
    print("🏦" * 35)
​
def show_bank_menu():
    """
    显示银行菜单
    """
    print("\n请选择操作:")
    print("1. 开户")
    print("2. 存款")
    print("3. 取款")
    print("4. 查询余额")
    print("5. 查看交易记录")
    print("6. 退出系统")
​
def create_account(accounts):
    """
    创建新账户
    """
    print("\n=== 开户流程 ===")
    
    account_name = input("请输入账户名称: ")
    initial_deposit = float(input("请输入初始存款金额: "))
    
    # 生成账户ID(简单模拟)
    account_id = f"ACC{len(accounts) + 1:04d}"
    
    # 创建账户信息
    account = {
        'id': account_id,
        'name': account_name,
        'balance': initial_deposit,
        'transactions': [
            f"开户存入: {initial_deposit:.2f}元"
        ]
    }
    
    accounts[account_id] = account
    print(f"\n✅ 开户成功!")
    print(f"账户ID: {account_id}")
    print(f"账户名: {account_name}")
    print(f"初始余额: {initial_deposit:.2f}元")
    
    return account_id
​
def deposit_money(accounts):
    """
    存款操作
    """
    print("\n=== 存款操作 ===")
    
    if not accounts:
        print("❌ 还没有任何账户,请先开户!")
        return
    
    account_id = input("请输入账户ID: ")
    
    if account_id not in accounts:
        print("❌ 账户不存在!")
        return
    
    amount = float(input("请输入存款金额: "))
    
    if amount <= 0:
        print("❌ 存款金额必须大于0!")
        return
    
    # 更新余额和交易记录
    accounts[account_id]['balance'] += amount
    accounts[account_id]['transactions'].append(f"存款: +{amount:.2f}元")
    
    print(f"\n✅ 存款成功!")
    print(f"存入金额: {amount:.2f}元")
    print(f"当前余额: {accounts[account_id]['balance']:.2f}元")
​
def withdraw_money(accounts):
    """
    取款操作
    """
    print("\n=== 取款操作 ===")
    
    if not accounts:
        print("❌ 还没有任何账户,请先开户!")
        return
    
    account_id = input("请输入账户ID: ")
    
    if account_id not in accounts:
        print("❌ 账户不存在!")
        return
    
    amount = float(input("请输入取款金额: "))
    
    if amount <= 0:
        print("❌ 取款金额必须大于0!")
        return
    
    if amount > accounts[account_id]['balance']:
        print("❌ 余额不足!")
        return
    
    # 更新余额和交易记录
    accounts[account_id]['balance'] -= amount
    accounts[account_id]['transactions'].append(f"取款: -{amount:.2f}元")
    
    print(f"\n✅ 取款成功!")
    print(f"取出金额: {amount:.2f}元")
    print(f"当前余额: {accounts[account_id]['balance']:.2f}元")
​
def check_balance(accounts):
    """
    查询余额
    """
    print("\n=== 余额查询 ===")
    
    if not accounts:
        print("❌ 还没有任何账户,请先开户!")
        return
    
    account_id = input("请输入账户ID: ")
    
    if account_id not in accounts:
        print("❌ 账户不存在!")
        return
    
    account = accounts[account_id]
    print(f"\n账户信息:")
    print(f"账户ID: {account['id']}")
    print(f"账户名: {account['name']}")
    print(f"当前余额: {account['balance']:.2f}元")
​
def show_transactions(accounts):
    """
    显示交易记录
    """
    print("\n=== 交易记录 ===")
    
    if not accounts:
        print("❌ 还没有任何账户,请先开户!")
        return
    
    account_id = input("请输入账户ID: ")
    
    if account_id not in accounts:
        print("❌ 账户不存在!")
        return
    
    account = accounts[account_id]
    print(f"\n账户: {account['name']} ({account['id']})")
    print("交易记录:")
    print("-" * 30)
    
    for i, transaction in enumerate(account['transactions'], 1):
        print(f"{i}. {transaction}")
​
def run_bank_system():
    """
    银行系统主函数
    """
    accounts = {}  # 存储所有账户
    
    display_bank_header()
    
    while True:
        show_bank_menu()
        choice = input("\n请输入您的选择 (1-6): ").strip()
        
        if choice == '1':
            create_account(accounts)
        elif choice == '2':
            deposit_money(accounts)
        elif choice == '3':
            withdraw_money(accounts)
        elif choice == '4':
            check_balance(accounts)
        elif choice == '5':
            show_transactions(accounts)
        elif choice == '6':
            print("\n感谢使用简易银行系统!")
            print("再见!💰")
            break
        else:
            print("❌ 无效的选择,请重新输入!")
​
# 启动银行系统
if __name__ == "__main__":
    run_bank_system()

六、函数的最佳实践和编程习惯

6.1 编写高质量函数的指导原则

1. 单一职责原则

python 复制代码
# 好的例子:每个函数只做一件事
def calculate_total_price(price, quantity):
    """计算总价格"""
    return price * quantity
​
def apply_discount(total, discount_rate):
    """应用折扣"""
    return total * (1 - discount_rate)
​
def format_currency(amount):
    """格式化货币显示"""
    return f"¥{amount:.2f}"
​
# 不好的例子:一个函数做太多事情
def process_order_bad(price, quantity, discount_rate):
    """不好的设计:一个函数做太多事情"""
    total = price * quantity
    discounted = total * (1 - discount_rate)
    formatted = f"¥{discounted:.2f}"
    print(formatted)
    return discounted

2. 有意义的函数名

python 复制代码
# 好的命名
def calculate_monthly_salary():
def validate_user_input():
def send_email_notification():
​
# 不好的命名
def calc():          # 太简略
def do_thing():      # 不明确
def function1():     # 无意义

3. 适当的函数长度

python 复制代码
# 好的设计:函数较短,职责明确
def process_user_registration():
    """处理用户注册流程"""
    user_data = collect_user_info()
    if validate_user_data(user_data):
        save_user_to_database(user_data)
        send_welcome_email(user_data)
        return True
    return False
​
# 每个子函数都有明确职责
def collect_user_info():
    """收集用户信息"""
    # 具体实现...
​
def validate_user_data(data):
    """验证用户数据"""
    # 具体实现...
​
def save_user_to_database(data):
    """保存用户到数据库"""
    # 具体实现...
​
def send_welcome_email(data):
    """发送欢迎邮件"""
    # 具体实现...

6.2 文档字符串和注释的规范

完整的文档字符串示例:

python 复制代码
def calculate_compound_interest(principal, rate, time, compound_frequency):
    """
    计算复利
    
    根据本金、年利率、投资时间和复利频率计算最终金额。
    
    参数:
        principal (float): 本金金额,必须大于0
        rate (float): 年利率,以小数表示(如0.05表示5%)
        time (float): 投资时间,以年为单位
        compound_frequency (int): 年复利次数(如12表示月复利)
    
    返回:
        float: 投资期满后的总金额
        
    抛出:
        ValueError: 如果参数不合法
        
    示例:
        >>> calculate_compound_interest(1000, 0.05, 2, 12)
        1104.89
    """
    # 参数验证
    if principal <= 0:
        raise ValueError("本金必须大于0")
    if rate <= 0:
        raise ValueError("利率必须大于0")
    if time <= 0:
        raise ValueError("投资时间必须大于0")
    if compound_frequency <= 0:
        raise ValueError("复利频率必须大于0")
    
    # 计算复利
    amount = principal * (1 + rate/compound_frequency) ** (compound_frequency * time)
    return round(amount, 2)

6.3 错误处理和输入验证

python 复制代码
def safe_divide(numerator, denominator):
    """
    安全的除法运算
    
    参数:
        numerator (float): 分子
        denominator (float): 分母
        
    返回:
        float: 除法结果,如果分母为0返回None
    """
    # 输入验证
    if not isinstance(numerator, (int, float)) or not isinstance(denominator, (int, float)):
        print("错误:参数必须是数字")
        return None
    
    # 业务逻辑验证
    if denominator == 0:
        print("错误:分母不能为0")
        return None
    
    # 执行计算
    result = numerator / denominator
    return result
​
# 测试各种情况
print(safe_divide(10, 2))      # 正常情况
print(safe_divide(10, 0))      # 除零情况
print(safe_divide(10, "2"))    # 类型错误情况

七、每日一题:简单电影管理系统

题目要求

创建一个简单的电影管理系统,要求实现以下基本功能:

系统功能需求

1. 电影信息管理

  • 每部电影包含:电影名称、导演、主演、上映年份、评分、类型

  • 能够添加新电影到系统

  • 能够显示所有电影信息

2. 电影查询功能

  • 按电影名称查询

  • 按导演查询

  • 按类型查询

  • 显示高评分电影(评分≥8.0)

3. 电影推荐功能

  • 随机推荐一部电影

  • 根据类型推荐电影

技术要求

必须使用函数实现以下功能:

  1. display_system_header() - 显示系统标题和欢迎信息

  2. show_main_menu() - 显示主菜单选项

  3. add_new_movie(movies) - 添加新电影到系统

  4. display_all_movies(movies) - 显示所有电影信息

  5. search_movies(movies) - 搜索电影(按名称、导演、类型)

  6. show_high_rated_movies(movies) - 显示高评分电影

  7. recommend_movie(movies) - 推荐电影功能

  8. main() - 主函数,组织整个系统流程

数据结构建议
python 复制代码
# 每部电影用字典表示
movie = {
    'title': '肖申克的救赎',
    'director': '弗兰克·德拉邦特',
    'actors': ['蒂姆·罗宾斯', '摩根·弗里曼'],
    'year': 1994,
    'rating': 9.7,
    'genre': '剧情'
}
​
# 所有电影存储在列表中
movies = [movie1, movie2, movie3, ...]
界面要求
  • 有清晰的菜单界面

  • 用户友好的输入提示

  • 美观的信息显示格式

  • 适当的错误处理

示例交互
python 复制代码
🎬 ================================= 🎬
           简单电影管理系统
🎬 ================================= 🎬

请选择操作:
1. 添加新电影
2. 显示所有电影
3. 搜索电影
4. 显示高评分电影
5. 电影推荐
6. 退出系统

请输入您的选择 (1-6): 
评分标准

基础要求(必须完成):

  • 所有功能都使用函数实现

  • 能够添加和显示电影

  • 实现基本的搜索功能

  • 有清晰的用户界面

进阶要求(加分项):

  • 实现电影推荐功能

  • 添加数据验证(如评分范围0-10)

  • 实现电影删除或修改功能

  • 添加电影收藏功能

  • 将数据保存到文件

提示
  1. 函数设计:每个函数应该只负责一个明确的任务

  2. 错误处理:考虑用户输入错误的情况

  3. 用户体验:提供清晰的操作指引和反馈

  4. 代码结构:使用有意义的变量名和函数名

  5. 数据验证:确保输入的数据格式正确

示例电影数据(用于测试)
python 复制代码
# 可以预先添加一些电影数据用于测试
sample_movies = [
    {
        'title': '肖申克的救赎',
        'director': '弗兰克·德拉邦特',
        'actors': ['蒂姆·罗宾斯', '摩根·弗里曼'],
        'year': 1994,
        'rating': 9.7,
        'genre': '剧情'
    },
    {
        'title': '阿甘正传',
        'director': '罗伯特·泽米吉斯', 
        'actors': ['汤姆·汉克斯', '罗宾·怀特'],
        'year': 1994,
        'rating': 9.5,
        'genre': '剧情'
    }
]

请根据上述要求,使用今天学习的函数知识完成这个电影管理系统的开发。注意代码的结构和可读性,确保每个函数都有明确的职责!

八、结语

今天的函数之旅就到这里啦!希望这些内容能帮你把函数的迷雾拨开,看到编程的美妙之处。🎉

说实话,写教程是件挺费心思的事情------要想着怎么讲你们才容易懂,怎么写例子你们才容易练。但每次想到能帮到正在学习的你们,就觉得特别值得!

如果你觉得今天的内容对你有帮助,或者喜欢我这种"不端不装"的讲解风格:

  • 博客关注走一波~那里是我的技术自留地,有更多干货等着你

  • 专栏订阅也别错过!这个Python全栈系列会持续更新,从入门到实战,我陪你一起成长

学习编程就像打怪升级,有时候会卡关,有时候会迷茫,但坚持下去,你一定能看到自己的进步!有什么问题随时来博客找我,我看到都会回复的。

下篇博文见啦,继续加油!

相关推荐
bcbnb6 小时前
Charles隐藏功能全攻略,10个高效技巧让你的抓包调试更专业
后端
用户4099322502126 小时前
PostgreSQL选Join策略有啥小九九?Nested Loop/Merge/Hash谁是它的菜?
后端·ai编程·trae
koddnty6 小时前
协程退出与智能指针
后端·架构
qq_546937276 小时前
Cryptomator:免费的加密工具,
python
用户6120414922137 小时前
C语言做的物联网设备数据采集模拟器
c语言·后端·敏捷开发
IT学长编程7 小时前
计算机毕业设计 基于k-means的校园美食推荐系统 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·python·毕业设计·kmeans·课程设计·毕业论文·美食推荐系统
如竟没有火炬7 小时前
LRU缓存——双向链表+哈希表
数据结构·python·算法·leetcode·链表·缓存
华仔啊7 小时前
千万级大表如何新增字段?别再直接 ALTER 了
后端·mysql
IT_陈寒7 小时前
Python开发者必看!10个高效数据处理技巧让你的Pandas代码提速300%
前端·人工智能·后端