2013-01-10 34 views
44

W Pythonie, chciałbym napisać funkcję make_cylinder_volume(r), która zwraca inną funkcję. Zwróconą funkcję należy wywołać parametrem h i zwrócić objętość cylindra o wysokości h i promieniu r.Jak napisać funkcję, która zwraca inną funkcję?

wiem jak powrócić wartości z funkcji w Pythonie, ale jak wrócę inna funkcja?

+2

http://stackoverflow.com/questions/245192/what-is-first-class-objects –

Odpowiedz

101

Spróbuj tego, używając Python:

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

Używaj go tak, na przykład z radius=10 i height=5:

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

Zauważ, że powrót funkcji była prosta sprawa zdefiniowania nowej funkcji wewnątrz funkcji i zwrócenie jej na końcu - zwracając uwagę na odpowiednie parametry dla każdej funkcji. FYI, technika zwracania funkcji z innej funkcji jest znana jako currying.

+2

Dziękujemy za dodanie odniesienia do curry. Żałuję tylko, że nie mogłem dwukrotnie głosować. – HeatfanJohn

+1

Więc '10', które zdałeś, jest gdzieś przechowywane? Kiedy zbiera śmieci? – sudo

+3

@udo zajrzyj na https://en.wikipedia.org/wiki/Closure_(computer_programming) –

6

prostu chcę podkreślić, że można to zrobić z pymonad

import pymonad 

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

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

Korzystanie lambdy, znane również jako funkcje anonimowe, można abstrakcyjne poza funkcją volume wewnątrz make_cylinder_volume_func do jednej linii. W niczym nie różniąc się od odpowiedzi Óscar López, rozwiązanie wykorzystujące lambdę jest w pewnym sensie "bardziej funkcjonalne".

ten sposób można napisać zaakceptowane odpowiedź za pomocą wyrażenia lambda:

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

a następnie wywołać jak ci, że jakikolwiek inny curry funkcję:

volume_radius_1 = make_cylinder_volume_fun(1) 
volume_radius_1(1) 
=> 3.141592653589793 
Powiązane problemy