【问题标题】:Run python function multiple times with different arguments使用不同的参数多次运行 python 函数
【发布时间】:2012-02-11 02:03:31
【问题描述】:

您好,我需要一个函数来接收一个函数并返回一个运行该参数函数的函数,例如。 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 次。如何正确操作?

【问题讨论】:

    标签: python


    【解决方案1】:

    您遇到的问题是 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.
    

    请注意,每次调用原始函数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
    

    【讨论】:

      【解决方案2】:

      您需要将 random.randint 的计算移到函数定义中:

      例如,类似这样的内容应该可以帮助您入门,@ 是装饰器语法,如果您不熟悉它,可以在 here 上阅读。无耻地从其他帖子中窃取 hello 示例:

      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 只执行一次(在定义时),这就是为什么您的函数每次都获得相同的参数。

      【讨论】:

        【解决方案3】:

        您必须将 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)。

        【讨论】:

          猜你喜欢
          • 2021-06-12
          • 1970-01-01
          • 1970-01-01
          • 2021-11-20
          • 2021-05-08
          • 2013-11-29
          • 1970-01-01
          • 1970-01-01
          • 2015-06-29
          相关资源
          最近更新 更多