2012-12-08 239 views
27

我只是剛開始學習Python,發現我可以傳遞一個函數作爲另一個函數的參數。現在,如果我調用foo(bar())它不會作爲函數指針傳遞,而是作爲使用函數的返回值傳遞。調用foo(bar)將傳遞該函數,但這種方式我無法傳遞任何其他參數。如果我想傳遞一個調用bar(42)的函數指針呢?Python,如何將參數傳遞給函數指針參數?

我希望能夠重複一個函數,而不管我傳遞給它什麼參數。

def repeat(function, times): 
    for calls in range(times): 
     function() 

def foo(s): 
     print s 

repeat(foo("test"), 4) 

在這種情況下,函數foo("test")應該連續調用4次。 有沒有辦法做到這一點,而不必通過「測試」到repeat而不是foo

+4

旁註:這些不是「f聯合指針「!在Python中,函數是對象。 –

回答

42

您可以使用一個lambda

repeat(lambda: bar(42)) 

或者functools.partial

from functools import partial 
repeat(partial(bar, 42)) 

或單獨傳遞參數:

def repeat(times, f, *args): 
    for _ in range(times): 
     f(*args) 

這最後的風格是在標準相當普遍庫和主要的Python工具。 *args表示可變數量的參數,所以你可以使用這個功能

repeat(4, foo, "test") 

def inquisition(weapon1, weapon2, weapon3): 
    print("Our weapons are {}, {} and {}".format(weapon1, weapon2, weapon3)) 

repeat(10, inquisition, "surprise", "fear", "ruthless efficiency") 

注意,我把重複的次數達陣爲了方便。如果您想使用*args結構,它不能是最後一個參數。

(爲了完整起見,你可以用**kwargs添加關鍵字參數也是如此。)

14

你需要傳遞的參數foo的,到復讀功能:

#! /usr/bin/python3.2 

def repeat (function, params, times): 
    for calls in range (times): 
     function (*params) 

def foo (a, b): 
    print ('{} are {}'.format (a, b)) 

repeat (foo, ['roses', 'red'], 4) 
repeat (foo, ['violets', 'blue'], 4) 
+0

很棒的回答。應該多投票! :) –

1

雖然許多問題的答案這裏很好,這可能是有幫助的,因爲它不會引入任何不必要的重複,首先回調的原因通常是與主UI線程之外的其他工作同步。

享受!

導入時間,穿線

DEF callMethodWithParamsAfterDelay(方法=無,則params = [],秒= 0。0):

return threading.Timer(seconds, method, params).start() 

DEF cancelDelayedCall(定時器):

timer.cancel() 

DEF FOO(A,B):

print ('{} are {}'.format (a, b)) 

callMethodWithParametersAfterDelay(FOO,['玫瑰','red'],0)