जवाबों:
क्या आपका यह मतलब है?
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
perform
और अगर action1
, action2
विभिन्न फाइलों पर? @ एस.लॉट
यह वही है जो लंबोदर के लिए है:
def Perform(f):
f()
Perform(lambda: Action1())
Perform(lambda: Action2(p))
Perform(lambda: Action3(p, r))
आप ऐसे ही फंक्शंस से आंशिक फ़ंक्शन का उपयोग कर सकते हैं।
from functools import partial
def perform(f):
f()
perform(Action1)
perform(partial(Action2, p))
perform(partial(Action3, p, r))
कीवर्ड के साथ भी काम करता है
perform(partial(Action4, param1=p))
functools.partial
और भी बहुमुखी है अगर perform
आगे के मापदंडों को सौंपने की जरूरत है f
। जैसे, कोई बुला सकता है perform(partial(Action3, p))
और perform(f)
कुछ कर सकता है f("this is parameter r")
।
का प्रयोग करें और inc Perform एक बेकार फंक्शन है, आप सीधे फंक्शन्स में पास हो सकते हैं।
for func in [Action1, partial(Action2, p), partial(Action3, p, r)]:
func()
(महीने बाद) एक छोटा सा वास्तविक उदाहरण जहां लंबोदर उपयोगी है, आंशिक नहीं:
कहते हैं कि आप 2 आयामी फ़ंक्शन के माध्यम से विभिन्न 1-आयामी क्रॉस-सेक्शन चाहते हैं, जैसे पहाड़ियों की एक पंक्ति के माध्यम से स्लाइस।
quadf( x, f )
1-डी लेता है f
और विभिन्न के लिए कहता है x
।
इसे वर्टिकल कट्स के लिए y = -1 0 1 पर और क्षैतिज कट्स को x = -1 0 1 पर कॉल करें।
fx1 = quadf( x, lambda x: f( x, 1 ))
fx0 = quadf( x, lambda x: f( x, 0 ))
fx_1 = quadf( x, lambda x: f( x, -1 ))
fxy = parabola( y, fx_1, fx0, fx1 )
f_1y = quadf( y, lambda y: f( -1, y ))
f0y = quadf( y, lambda y: f( 0, y ))
f1y = quadf( y, lambda y: f( 1, y ))
fyx = parabola( x, f_1y, f0y, f1y )
जहाँ तक मुझे पता है, partial
ऐसा नहीं कर सकते -
quadf( y, partial( f, x=1 ))
TypeError: f() got multiple values for keyword argument 'x'
(इसमें टैग्स को संख्यात्मक, आंशिक, लंबोदर कैसे जोड़ा जाए?)
इसे आंशिक कार्य कहा जाता है और इसे करने के कम से कम 3 तरीके हैं। मेरा पसंदीदा तरीका लैम्ब्डा का उपयोग करना है क्योंकि यह अतिरिक्त पैकेज पर निर्भरता से बचता है और सबसे कम क्रिया है। मान लें कि आपके पास एक फ़ंक्शन है add(x, y)
और आप add(3, y)
किसी अन्य फ़ंक्शन को पैरामीटर के रूप में पास करना चाहते हैं जैसे कि अन्य फ़ंक्शन के लिए मान तय करता है y
।
लैम्ब्डा का उपयोग करें
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = lambda y: add(3, y)
result = runOp(f, 1) # is 4
अपनी खुद की आवरण बनाएँ
यहां आपको एक फ़ंक्शन बनाने की ज़रूरत है जो आंशिक फ़ंक्शन देता है। यह स्पष्ट रूप से बहुत अधिक क्रिया है।
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# declare partial function
def addPartial(x):
def _wrapper(y):
return add(x, y)
return _wrapper
# run example
def main():
f = addPartial(3)
result = runOp(f, 1) # is 4
फंक्शंस से आंशिक का उपयोग करें
यह lambda
ऊपर दिखाए गए लगभग समान है । फिर हमें इसकी आवश्यकता क्यों है? इसके कुछ कारण हैं । संक्षेप में, partial
कुछ मामलों में थोड़ा तेज हो सकता है (इसका कार्यान्वयन देखें ) और यह कि आप इसका उपयोग शुरुआती बाध्यकारी बनाम लंबोदर के देर से बाध्यकारी के लिए कर सकते हैं।
from functools import partial
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = partial(add, 3)
result = runOp(f, 1) # is 4
इसे बंद करने का एक तरीका है:
def generate_add_mult_func(func):
def function_generator(x):
return reduce(func,range(1,x))
return function_generator
def add(x,y):
return x+y
def mult(x,y):
return x*y
adding=generate_add_mult_func(add)
multiplying=generate_add_mult_func(mult)
print adding(10)
print multiplying(10)
def action1(arg1, arg2=None, arg3=None)
, आप कैसे एक तर्क है कि आप, arg3 को सौंपा जा करने के लिए उदाहरण के लिए इरादा पारित कर सकता है?