繁体   English   中英

使用不同的参数多次运行python函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM