2016-02-20 62 views
0

我正在定义一个函数,它需要使用用户定义的函数user_function(a,b,possibly_lots_more_arguments)。问题是possibly_lots_more_arguments可能是空的。我看到两种方法来处理这个问题,我想知道如果一个比另一个“更好”。处理可能具有可变数量参数的用户定义函数

这是一个相当简单的例子。 f通过定义一个测试是否有额外参数的函数来处理这个问题。 g通过创建一个更长的列表来处理这个问题。 func1func2函数显然是用户定义函数的玩具示例。

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比较好,但我可能需要调用用户功能好几次,这有可能会难看。

我从来没有写过透明代码,除非确保一年后我能理解它。我在这里做的代码可能会被其他人使用。由于性能或可读性的原因,其中一种内在更好吗?还是另一种更好的选择?

+0

为什么不使用* args表示可变数量的位置参数? http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-python-parameters –

+1

@GarrettR说什么。另外'foo是None',而不是'foo == None',用于测试'None'。 http://stackoverflow.com/questions/100732/why-is-if-not-someobj-better-than-if-someobj-none-in-python – gil

+0

@GarrettR真的,我有几个用户定义的函数,所以我可以' t使我的函数变成'f(userfunc,* parameters)' - 我的函数需要'f(userf1,userf2,parameters1 = [],parameters2 = [])''。我错误地认为调用'userf1(*参数1)'失败,如果它是空的。 – Joel

回答

0

你刚刚没有意识到*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

相关问题