আমি কীভাবে এমন একটি ফাংশন লিখব যা অন্য ফাংশনটি ফেরত দেয়?


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

খেয়াল করুন যে কোনও ফাংশন ফিরিয়ে দেওয়া হল ফাংশনের অভ্যন্তরে একটি নতুন ফাংশন সংজ্ঞায়িত করা এবং শেষে ফিরে আসা - প্রতিটি ফাংশনের উপযুক্ত পরামিতিগুলি পাস করার বিষয়ে সতর্কতা অবলম্বন করা। এফওয়াইআই, অন্য ফাংশন থেকে কোনও ফাংশন ফেরত দেওয়ার কৌশলটি কারিঙ হিসাবে পরিচিত ।


4
আপনি যে 10পাস করেছেন তা কোথাও সঞ্চিত আছে? কখন তা আবর্জনা সংগ্রহ করা হয়?
sudo

4
@ সুডো en.wikedia.org/wiki/Closure_( কম্পিউটার_প্রগ্রামিং )
ডেভিড হার্নান্দেজ

19

বেনাম ফাংশন হিসাবে পরিচিত ল্যাম্বডাস ব্যবহার volumeকরে make_cylinder_volume_funcআপনি কোনও এক লাইনে ফাংশনটি বিমূর্ত করতে পারেন । অস্কার লোপেজের উত্তর থেকে কোনওভাবেই আলাদা নয়, ল্যাম্বডা ব্যবহারের সমাধানটি এখনও একটি অর্থে 'আরও কার্যকরী'।

এইভাবে আপনি ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে গৃহীত উত্তরটি লিখতে পারেন:

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:অপসারণ করা হয় তবে ফাংশনটি কি একই কাজ করবে?
স্কচুন

4
@ শচুন না এটি এই ক্ষেত্রে কাজ করবে না। এটি 'ভেরিয়েবল স্কোপিং' এবং ফাংশন কারিরিংয়ের ধারণাটি মূলত একটি আকর্ষণীয় বিষয় (যা মূলত ভেরিয়েবল স্কোপিংয়ের উপর নির্ভর করে)। এটি কাজ না করার কারণ (আমার উদাহরণস্বরূপ) হ'ল কারণ returnপ্রত্যাবর্তনের আগে ফলাফলটি মূল্যায়ন করার চেষ্টা করবে এবং এটি ভেরিয়েবলগুলির একগুচ্ছ কারণ, এটি কিছু ভাসমান মান ফিরে আসবে (কোনও ফাংশন ফেরানোর চেষ্টা করুন এবং এটি কার্যকর হবে)। lambdaনিখরচায় যে নীচের কোডটি মূল্যায়ন করা উচিত নয় এবং ভেরিয়েবল আর এর সুযোগটি যে ফাংশনগুলি দিয়ে ফিরে আসবে তা সংরক্ষণ করা হবে make_cylinder..
ডেভআইডিতো

10

কেবল এটি নির্দেশ করতে চাই যে আপনি পাইমনড দিয়ে এটি করতে পারেন

 import pymonad 

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

 add5 = add(5)
 add5(4)
 9

4
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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.