2012-12-08 17 views
27

Sadece Python'u öğrenmeye başladım ve bir işlevi başka bir işlevin parametresi olarak iletebileceğimi öğrendim. Şimdi foo(bar())'u ararsam, bir işlev gösterici olarak değil, kullanılan işlevin dönüş değeri olarak geçmez. foo(bar) çağrıldığında işlev geçecektir, ancak bu şekilde herhangi bir ek argüman iletemiyorum. bar(42)'u çağıran bir işlev işaretçisini geçmek istersem ne olur?Python, bir işlev işaretçisi parametresine bir argüman nasıl iletilir?

Üzerine geçirdiğim bağımsız değişkenlere bakılmaksızın bir işlevi tekrar etme yeteneğini istiyorum. Fonksiyon foo("test") gerekiyordu Bu durumda

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

def foo(s): 
     print s 

repeat(foo("test"), 4) 

üst üste 4 kez çağrılacak. foo yerine repeat'a "sınama" geçmek zorunda kalmadan bunu gerçekleştirmenin bir yolu var mı?

+4

Sidenote: Bunlar "f" değildir. açık artırma işaretçileri "! Python işlevlerinde nesnelerdir. –

cevap

42

kullanabilirsiniz ya bir lambda:

repeat(lambda: bar(42)) 

Veya functools.partial:

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

Veya ayrı ayrı değişkenler geçirebilirsiniz:

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

Bu son tarzı standardında oldukça yaygındır kütüphane ve büyük Python araçları. Eğer ben rahatlık için ön tekrar sayısını koymak

repeat(4, foo, "test") 

veya

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

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

Not olarak bu işlevi kullanabilirsiniz böylece *args, bağımsız değişken bir sayısını gösterir. *args yapısını kullanmak istiyorsanız son bağımsız değişken olamaz.

(tamlığı için, **kwargs ile de anahtar kelime argümanları ekleyebilir.)

14

Sen tekrar işlevine, foo için parametreleri geçmesi gerekecektir: cevapların birçoğu iken

#! /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

Harika cevap. Daha fazla oy almalıyız! :) –

1

işte bu yararlı olabilir, çünkü gereksiz bir tekrarlama yapmaz ve ilk etapta geri aramaların sebebi çoğu zaman ana kullanıcı arayüzü dışındaki diğer çalışmalarla senkronize olur.

def callMethodWithParamsAfterDelay (diş

alma süresi, usul = Yok, parametreler = [], saniye = 0.0):

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

def cancelDelayedCall (zamanlayıcı):

timer.cancel() 

Örnek

def fan (a, b):

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

callMethodWithParametersAfterDelay (foo [ 'güller ',' kırmızı '], 0)

İlgili konular