2013-01-10 45 views
44

Trong Python, tôi muốn viết hàm make_cylinder_volume(r) trả về một hàm khác. Hàm trả về đó phải được gọi với tham số h và trả về thể tích của một hình trụ có chiều cao h và bán kính r.Làm cách nào để viết một hàm trả về một hàm khác?

Tôi biết cách trả lại giá trị từ các hàm bằng Python, nhưng làm cách nào để trả lại một hàm khác?

+2

http://stackoverflow.com/questions/245192/những gì-là-first-class-đối tượng –

Trả lời

101

Hãy thử điều này, sử dụng Python:

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

Sử dụng nó như thế này, ví dụ với radius=10height=5:

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

Chú ý rằng việc trả lại một chức năng là một vấn đề đơn giản của định nghĩa một hàm mới bên trong hàm, và trả về nó ở cuối - cẩn thận để truyền các tham số thích hợp cho mỗi hàm. FYI, kỹ thuật trả về một hàm từ một hàm khác được gọi là currying.

+2

Cảm ơn bạn đã thêm tham chiếu đến currying. Tôi chỉ ước rằng tôi có thể upvote hai lần. – HeatfanJohn

+1

Vì vậy, các '10' bạn thông qua được lưu trữ ở đâu đó? Khi nào thu gom rác? – sudo

+3

@sudo hãy xem https://en.wikipedia.org/wiki/Closure_(computer_programming) –

6

Chỉ muốn chỉ ra rằng bạn có thể làm điều này với pymonad

import pymonad 

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

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

Sử dụng lambdas, hay còn gọi là chức năng ẩn danh, bạn có thể trừu tượng ra volume chức năng bên trong make_cylinder_volume_func đến một dòng đơn. Không có cách nào khác với câu trả lời của Óscar López, giải pháp sử dụng lambda vẫn có ý nghĩa 'chức năng hơn'.

Đây là cách bạn có thể viết câu trả lời chấp nhận sử dụng một biểu thức lambda:

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

Và sau đó gọi như bạn muốn bất kỳ chức năng cà ri khác:

volume_radius_1 = make_cylinder_volume_fun(1) 
volume_radius_1(1) 
=> 3.141592653589793 
Các vấn đề liên quan