05-Python函数

Python函数全面总结

一、函数概述

1.1 什么是函数

函数:是组织好的、可重复使用的、用来实现特定功能的代码段。

函数的特点

  • 组织性:代码结构清晰
  • 可复用性:一次定义,多次使用
  • 特定功能:每个函数完成特定任务

1.2 为什么使用函数

# 不使用函数(重复代码)
print("欢迎来到黑马程序员!")
print("请出示您的健康码以及72小时核酸证明!")
print("体温测量中...")
# ... 每次都需要重复写这些代码

# 使用函数(代码复用)
def check_health():
    print("欢迎来到黑马程序员!")
    print("请出示您的健康码以及72小时核酸证明!")
    print("体温测量中...")

# 需要时调用函数
check_health()

使用函数的好处

  • 提高代码复用性
  • 减少重复代码
  • 提高开发效率
  • 便于维护和调试

二、函数的定义

2.1 基本语法结构

def 函数名(参数):
    """函数说明文档"""
    函数体
    return 返回值

2.2 实际定义示例

# 定义简单的函数
def say_hello():
    print("Hello, World!")

# 定义带参数的函数
def greet(name):
    print(f"Hello, {name}!")

# 定义带返回值的函数
def add(a, b):
    result = a + b
    return result

2.3 函数调用

# 调用无参数函数
say_hello()  # 输出:Hello, World!

# 调用带参数函数
greet("Alice")  # 输出:Hello, Alice!

# 调用带返回值函数
sum_result = add(3, 5)
print(sum_result)  # 输出:8

2.4 注意事项

  1. 先定义后使用:函数必须在使用前定义
  2. 函数名命名规范:使用小写字母和下划线
  3. 缩进正确:函数体必须正确缩进
  4. 参数可选:根据需要决定是否使用参数

三、函数的参数

3.1 参数的作用

参数让函数更加灵活,可以根据调用时传入的不同数据执行相应的操作。

3.2 形参与实参

# 定义函数时的参数:形式参数(形参)
def add(x, y):  # x, y是形参
    result = x + y
    print(f"{x} + {y} = {result}")

# 调用函数时的参数:实际参数(实参)
add(3, 5)  # 3, 5是实参
add(10, 20)  # 10, 20是实参

3.3 多种参数形式

# 无参数函数
def show_menu():
    print("1. 查询余额")
    print("2. 存款")
    print("3. 取款")

# 单参数函数
def check_temperature(temp):
    if temp <= 37.5:
        print(f"体温{temp}度,正常")
    else:
        print(f"体温{temp}度,需要隔离")

# 多参数函数
def student_info(name, age, grade):
    print(f"姓名:{name},年龄:{age},年级:{grade}")

3.4 参数传递规则

  • 位置对应:实参与形参按顺序一一对应
  • 数量一致:实参数量应与形参数量一致
  • 类型匹配:确保传入的数据类型符合函数预期

四、函数的返回值

4.1 返回值概念

返回值:函数执行完成后返回给调用者的结果。

# 生活中的返回值类比
def buy_cola(money, count):
    # 执行购买操作
    return f"购买{count}瓶可乐"  # 返回结果

result = buy_cola(10, 3)  # 接收返回值
print(result)  # 输出:购买3瓶可乐

4.2 返回值语法

def add(x, y):
    """计算两数之和"""
    result = x + y
    return result  # 返回计算结果

# 调用函数并接收返回值
sum_result = add(5, 3)
print(f"5 + 3 = {sum_result}")  # 输出:5 + 3 = 8

4.3 返回多个值

def calculate(x, y):
    """计算加减乘除"""
    add = x + y
    subtract = x - y
    multiply = x * y
    divide = x / y if y != 0 else "不能除以0"
    return add, subtract, multiply, divide  # 返回多个值

# 接收多个返回值
a, s, m, d = calculate(10, 2)
print(f"加:{a}, 减:{s}, 乘:{m}, 除:{d}")

4.4 注意事项

  • return后代码不执行:return语句后的代码不会执行
  • 可返回任意类型:数字、字符串、列表、字典等
  • 可省略return:不需要返回值时可省略

五、None类型

5.1 什么是None

None:Python中的特殊字面量,表示"空"或"无意义",类型为<class 'NoneType'>

def say_hello():
    print("Hello...")
    # 没有return语句,默认返回None

result = say_hello()  # 输出:Hello...
print(result)         # 输出:None
print(type(result))   # 输出:<class 'NoneType'>

