lesson16:Python函数的认识
目录
一、为什么需要函数?
1. 拒绝重复造轮子
2. 让代码像句子一样可读
3. 隔离变化,降低维护成本
二、函数的定义:编写高质量函数的5个要素
基本语法框架
1. 函数命名的黄金法则(PEP8规范)
2. 不可或缺的文档字符串(Docstring)
3. 参数设计的艺术
4. 函数体的单一职责原则
5. 返回值的清晰表达
三、函数调用:3种传递参数的方式
1. 位置参数(最常用)
2. 关键字参数(提升可读性)
3. 混合使用(位置参数在前)
四、形参VS实参:参数的"前世今生"
生动案例:快递柜的故事
参数传递的注意事项
五、实战进阶:温度转换工具函数
六、避坑指南:初学者常犯的5个错误
1. 缩进错误(IndentationError)
2. 参数数量不匹配(TypeError)
3. 忽略返回值
4. 函数名拼写错误
5. 在函数定义前调用函数
七、总结与练习
一、为什么需要函数?
在编程中,函数就像一个"功能盒子"——把重复执行的代码块打包起来,需要时直接"调用"这个盒子即可。想象你每天早上都要做三件事:刷牙、洗脸、吃早餐。如果把这三个动作写成代码,没有函数的话,每次都要重复写三遍相同的步骤;而有了函数,你可以把它们分别定义成brush_teeth()
、wash_face()
、eat_breakfast()
三个函数,之后只需依次调用这三个函数名即可。
函数的核心目的:
- 代码复用:避免重复编写相同逻辑
- 模块化:将复杂问题拆解为小任务
- 可读性:用函数名直接体现代码功能
函数就是代码世界的"工序卡",解决三大核心问题:
1. 拒绝重复造轮子
没有函数的代码:
# 计算三个矩形的面积
print(5*3) # 第一个矩形
print(4*6) # 第二个矩形
print(7*2) # 第三个矩形
有函数的代码:
def calculate_rect_area(width, height):
return width * heightprint(calculate_rect_area(5,3)) # 复用相同逻辑
print(calculate_rect_area(4,6))
print(calculate_rect_area(7,2))
2. 让代码像句子一样可读
# 不好的代码:一堆数字和符号
if score >= 90 and score <= 100:
print("优秀")# 好的代码:函数名即注释
def is_excellent(score):
return 90 <= score <= 100if is_excellent(score):
print("优秀")
3. 隔离变化,降低维护成本
当计算面积的公式需要修改(比如增加单位转换),只需修改函数内部,而不用在代码中到处查找width*height
的片段。
二、函数的定义:编写高质量函数的5个要素
基本语法框架
def 函数名(参数列表):"""函数文档字符串(可选但推荐)"""# 函数体(缩进4个空格)return 返回值 # 可选
1. 函数命名的黄金法则(PEP8规范)
- 全部小写,用下划线分隔:
calculate_area
✅,CalculateArea
❌ - 使用动词或动词短语:
get_user_info
✅,user_info
❌ - 避免单字母命名(除常见约定:
i
/j
循环变量,x
/y
坐标)
2. 不可或缺的文档字符串(Docstring)
def calculate_circle_area(radius):
"""计算圆的面积参数:
radius (float): 圆的半径,必须大于0返回:
float: 圆的面积(πr²)异常:
ValueError: 当半径为负数时触发
"""
if radius < 0:
raise ValueError("半径不能为负数")
return 3.14159 * radius **2
技巧:在PyCharm等IDE中输入
"""
按回车,会自动生成文档字符串模板
3. 参数设计的艺术
- 必要参数:必须传递的参数(如
radius
) - 默认参数:带有默认值的参数(
def greet(name="Guest")
) - 参数顺序:重要参数放前面,可选参数放后面
4. 函数体的单一职责原则
一个函数只做一件事!以下是反面教材:
def bad_function(user_id):
# 同时做三件事:查询用户、发邮件、记录日志
user = db.query(user_id)
send_email(user.email)
log_activity(user_id)
return user
5. 返回值的清晰表达
- 始终返回同一类型(避免有时返回列表,有时返回None)
- 复杂逻辑用多个return提前退出,比嵌套if更清晰:
def get_grade(score):
if score < 0 or score > 100:
return "无效分数" # 提前返回异常情况
if score >= 90:
return "A"
if score >= 80:
return "B"
# ...其他分数段
三、函数调用:3种传递参数的方式
1. 位置参数(最常用)
按参数定义顺序传递:
def divide(dividend, divisor):
return dividend / divisorresult = divide(10, 2) # dividend=10, divisor=2
2. 关键字参数(提升可读性)
明确指定参数名,顺序可以打乱:
result = divide(dividend=10, divisor=2)
# 等价于
result = divide(divisor=2, dividend=10)
3. 混合使用(位置参数在前)
def greet(title, name):
return f"{title}. {name}"greet("Mr", name="Smith") # 正确:位置参数在前
# greet(title="Mr", "Smith") # 错误:关键字参数不能在位置参数前
四、形参VS实参:参数的"前世今生"
维度 | 形参(形式参数) | 实参(实际参数) |
---|---|---|
位置 | 函数定义时 def func(x, y) | 函数调用时 func(3, 5) |
本质 | 函数内部的局部变量声明 | 传递给函数的具体值/变量 |
生命周期 | 函数调用期间存在 | 遵循自身的变量作用域 |
生动案例:快递柜的故事
- 形参:快递柜上的"格子A"、"格子B"(定义了存放位置)
- 实参:你放入格子A的"手机"、格子B的"钥匙"(实际存放的物品)
- 函数调用:快递柜系统执行"存储(格子A, 手机)"操作
参数传递的注意事项
def add_one(num):
num += 1 # 形参的修改不影响实参x = 5
add_one(x)
print(x) # 输出:5(x的值未改变)
五、实战进阶:温度转换工具函数
让我们构建一个完整的温度转换模块,包含:
- 摄氏度转华氏度
- 华氏度转摄氏度
- 参数验证功能
def celsius_to_fahrenheit(celsius):
"""摄氏度转华氏度 (°F = °C × 9/5 + 32)"""
if not isinstance(celsius, (int, float)):
raise TypeError("温度必须是数字")
if celsius < -273.15:
raise ValueError("温度不能低于绝对零度(-273.15°C)")
return celsius * 9/5 + 32def fahrenheit_to_celsius(fahrenheit):
"""华氏度转摄氏度 (°C = (°F - 32) × 5/9)"""
if not isinstance(fahrenheit, (int, float)):
raise TypeError("温度必须是数字")
if fahrenheit < -459.67:
raise ValueError("温度不能低于绝对零度(-459.67°F)")
return (fahrenheit - 32) * 5/9# 使用示例
try:
temp_f = celsius_to_fahrenheit(25)
print(f"25°C = {temp_f:.1f}°F") # 输出:25°C = 77.0°Ftemp_c = fahrenheit_to_celsius(77)
print(f"77°F = {temp_c:.1f}°C") # 输出:77°F = 25.0°C
except (TypeError, ValueError) as e:
print(f"转换失败:{e}")
六、避坑指南:初学者常犯的5个错误
1. 缩进错误(IndentationError)
def my_func():
print("Hello") # 错误:函数体没有缩进
2. 参数数量不匹配(TypeError)
def add(a, b):
return a + badd(1) # 错误:缺少1个位置参数
3. 忽略返回值
def calculate_sum(a, b):
result = a + b # 错误:没有return语句total = calculate_sum(3, 5)
print(total) # 输出:None
4. 函数名拼写错误
def print_greeting():
print("Hello")print_greetng() # 错误:函数名拼写错误(少了一个i)
5. 在函数定义前调用函数
my_func() # 错误:调用时函数还未定义def my_func():
print("Hello")
七、总结与练习
函数是编程的基础模块,掌握其定义规范、调用逻辑和参数传递机制,是写出简洁、高效、可维护代码的关键。后续将深入学习参数进阶用法(默认参数、不定长参数等)和函数作用域,进一步提升代码灵活性。