簡體   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