你是不是写函数只停留在 def 函数名(参数): 的基础操作?这几个进阶偏基础的函数小技巧,让你的函数更灵活、更健壮,同事看了都得喊 “666”!
1. 函数参数默认值:小心可变对象的 “坑”
给函数参数设默认值很常见,但如果默认值是列表、字典这种可变对象,就会踩大坑!因为默认参数只在函数定义时初始化一次。
# 反面教材:默认参数是可变对象
def add_item(item, lst=[]):
lst.append(item)
return lst
# 第一次调用,看似正常
print(add_item(1)) # [1]
# 第二次调用,居然带上了上次的结果!
print(add_item(2)) # [1, 2]
# 正确姿势:用 None 做默认值,函数内初始化
def add_item_safe(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(add_item_safe(1)) # [1]
print(add_item_safe(2)) # [2]
2. 函数注解:给代码加 “说明书”,可读性拉满
函数注解不是强制语法,但能清晰标注参数类型和返回值类型,相当于给代码写了免费文档,还能被 IDE 识别提示。
# 带注解的函数:参数名: 类型,-> 返回值类型
def calculate_sum(a: int, b: int) -> int:
"""计算两个整数的和"""
return a + b
# 注解不影响运行,只是提示
print(calculate_sum(3, 5)) # 8
# 甚至可以传其他类型(注解不做强制校验)
print(calculate_sum("hello ", "world")) # hello world
# 查看函数注解
print(calculate_sum.__annotations__)
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}
3. 嵌套函数:函数里套函数,实现代码 “私有化”
在函数内部定义另一个函数,内层函数可以访问外层函数的变量,还能实现逻辑封装,对外隐藏细节。
def outer_func(msg: str):
# 嵌套的内层函数
def inner_func():
print(f"内层函数收到消息: {msg}")
# 外层函数调用内层函数
inner_func()
print("外层函数执行完毕")
# 调用外层函数
outer_func("Python 真好玩")
# 输出:
# 内层函数收到消息: Python 真好玩
# 外层函数执行完毕
# 进阶:闭包——内层函数作为返回值
def make_multiplier(factor: int):
def multiplier(x: int):
return x * factor
return multiplier
# 创建两个乘法器
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
小总结
- 给函数参数设默认值时,避免用可变对象,优先用
None初始化; - 函数注解能提升代码可读性,让别人一看就懂参数和返回值类型;
- 嵌套函数 + 闭包可以实现逻辑封装,还能动态生成功能不同的函数。