处理可能具有可变数量参数的用户定义函数
问题描述:
我正在定义一个函数,它需要使用用户定义的函数user_function(a,b,possibly_lots_more_arguments)
。问题是possibly_lots_more_arguments
可能是空的。我看到两种方法来处理这个问题,我想知道如果一个比另一个“更好”。处理可能具有可变数量参数的用户定义函数
这是一个相当简单的例子。 f
通过定义一个测试是否有额外参数的函数来处理这个问题。 g
通过创建一个更长的列表来处理这个问题。 func1
和func2
函数显然是用户定义函数的玩具示例。
def f(user_function, parameters = None):
def my_user_function(alpha, beta, my_parameters):
if my_parameters == None:
return user_function(alpha, beta)
else:
return user_function(alpha, beta, *my_parameters)
for a in range(4):
for b in range(3):
if my_user_function(a,b,parameters):
print "it's True"
else:
print "it's False"
def g(user_function, parameters = []):
for a in range(4):
for b in range(3):
L=[a,b]+list(parameters) #parameters could be a tuple
if (user_function(*L)):
print "it's True"
else:
print "it's False"
def func1(a,b,c):
return a+b<c
def func2(a,b):
return a+b<4
print 'f(func1)'
f(func1,[4])
print 'g(func1)'
g(func1,[4])
print 'f(func2)'
f(func2)
print 'g(func2)'
g(func2)
我觉得g
比较好,但我可能需要调用用户功能好几次,这有可能会难看。
我从来没有写过透明代码,除非确保一年后我能理解它。我在这里做的代码可能会被其他人使用。由于性能或可读性的原因,其中一种内在更好吗?还是另一种更好的选择?
答
你刚刚没有意识到*args
可以正常工作,并且空的args
?
def h(user_function, parameters=()):
for a in range(4):
for b in range(3):
if (user_function(a, b, *parameters)):
print "it's True"
else:
print "it's False"
+0
我没有意识到 - 事实上,我以为我测试了它,并感到惊讶它没有工作 – Joel
为什么不使用* args表示可变数量的位置参数? http://*.com/questions/36901/what-does-double-star-and-star-do-for-python-parameters –
@GarrettR说什么。另外'foo是None',而不是'foo == None',用于测试'None'。 http://*.com/questions/100732/why-is-if-not-someobj-better-than-if-someobj-none-in-python – gil
@GarrettR真的,我有几个用户定义的函数,所以我可以' t使我的函数变成'f(userfunc,* parameters)' - 我的函数需要'f(userf1,userf2,parameters1 = [],parameters2 = [])''。我错误地认为调用'userf1(*参数1)'失败,如果它是空的。 – Joel