Python3 函数
函数把可复用代码封装起来:接收参数、完成计算、返回结果。Python 用 def 定义函数。把程序拆成职责单一的函数,结构更清晰,也避免重复代码。
定义、调用与返回值
没有 return 时函数返回 None;return 多个值会打包成元组返回:
def calc(a, b):
return a + b, a - b # return 多个值 => 元组
s, d = calc(8, 3)
print(s, d) # 输出:11 5
参数传递
不可变对象传的是"值",函数内重新赋值不影响外面;可变对象传引用,函数内修改会反映到外面:
def f(x):
x = 100 # 只影响局部变量
n = 1
f(n)
print(n) # 输出:1
def g(lst):
lst.append(9) # 修改了外部列表
a = [1]
g(a)
print(a) # 输出:[1, 9]
位置参数与关键字参数
def info(name, age):
print(name, age)
info("小明", 18) # 位置参数 -> 输出:小明 18
info(age=18, name="小明") # 关键字参数 -> 输出:小明 18
默认参数陷阱
默认值只在定义时创建一次,调用时可省略;绝不能使用可变对象当默认值:
def power(x, n=2): # n 默认值是 2
return x ** n
print(power(3)) # 输出:9
print(power(3, 3)) # 输出:27
def bad(x, lst=[]): # 错误:默认列表被所有调用共享
lst.append(x)
return lst
print(bad(1)) # 输出:[1]
print(bad(2)) # 输出:[1, 2](上次结果还在!)
def good(x, lst=None): # 正确:默认 None,内部再创建
if lst is None:
lst = []
lst.append(x)
return lst
print(good(1)) # 输出:[1]
print(good(2)) # 输出:[2]
*args 与 **kwargs
*args 收集多余位置参数成元组,**kwargs 收集多余关键字参数成字典:
def total(*args):
return sum(args)
print(total(1, 2, 3)) # 输出:6
def show(**kwargs):
for k, v in kwargs.items():
print(k, v)
show(name="小明", age=18)
# 输出:
# name 小明
# age 18
lambda 与递归
lambda 写"只用一次"的简单函数,常配合 sort 使用;函数调用自身叫递归,必须有结束条件:
square = lambda x: x * x
print(square(4)) # 输出:16
def fact(n):
if n <= 1:
return 1
return n * fact(n - 1)
print(fact(5)) # 输出:120
小结:函数封装逻辑、隔离数据;掌握默认参数陷阱、*args/**kwargs、lambda 与递归,就掌握了组织 Python 代码的核心。全局与局部变量的作用域规则见后续篇章。