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 注意事项
- 先定义后使用:函数必须在使用前定义
- 函数名命名规范:使用小写字母和下划线
- 缩进正确:函数体必须正确缩进
- 参数可选:根据需要决定是否使用参数
三、函数的参数
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 案例特点
- 模块化设计:每个功能独立成函数
- 全局变量使用:余额和姓名使用全局变量
- 用户交互:通过输入输出与用户交互
- 循环菜单:直到用户选择退出才结束
十、函数最佳实践
10.1 函数设计原则
- 单一职责:每个函数只完成一个特定功能
- 明确接口:参数和返回值要清晰明确
- 适当长度:函数不宜过长,建议不超过50行
- 良好命名:函数名要能清晰表达功能
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 调试技巧
- 打印中间结果:在复杂函数中打印关键变量
- 分步测试:先测试小函数,再测试组合功能
- 异常处理:使用try-except处理可能的错误
通过系统学习Python函数,您已经掌握了代码组织和复用的核心技能。函数是构建复杂程序的基础,良好的函数设计能够大大提高代码质量和开发效率。多加练习,熟练掌握各种函数的使用场景,将为您的编程之路打下坚实基础。

浙公网安备 33010602011771号