![](/img/trans.png)
[英]Run a function multiple times with different arguments for each run
[英]Run python function multiple times with different arguments
嗨我需要一個函數,它將獲取一個函數並返回一個將運行該參數函數的函數,例如。 1000次,每次評估它的論點。 我有這樣的事情:
def runner(f):
def inner(*args):
for i in xrange(1000):
f(*args)
return inner
但似乎這樣的調用: runner(f)(random.randint(1,UPPER_BOUND))
使用相同的參數運行f 1000次。 怎么做正確?
您遇到的問題是random.randint(1,UPPER_BOUND)
在調用runner()
返回的inner()
函數時被評估一次。 您需要的是將評估推遲到以后。
你可以嘗試這樣的事情:
>>> 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
。 另請注意, 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
您需要將random.randint的計算移動到函數定義中:
例如,像這樣的東西應該讓你開始, @
是裝飾器語法,如果你不熟悉它,你可以在這里閱讀。 從另一篇文章中無恥地竊取你好的例子:
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()
編輯:另請參閱此處以了解為什么random.randint僅執行一次(在定義時),這就是為什么您的函數每次都獲得相同的參數。
你必須將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))
這在我看來你想要做什么,(並且不涉及丑陋的lambdas)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.