在Python中,我想寫一個函數make_cylinder_volume(r)
,它返回另一個函數。返回的函數應該可用參數h
調用,並返回高度爲h
和半徑r
的圓柱體積。如何編寫一個返回另一個函數的函數?
我知道如何從函數在Python返回值,但我怎麼回另一個函數?
在Python中,我想寫一個函數make_cylinder_volume(r)
,它返回另一個函數。返回的函數應該可用參數h
調用,並返回高度爲h
和半徑r
的圓柱體積。如何編寫一個返回另一個函數的函數?
我知道如何從函數在Python返回值,但我怎麼回另一個函數?
試試這個,用Python:
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
注意,返回一個功能是定義新功能的一個簡單的事情在函數內部,並在最後返回 - 謹慎地爲每個函數傳遞適當的參數。僅供參考,從另一個函數返回函數的技術稱爲currying。
謝謝您添加對currying的引用。我只希望我能兩次上癮。 – HeatfanJohn
所以你傳入的'10'存儲在某個地方?它什麼時候被垃圾收集? – sudo
@sudo查看https://en.wikipedia.org/wiki/Closure_(computer_programming) –
只是想指出的是,你可以用pymonad
import pymonad
@pymonad.curry
def add(a, b):
return a + b
add5 = add(5)
add5(4)
9
做到這一點使用lambda表達式,也被稱爲匿名函數,你可以抽象出volume
功能make_cylinder_volume_func
裏面一行。與ÓscarLópez的答案沒有任何區別,使用lambda的解決方案仍然在某種意義上「更實用」。
這是如何使用lambda表達式寫公認的答案:
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
http://stackoverflow.com/questions/245192/what-are-first-class-objects –