2012-01-16 85 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)。

相關問題