Python声明函数的不同方式 除def和lambda外还有其他方法吗
Python函数定义的常见方式
你已提到的两种基础方式
- 标准
def关键字声明,是最常用的函数定义方式:
# example 1 def f(x): return x
lambda匿名函数赋值,适合定义简单的单行逻辑函数:
# example 2 f = lambda x: x
其他可实现函数/可调用对象构造的方法
- 用
types.FunctionType动态构造函数
可以直接通过Python内置的函数类型,从代码对象、全局命名空间等参数动态生成函数,适合需要运行时生成函数逻辑的场景:
import types # 先编译得到代码对象 code_obj = compile('def f(x): return x', '<dynamic_code>', 'exec') # 从代码对象构造函数 f = types.FunctionType(code_obj.co_consts[0], globals(), 'f')
- 重载类的
__call__方法生成可调用实例
给自定义类实现__call__魔术方法后,类的实例就可以像普通函数一样被调用,这种方式适合需要在"函数"中持久保存内部状态的场景:
class FuncSimulator: def __call__(self, x): return x f = FuncSimulator()
- 闭包返回内层函数
在外层函数内部定义内层函数,再把内层函数作为返回值返回,内层函数可以保留外层函数的上下文变量,是实现状态持有、装饰器等功能的常用方式:
def outer_func(): def inner_func(x): return x return inner_func f = outer_func()
- 用
functools.partial生成偏函数
基于已有函数固定部分入参,生成新的可调用对象,适合需要复用已有函数逻辑、简化入参的场景:
from functools import partial def base_calc(x, y): return x + y # 固定y参数为0,得到只需要传入x的新函数 f = partial(base_calc, y=0)
- 特殊类型函数定义
Python还有两类特殊的函数声明语法,分别对应生成器和协程场景:
# 生成器函数:调用后返回生成器迭代器,支持惰性返回值 def f(x): yield x # 异步协程函数:需要在异步运行时中调用,支持IO并发逻辑 async def f(x): return x
内容的提问来源于stack exchange,提问作者mezein
相关产品推荐
相关产品推荐