5.2 None的应用场景

# 1. 函数无返回值
def process_data(data):
    if not data:
        return None  # 明确返回None
    # 处理数据...

# 2. if判断中使用
def check_age(age):
    if age > 18:
        return "SUCCESS"
    return None  # 不满足条件返回None

result = check_age(16)
if not result:  # None在if中相当于False
    print("未成年,不可进入")

# 3. 变量初始化
name = None  # 暂时不赋予具体值

5.3 主动返回None

def explicit_none():
    print("这个函数明确返回None")
    return None  # 明确返回None

def implicit_none():
    print("这个函数隐式返回None")
    # 没有return语句,隐式返回None

六、函数说明文档

6.1 说明文档的作用

函数说明文档用于解释函数的功能、参数和返回值,提高代码可读性。

6.2 说明文档语法

def calculate_bmi(weight, height):
    """
    计算身体质量指数(BMI)
    
    :param weight: 体重,单位:千克
    :param height: 身高,单位:米  
    :return: BMI数值
    """
    bmi = weight / (height ** 2)
    return round(bmi, 2)

# 在PyCharm中鼠标悬停可查看说明文档
result = calculate_bmi(70, 1.75)

6.3 标准文档格式

def function_name(parameter1, parameter2):
    """
    函数功能描述
    
    :param parameter1: 参数1的说明
    :param parameter2: 参数2的说明
    :return: 返回值的说明
    """
    # 函数体
    return result

6.4 查看说明文档

在PyCharm等IDE中,鼠标悬停在函数名上可以查看函数的说明文档。

七、函数的嵌套调用

7.1 嵌套调用概念

嵌套调用:在一个函数内部调用另一个函数。

def func_b():
    print("--- 函数B执行 ---")

def func_a():
    print("--- 函数A开始 ---")
    func_b()  # 在函数A中调用函数B
    print("--- 函数A结束 ---")

# 调用函数A
func_a()

执行结果

--- 函数A开始 ---
--- 函数B执行 ---  
--- 函数A结束 ---

7.2 嵌套调用执行流程

7.3 实际应用示例

def calculate_circle_area(radius):
    """计算圆面积"""
    return 3.14 * radius ** 2

def calculate_cylinder_volume(radius, height):
    """计算圆柱体积"""
    # 嵌套调用:在函数内部调用另一个函数
    base_area = calculate_circle_area(radius)
    volume = base_area * height
    return volume

# 调用函数
volume = calculate_cylinder_volume(5, 10)
print(f"圆柱体积:{volume}")

7.4 多层嵌套

def level_c():
    print("执行层级C")

def level_b():
    print("执行层级B")
    level_c()  # 嵌套调用
    print("层级B完成")

def level_a():
    print("执行层级A") 
    level_b()  # 嵌套调用
    print("层级A完成")

level_a()

八、变量的作用域

8.1 局部变量

局部变量:在函数内部定义的变量,只在函数内部有效。

def test_function():
    local_var = "我是局部变量"  # 局部变量
    print(local_var)  # 在函数内部可以访问

test_function()  # 输出:我是局部变量
# print(local_var)  # 报错:在函数外部无法访问

8.2 全局变量

全局变量:在函数外部定义的变量,在函数内外都可以访问。

global_var = "我是全局变量"  # 全局变量

def function1():
    print(f"函数1访问:{global_var}")  # 可以访问全局变量

def function2():
    print(f"函数2访问:{global_var}")  # 可以访问全局变量

function1()  # 输出:函数1访问:我是全局变量
function2()  # 输出:函数2访问:我是全局变量
print(f"外部访问:{global_var}")  # 输出:外部访问:我是全局变量

8.3 global关键字

使用global关键字在函数内部修改全局变量。

count = 0  # 全局变量

def increment():
    global count  # 声明使用全局变量count
    count += 1    # 修改全局变量
    print(f"计数:{count}")

def increment_local():
    count = 0  # 局部变量,不影响全局变量
    count += 1
    print(f"局部计数:{count}")

increment()        # 输出:计数:1
increment()        # 输出:计数:2  
increment_local()  # 输出:局部计数:1
print(f"最终计数:{count}")  # 输出:最终计数:2

8.4 变量查找规则

Python按照LEGB规则查找变量:

  • Local(局部作用域)
  • Enclosing(嵌套函数作用域)
  • Global(全局作用域)
  • Built-in(内置作用域)

九、综合案例:黑马ATM系统

