函数

定义与调用

def greet(name):
    return f"Hello, {name}!"
 
greet("Alice")   # "Hello, Alice!"
 
# 无返回值隐式返回 None
def log(msg):
    print(msg)

参数类型

# 默认参数(仅在定义时求值一次)
def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"
 
# ❌ 可变类型默认值陷阱
def append_bad(item, lst=[]):    # 所有调用共享同一个列表
    lst.append(item)
    return lst
 
# ✅ 正确写法
def append(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst
 
# 仅位置参数(/ 之前,Python 3.8+)
def fn(a, b, /, c):
    pass
fn(1, 2, c=3)    # a、b 只能按位置传
 
# 仅关键字参数(* 之后)
def fn(a, *, b, c):
    pass
fn(1, b=2, c=3)  # b、c 只能按关键字传

*args 与 **kwargs

def fn(*args, **kwargs):
    print(args)    # tuple
    print(kwargs)  # dict
 
fn(1, 2, x=3, y=4)
# (1, 2)
# {'x': 3, 'y': 4}
 
# 解包传参
lst = [1, 2, 3]
fn(*lst)           # 等价于 fn(1, 2, 3)
d = {"a": 1, "b": 2}
fn(**d)            # 等价于 fn(a=1, b=2)

返回值

def minmax(lst):
    return min(lst), max(lst)   # 返回 tuple
 
lo, hi = minmax([3, 1, 4, 1, 5])
 
# 提前返回
def find(lst, target):
    for i, v in enumerate(lst):
        if v == target:
            return i
    return -1

Lambda

add = lambda a, b: a + b
add(1, 2)   # 3
 
# 常用于排序和高阶函数
nums = [3, 1, 4, 1, 5]
sorted(nums, key=lambda x: -x)
list(map(lambda x: x**2, nums))
list(filter(lambda x: x > 2, nums))

作用域与闭包

# LEGB 规则:Local → Enclosing → Global → Built-in
x = 10
 
def outer():
    x = 20
    def inner():
        nonlocal x   # 修改外层变量
        x = 30
    inner()
    print(x)         # 30
 
outer()
print(x)             # 10
 
# global 关键字
count = 0
def increment():
    global count
    count += 1
 
# 闭包:内层函数捕获外层变量
def make_adder(n):
    def adder(x):
        return x + n
    return adder
 
add5 = make_adder(5)
add5(3)   # 8

高阶函数

from functools import reduce
 
list(map(str, [1, 2, 3]))                 # ['1','2','3']
list(filter(lambda x: x > 0, [-1,0,1]))  # [1]
reduce(lambda a, b: a + b, [1,2,3,4])    # 10

functools 工具

from functools import lru_cache, partial, wraps
 
# 记忆化缓存
@lru_cache(maxsize=128)
def fib(n):
    if n < 2: return n
    return fib(n-1) + fib(n-2)
 
fib.cache_info()   # 查看缓存命中率
 
# 固定部分参数
def power(base, exp): return base ** exp
square = partial(power, exp=2)
square(5)   # 25

类型注解

def add(a: int, b: int) -> int:
    return a + b
 
def greet(name: str, times: int = 1) -> list[str]:
    return [f"Hello, {name}!"] * times

相关链接