2013-01-10 31 views
44

Python'da, başka bir işlev döndüren bir işlev make_cylinder_volume(r) yazmak istiyorum. Bu döndürülen işlev, h parametresi ile kalender edilebilir ve h yüksekliğine ve r yarıçapına sahip bir silindirin hacmini döndürmelidir.Başka bir işlevi döndüren bir işlevi nasıl yazarım?

Python içinde işlevlerden değerleri dönmek nasıl biliyorum ama nasıl başka fonksiyon iade edilir?

+2

http://stackoverflow.com: şimdi etsen başka Körili fonksiyonu olarak diyoruz sonra

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

Ve:

Bu

Eğer lambda ifadesi kullanarak kabul cevabı yazabilirsiniz nasıl/sorular/245192/birinci sınıf nesneler nelerdir –

cevap

101

Python kullanarak, bu deneyin:

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

radius=10 ve height=5 ile örneğin, bu gibi kullanın:

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

bir işlev dönen yeni bir fonksiyon tanımlama basit bir mesele oldu Bildirimi o Fonksiyonun içinde ve sonunda geri döndürmek - her fonksiyon için uygun parametreleri geçmek için dikkatli olmak. FYI, başka bir fonksiyondan bir fonksiyon döndürme tekniği currying olarak bilinir.

+2

Körük için referans eklediğiniz için teşekkür ederiz. Sadece iki kere üstesinden gelebilseydim. – HeatfanJohn

+1

Bu yüzden geçtiğiniz '10' bir yerde saklanıyor? Ne zaman çöp toplanır? – sudo

+3

@sudo https://en.wikipedia.org/wiki/Closure_(computer_programming sayfasına bakınız. –

6

Sadece tek bir satıra make_cylinder_volume_funcvolume fonksiyonu dışında soyut can, ayrıca anonim fonksiyonları olarak bilinen lambdas, kullanma pymonad

import pymonad 

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

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

ile yapabilirsiniz işaret etmek istiyorum. Lópezscar López'in cevabından hiçbir şekilde farklı olarak, lambda kullanan çözüm hala 'daha işlevsel' bir anlamdadır.

volume_radius_1 = make_cylinder_volume_fun(1) 
volume_radius_1(1) 
=> 3.141592653589793 
İlgili konular