Python 用 def 定義函數,運行時創建函數對象並賦值給變量名。語法:
def function_name(param1, param2, ...):
statements
return expression # 可選,默認返回 None
不同於編譯型語言,def 在運行時才執行,可動態定義函數:
if debug:
def log(msg): print("DEBUG:", msg)
else:
def log(msg): pass # 無操作
func.attr = value 可攜帶狀態,生命週期長於調用。func.__name__, func.__code__.co_varnames 等獲取元信息。def echo(msg): print(msg)
x = echo
x("間接調用") # 輸出: 間接調用
def indirect(func, arg): func(arg)
indirect(echo, "參數調用") # 輸出: 參數調用
schedule = [(echo, "任務1"), (echo, "任務2")]
for func, arg in schedule: func(arg) # 表驅動編程
Python 函數參數無類型聲明,同一函數可處理不同類型:
def times(x, y): return x * y
times(2, 4) # 8
times("Ni", 4) # "NiNiNiNi"
def bad_append(item, lst=[]): # 危險:默認列表只初始化一次
lst.append(item)
return lst
def good_append(item, lst=None):
if lst is None: lst = []
lst.append(item)
return lst
語法:lambda args: expression。主體只能是單一表達式,適用於簡短回調:
f = lambda x, y, z: x + y + z
f(2, 3, 4) # 9
# 跳轉表
actions = [lambda x: x**2, lambda x: x**3, lambda x: x**4]
for func in actions: print(func(2)) # 4, 8, 16
# 字典分發
key = 'got'
{'already': lambda: 2+2, 'got': lambda: 2*4}[key]() # 8
counters = [1, 2, 3, 4]
list(map(lambda x: x+10, counters)) # [11, 12, 13, 14]
list(filter(lambda x: x > 0, range(-5,5))) # [1, 2, 3, 4]
from functools import reduce
reduce(lambda x, y: x+y, [1,2,3,4]) # 10
reduce(lambda x, y: x*y, [1,2,3,4]) # 24
包含 yield 的函數是生成器函數,調用返回迭代器,逐次產出值:
def gen(n):
for i in range(n):
yield i * i
g = gen(3)
next(g) # 0
next(g) # 1
list(gen(3)) # [0, 1, 4]
def decorator(func):
def wrapper(*args, **kwargs):
print("前置邏輯")
result = func(*args, **kwargs)
print("後置邏輯")
return result
return wrapper
@decorator
def greet(name):
print(f"Hello, {name}")
greet("World")
# 輸出:
# 前置邏輯
# Hello, World
# 後置邏輯
Python 函數是靈活的第一級對象,支援多態、閉包、裝飾器等高級特性。掌握 def/lambda、參數綁定機制、生成器與函數式工具,能編寫更優雅、可維護的代碼。