2012-12-08 15 views
27

मैंने केवल पाइथन सीखना शुरू कर दिया और पाया कि मैं एक फ़ंक्शन को किसी अन्य फ़ंक्शन के पैरामीटर के रूप में पास कर सकता हूं। अब अगर मैं foo(bar()) पर कॉल करता हूं तो यह फ़ंक्शन पॉइंटर के रूप में पास नहीं होगा लेकिन प्रयुक्त फ़ंक्शन का रिटर्न वैल्यू होगा। कॉलिंग foo(bar) फ़ंक्शन को पास कर देगी, लेकिन इस तरह से मैं कोई अतिरिक्त तर्क पास नहीं कर पा रहा हूं। क्या होगा यदि मैं एक फ़ंक्शन पॉइंटर पास करना चाहता हूं जो bar(42) पर कॉल करता है?पायथन, फ़ंक्शन पॉइंटर पैरामीटर के लिए तर्क कैसे पास करें?

मैं किसी भी समारोह को दोहराने की क्षमता चाहता हूं चाहे मैं इसके द्वारा किए गए तर्कों के बावजूद।

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

def foo(s): 
     print s 

repeat(foo("test"), 4) 

इस मामले में समारोह foo("test") माना जाता है एक पंक्ति में 4 बार कहा जाता है। foo के बजाय repeat पर "परीक्षण" पास किए बिना इसे पूरा करने का कोई तरीका है?

+4

सिडेनोट: ये "एफ नहीं हैं" अंकन पॉइंटर्स "! पायथन कार्यों में वस्तुओं हैं। –

उत्तर

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) 

इस अंतिम शैली मानक में बहुत आम है पुस्तकालय और प्रमुख पायथन उपकरण। *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") 

ध्यान दें कि मैं सुविधा के लिए सामने repetitions की संख्या में डाला इस सुविधा का उपयोग कर सकते हैं। यदि आप *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 थ्रेड के बाहर अन्य काम के साथ सिंक्रनाइज़ करना होता है।

आनंद लें!

आयात समय, सूत्रण

डीईएफ़ callMethodWithParamsAfterDelay (विधि = कोई नहीं, परम = [], सेकंड = 0।0):

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

डीईएफ़ cancelDelayedCall (घड़ी):

timer.cancel() 

उदाहरण

डीईएफ़ foo (ए, बी):

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

callMethodWithParametersAfterDelay (foo, [ 'गुलाब ',' लाल '], 0)

संबंधित मुद्दे