2013-01-10 11 views
44

पायथन में, मैं एक फ़ंक्शन make_cylinder_volume(r) लिखना चाहता हूं जो एक और फ़ंक्शन देता है। उस लौटाए गए फ़ंक्शन को h पैरामीटर के साथ कॉल करने योग्य होना चाहिए, और ऊंचाई h और त्रिज्या r के साथ सिलेंडर की मात्रा वापस करनी चाहिए।मैं एक फ़ंक्शन कैसे लिखूं जो एक और फ़ंक्शन देता है?

मुझे पता है कि अजगर में कार्यों से मूल्यों वापस जाने के लिए है, लेकिन मैं कैसे एक और समारोह वापसी करते हैं?

+2

http://stackoverflow.com

इस तरह आप एक लैम्ब्डा अभिव्यक्ति का उपयोग कर स्वीकार जवाब लिख सकते हैं/प्रश्न/245192/क्या-प्रथम श्रेणी के ऑब्जेक्ट्स –

उत्तर

101

अजगर का उपयोग कर इस प्रयास करें,:

import math 
def make_cylinder_volume_func(r): 
    def volume(h): 
     return math.pi * r * r * h 
    return volume 

radius=10 और height=5 के साथ इस तरह यह प्रयोग करें, उदाहरण के लिए:

volume_radius_10 = make_cylinder_volume_func(10) 
volume_radius_10(5) 
=> 1570.7963267948967 

सूचना है कि एक समारोह लौटने एक नया कार्य को परिभाषित करने का एक सरल बात थी फ़ंक्शन के अंदर, और अंत में इसे वापस कर रहा है - प्रत्येक फ़ंक्शन के लिए उचित पैरामीटर को पारित करने के लिए सावधान रहना। एफवाईआई, किसी अन्य फ़ंक्शन से फ़ंक्शन लौटने की तकनीक currying के रूप में जानी जाती है।

+2

करी के संदर्भ जोड़ने के लिए धन्यवाद। मैं केवल यही चाहता हूं कि मैं दो बार ऊपर उठा सकूं। – HeatfanJohn

+1

तो आपके द्वारा पारित '10' कहीं भी संग्रहीत किया जाता है? कचरा इकट्ठा कब होता है? – sudo

+3

@sudo https://en.wikipedia.org/wiki/Closure_(computer_programming पर एक नज़र डालें) –

6

बस, बाहर बात करने के लिए आप pymonad

import pymonad 

@pymonad.curry 
def add(a, b): 
    return a + b 

add5 = add(5) 
add5(4) 
9 
4

साथ ऐसा कर सकते है कि lambdas, भी अनाम प्रक्रियाएं रूप में जाना जाता का उपयोग करना चाहते हैं तो आप बाहर सार एक ही पंक्ति को make_cylinder_volume_func अंदर volume समारोह कर सकते हैं। ऑस्कर लोपेज़ के उत्तर से अलग नहीं, लैम्ब्डा का उपयोग करने वाला समाधान अभी भी 'अधिक कार्यात्मक' है।

import math 
def make_cylinder_volume_fun(r): 
    return lambda h: math.pi * r * r * h 

और फिर जैसा कि आप चाहते किसी अन्य curried फ़ंक्शन को कॉल करें:

volume_radius_1 = make_cylinder_volume_fun(1) 
volume_radius_1(1) 
=> 3.141592653589793 
संबंधित मुद्दे