Python 中如何匿名传递多个函数作为参数(类似 PHP 的可变函数参数)

python 支持直接将匿名函数(lambda)或具名函数作为参数传入,通过 `*args` 可灵活接收任意数量的函数对象,并依次调用,无需预先定义函数列表。

在 Python 中,函数是一等公民(first-class objects),可被赋值、存储于数据结构、作为参数传递或作为返回值。这使得实现类似 PHP 中 s('a', 'b', function(){...}, function(){...}) 的匿名多函数传参模式非常自然且简洁。

核心方案是使用 *args 解包可变位置参数,并配合 lambda 表达式实现真正的“即写即用”函数:

def s(t1, t2, *funcs):
    print(t1)  # 注意:PHP 中 echo '$t1' 是字面量输出,Python 应输出变量值
    print(t2)
    for func in funcs:
        func()  # 直接调用每个传入的函数对象

# ✅ 正确用法:传入两个 lambda 和一个普通函数
def say_six():
    print(6)

s('a', 'b', 
  lambda: print(5),      # 匿名函数,无需命名
  lambda: print(7 + 1),  # 支持表达式
  say_six                # 已定义函数名(不加括号!)
)

输出结果:

a
b
5
8
6

⚠️ 注意事项:

立即学习“PHP免费学习笔记(深入)”;

  • lambda 仅支持单个表达式,不可包含语句(如 if、for、return 等);若逻辑复杂,请改用 def 定义具名函数后传入。
  • 传入的是函数对象本身(如 lambda: ... 或 say_six),切勿写成 lambda: ...() 或 say_six() —— 后者会立即执行并传入返回值(通常是 None),导致运行时报错 TypeError: 'NoneType' object is not callable。
  • functools.partial 适用于“预设部分参数”的场景(如 partial(print, "Hello")),但本例中目标是延迟执行,lambda 更直观、语义更清晰;partial(print, 5) 实际等价于 lambda: print(5),但前者略显冗余且可读性较低。

✅ 最佳实践总结:
使用 *funcs 接收可变函数参数 + lambda 构建轻量匿名函数 + 显式调用 func(),即可完全复现 PHP 的动态函数调用风格,代码简洁、意图明确、符合 Pythonic 哲学。