第 5 章 · 函数
本章目标:掌握函数定义、调用、返回值;理解参数(位置、关键字、默认值、args、kwargs);了解作用域与 LEGB 规则;会写文档字符串与类型注解;能将 shop-demo* 业务拆分为可复用函数模块。
学时建议:4~5 小时(含 1.5 小时跟练)
前置:ch02~ch04。
5.1 定义与调用
def greet(name: str) -> str:
"""向用户问好(教学示例)。"""
return f"你好,{name}!"
msg = greet("user-demo")
print(msg)
| 要素 | 说明 |
|---|---|
def | 定义函数 |
| 参数列表 | 可有零个或多个 |
return | 返回结果;省略则返回 None |
| 文档字符串 | 紧接函数体首行的 """...""" |
def add(a, b):
return a + b
def log_only(text):
print(text) # 隐式 return None
5.2 参数种类
def order_item(title, qty=1, *, gift=False):
"""
title: 书名(位置/关键字均可)
qty: 数量,默认 1
gift: 仅关键字参数(* 之后)
"""
flag = "(赠品)" if gift else ""
return f"{title} x{qty}{flag}"
order_item("Python 基础")
order_item("Web 开发", qty=2)
order_item("算法", gift=True)
| 参数类型 | 示例 |
|---|---|
| 位置参数 | f(1, 2) |
| 关键字参数 | f(b=2, a=1) |
| 默认值 | def f(x=10) |
| 仅关键字 | def f(*, key) |
可变参数
def total(*prices):
return sum(prices)
print(total(10, 20, 5.5)) # 35.5
def build_user(**fields):
return fields
print(build_user(name="user-demo", level=1))
# {'name': 'user-demo', 'level': 1}
| 符号 | 含义 |
|---|---|
*args | 多余位置参数 → 元组 |
**kwargs | 多余关键字参数 → 字典 |
def mix(a, b, *args, **kwargs):
print(a, b, args, kwargs)
5.3 默认参数陷阱
# 正确写法
def add_to_cart(item, cart=None):
if cart is None:
cart = []
cart.append(item)
return cart
切勿用可变对象(list、dict)作默认值,否则多次调用共享同一对象。
5.4 作用域 LEGB
查找顺序:Local → Enclosing → Global → Built-in。
tax_rate = 0.06 # 全局
def calc_tax(amount):
tax_rate = 0.05 # 局部,遮蔽全局
return amount * tax_rate
def set_rate():
global tax_rate
tax_rate = 0.08
| 关键字 | 作用 |
|---|---|
global | 在函数内修改全局变量 |
nonlocal | 修改外层(非全局)闭包变量 |
def make_counter():
count = 0
def inc():
nonlocal count
count += 1
return count
return inc
5.5 lambda 与内置函数
prices = [59.9, 19.5, 88.0]
sorted_prices = sorted(prices, key=lambda p: -p)
nums = [1, -2, 3, -4]
positives = list(filter(lambda x: x > 0, nums))
doubled = list(map(lambda x: x * 2, nums))
| 函数 | 用途 |
|---|---|
sorted(iter, key=) | 排序 |
map(fn, iter) | 映射 |
filter(fn, iter) | 过滤 |
zip / enumerate | 组合遍历 |
复杂逻辑优先 def,lambda 适合一行简单表达式。