9.1 案例需求

实现一个简单的银行ATM系统,包含以下功能:

  • 查询余额
  • 存款
  • 取款
  • 主菜单导航

9.2 完整代码实现

# 全局变量
money = 5000000  # 初始余额
name = None      # 客户姓名

# 主菜单函数
def main_menu():
    """显示主菜单"""
    print("\n--- 主菜单 ---")
    print(f"{name},您好,欢迎来到黑马银行ATM")
    print("查询余额\t[输入1]")
    print("存款\t\t[输入2]") 
    print("取款\t\t[输入3]")
    print("退出\t\t[输入4]")
    
    return input("请输入您的选择:")

# 查询余额函数
def check_balance():
    """查询余额"""
    print("\n--- 查询余额 ---")
    print(f"{name},您好,您的余额剩余:{money}元")

# 存款函数
def deposit():
    """存款操作"""
    global money  # 声明使用全局变量
    
    print("\n--- 存款 ---")
    amount = int(input("请输入存款金额:"))
    
    if amount > 0:
        money += amount
        print(f"{name},您好,您存款{amount}元成功")
        print(f"{name},您好,您的余额剩余:{money}元")
    else:
        print("存款金额必须大于0")

# 取款函数  
def withdraw():
    """取款操作"""
    global money  # 声明使用全局变量
    
    print("\n--- 取款 ---")
    amount = int(input("请输入取款金额:"))
    
    if amount > money:
        print("余额不足,取款失败")
    elif amount <= 0:
        print("取款金额必须大于0")
    else:
        money -= amount
        print(f"{name},您好,您取款{amount}元成功")
        print(f"{name},您好,您的余额剩余:{money}元")

# 主程序
def main():
    """主程序"""
    global name
    
    # 输入客户姓名
    name = input("请输入您的姓名:")
    
    while True:
        # 显示主菜单并获取用户选择
        choice = main_menu()
        
        # 根据选择执行相应操作
        if choice == "1":
            check_balance()
        elif choice == "2":
            deposit()
        elif choice == "3":
            withdraw()
        elif choice == "4":
            print("感谢使用,再见!")
            break
        else:
            print("输入错误,请重新输入")

# 启动程序
if __name__ == "__main__":
    main()

9.3 功能演示

请输入您的姓名:周杰轮

--- 主菜单 ---
周杰轮,您好,欢迎来到黑马银行ATM
查询余额	[输入1]
存款		[输入2]
取款		[输入3]
退出		[输入4]
请输入您的选择:1

--- 查询余额 ---
周杰轮,您好,您的余额剩余:5000000元

9.4 案例特点

  1. 模块化设计:每个功能独立成函数
  2. 全局变量使用:余额和姓名使用全局变量
  3. 用户交互:通过输入输出与用户交互
  4. 循环菜单:直到用户选择退出才结束

十、函数最佳实践

10.1 函数设计原则

  1. 单一职责:每个函数只完成一个特定功能
  2. 明确接口:参数和返回值要清晰明确
  3. 适当长度:函数不宜过长,建议不超过50行
  4. 良好命名:函数名要能清晰表达功能

10.2 代码规范

# 好的函数设计
def calculate_monthly_payment(principal, annual_rate, years):
    """
    计算等额本息月供
    
    :param principal: 贷款本金
    :param annual_rate: 年利率  
    :param years: 贷款年限
    :return: 月供金额
    """
    monthly_rate = annual_rate / 12 / 100
    months = years * 12
    payment = principal * monthly_rate * (1 + monthly_rate) ** months / ((1 + monthly_rate) ** months - 1)
    return round(payment, 2)

# 清晰的函数调用
loan_amount = 1000000  # 100万
rate = 4.5  # 年利率4.5%
term = 30   # 30年

monthly_payment = calculate_monthly_payment(loan_amount, rate, term)
print(f"月供:{monthly_payment}元")

10.3 调试技巧

  1. 打印中间结果:在复杂函数中打印关键变量
  2. 分步测试:先测试小函数,再测试组合功能
  3. 异常处理:使用try-except处理可能的错误

通过系统学习Python函数,您已经掌握了代码组织和复用的核心技能。函数是构建复杂程序的基础,良好的函数设计能够大大提高代码质量和开发效率。多加练习,熟练掌握各种函数的使用场景,将为您的编程之路打下坚实基础。

posted @ 2026-01-23 14:44  FxorG  阅读(0)  评论(0)    收藏  举报