Python函数作为参数传递时,能否为部分参数设置固定值?
函数作为参数传递时固定部分参数的实现方法
你想在把函数作为参数传给其他函数时,临时为原函数的部分参数设置固定值(和函数定义时的默认值不同,默认值是全局固定的,这里是传递时按需指定),但尝试的代码出现了错误:
第一次尝试的代码及问题
def my_cross(y,cross=2): y=y*cross; return y; def my_print(func,x): print(func(x)) my_print(my_cross(cross=3),3)
这段代码报错是因为my_cross(cross=3)会直接执行函数,但此时必填参数y没有传入,所以触发参数缺失错误。
第二次尝试的代码及问题
def my_cross(y: int = 1,cross=2): y=y*cross; return y; def my_print(func,x): print(func(x)) my_print(my_cross(cross=3),3)
运行后报错TypeError: 'int' object is not callable,原因是my_cross(cross=3)已经执行并返回了整数3(因为y有默认值1,1*3=3),你把这个整数传给了my_print的func参数,之后调用func(x)相当于试图调用整数3,自然会触发“不可调用”的错误。
正确的实现方法
要实现传递函数时固定部分参数,你需要创建一个新的可调用对象,把原函数的部分参数固定后再传递,常用两种方法:
方法1:使用functools.partial
这是Python标准库提供的工具,专门用来固定函数的部分参数:
from functools import partial def my_cross(y, cross=2): return y * cross def my_print(func, x): print(func(x)) # 固定cross=3,生成一个只需要传入y的新函数 fixed_cross_func = partial(my_cross, cross=3) my_print(fixed_cross_func, 3) # 输出9
方法2:使用lambda表达式
用匿名函数封装原函数,手动固定指定参数:
def my_cross(y, cross=2): return y * cross def my_print(func, x): print(func(x)) # 用lambda接收y参数,内部调用my_cross时固定cross=3 my_print(lambda y: my_cross(y, cross=3), 3) # 输出9
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

