嗨我需要一个函数来接受一个函数并返回一个运行该参数函数的函数,例如。 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次。如何正确地做到这一点?
答案 0 :(得分:7)
您遇到的问题是random.randint(1,UPPER_BOUND)
在inner()
返回的runner()
函数被调用时被评估一次。您需要的是将评估推迟到以后。
您可以尝试这样的事情:
>>> 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 :(得分: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只执行一次(在定义时),这就是每次函数获取相同参数的原因。
答案 2 :(得分: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))
在我看来,你想要做的事情(并且不涉及丑陋的lambdas)。