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 代码的核心。全局与局部变量的作用域规则见后续篇章。

笔记加载中…