2012-01-16 55 views
4

嗨我需要一个函数,它会接受一个函数并返回一个将运行该函数的函数,例如。 1000次,每次评估它的论点。我有这样的事情:用不同的参数多次运行python函数

def runner(f): 
    def inner(*args): 
     for i in xrange(1000): 
      f(*args) 
    return inner 

但似乎调用像这样:runner(f)(random.randint(1,UPPER_BOUND))运行˚F1000次使用相同的参数。如何正确地做到这一点?

回答

7

您遇到的问题是在调用runner()返回的inner()函数时正在计算random.randint(1,UPPER_BOUND)一次。你需要的是延迟评估,直到晚点。

你可以尝试这样的事:

>>> def runner(f, callable): 
... def inner(): 
...  for i in xrange(1000): 
...  f(*callable()) 
... return inner 
... 
>>> runner(f, lambda: (random.randint(1, 1000),))() 
603 
385 
321 
etc. 

注意callable是每一个原始功能f被调用时调用。另请注意,callable必须返回序列类型,如元组或列表。

编辑:如果需要其他参数传递给f你可以像这样做:

>>> def runner(f, callable): 
... def inner(*args, **kwds): 
...  for i in xrange(1000): 
...  pos = list(callable()) 
...  pos.extend(args) 
...  f(*pos, **kwds) 
... return inner 
... 
>>> def f(a, b, c, d = 3): 
... print a, b, c, d 
... 
>>> runner(f, lambda: (random.randint(1,1000),))(3, 5, d = 7) 
771 3 5 7 
907 3 5 7 
265 3 5 7 
1

你需要你的random.randint计算迁入功能确定指标:

例如,这样的事情应该让你开始,该@是修饰语法,你可以在here如果读了你不熟悉它。无耻地窃取其他职位的招呼例如:

import random 

UPPER_BOUND = 1000 

def runner(fn): 
    def wrapped(): 
     for i in range(0,10): 
      stuff = random.randint(1,UPPER_BOUND) 
      print(str(stuff) + ': ' + fn()) 
    return wrapped 

@runner 
def hello(): 
    return 'hello world' 


if __name__=='__main__': 
    hello() 

编辑:又见here明白为什么你random.randint被执行一次(在定义时),这就是为什么你的功能得到了相同的说法,每次。

1

你必须把random.randit调用内循环:

def runner(function): 
    def inner(callable, args=()): 
     for i in xrange(1000): 
      function(callable(*args)) 
    return inner 

你可以打电话给跑步者:

runner(f)(random.randint, args=(1, UPPER_BOND)) 

在我看来,你试图去做什么,(并且不涉及丑陋的lambda)。

相关问题