मैं एक फ़ंक्शन कैसे लिखता हूं जो किसी अन्य फ़ंक्शन को वापस करता है?


93

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

मुझे पता है कि पायथन में कार्यों से मूल्यों को कैसे लौटाया जाए , लेकिन मैं किसी अन्य फ़ंक्शन को कैसे लौटाऊं ?


जवाबों:


191

पायथन का उपयोग करके यह कोशिश करें:

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

ध्यान दें कि किसी फ़ंक्शन को वापस करना फ़ंक्शन के अंदर एक नए फ़ंक्शन को परिभाषित करने का एक सरल मामला था, और इसे अंत में वापस करना - प्रत्येक फ़ंक्शन के लिए उपयुक्त मापदंडों को पारित करने के लिए सावधान रहना। FYI करें, एक फ़ंक्शन को किसी अन्य फ़ंक्शन से वापस करने की तकनीक को करी के रूप में जाना जाता है ।


1
तो 10आपने जो पास किया है, वह कहीं जमा है? यह कचरा-एकत्रित कब होता है?
सूडो


19

लैंबडास का उपयोग, जिसे गुमनाम कार्यों के रूप में भी जाना जाता है, आप एक लाइन के volumeअंदर फ़ंक्शन को सार कर सकते हैं make_cylinder_volume_func। किसी भी तरह से Lscar लोपेज़ के जवाब से अलग नहीं है, लैंबडा का उपयोग करने वाला समाधान अभी भी 'अधिक कार्यात्मक' है।

यह है कि आप एक लंबोदर अभिव्यक्ति का उपयोग करके स्वीकृत उत्तर कैसे लिख सकते हैं:

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

और फिर कॉल करें जैसे कि आप किसी अन्य करी समारोह में हैं:

volume_radius_1 = make_cylinder_volume_fun(1)
volume_radius_1(1) 
=> 3.141592653589793

मुझे लगता है कि आप उत्तर दे रहे हैं कि क्या अनुरोध किया गया था, लेकिन मेरी समझ के लिए, यदि lambda h:हटा दिया गया तो क्या फ़ंक्शन समान होगा?
स्कून

2
@schoon नहीं यह इस मामले में काम नहीं करेगा। यह वास्तव में 'वेरिएबल स्कूपिंग' और फंक्शन करी (जो मूल रूप से वैरिएबल स्कूपिंग पर निर्भर करता है) के विचार को उजागर करने के लिए एक बहुत ही दिलचस्प मामला है। इसका कारण यह काम नहीं करता है (मेरे उदाहरण में) क्योंकि returnवापसी से पहले परिणाम का मूल्यांकन करने की कोशिश करेंगे, और क्योंकि यह चर का एक गुच्छा है, यह कुछ फ्लोट मान लौटा देगा (एक फ़ंक्शन को वापस करने का प्रयास करें और यह काम करेगा)। lambdaबताता है कि निम्न कोड का मूल्यांकन नहीं किया जाना चाहिए और यह भी कि चर आर के दायरे को उसके द्वारा दिए गए कार्यों में संरक्षित किया जाएगा make_cylinder..
डेविडिटो

10

बस यह इंगित करना चाहते हैं कि आप इसे pymonad के साथ कर सकते हैं

 import pymonad 

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

 add5 = add(5)
 add5(4)
 9

1
from functools import partial add5 = partial(add, 5)बिल्कुल वैसा ही करता है
R3ctor

1

मुझे पता है कि मुझे पार्टी में बहुत देर हो चुकी है, लेकिन मुझे लगता है कि आपको यह समाधान दिलचस्प लग सकता है।

from math import pi
from functools import partial

def cylinder_volume(r, h):
    return pi * r * r * h

make_cylinder_with_radius_2 = partial(cylinder_volume, 2)
make_cylinder_with_height_3 = partial(cylinder_volume, h=3)

print(cylinder_volume(2, 3))            # 37.6991118431
print(make_cylinder_with_radius_2(3))   # 37.6991118431
print(make_cylinder_with_height_3(2))   # 37.6991118431

यहाँ कैसे काम करता है के बारे में प्रलेखन हैpartial

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.