В Python я хотел бы написать функцию, make_cylinder_volume(r)
которая возвращает другую функцию. Эта возвращенная функция должна быть вызвана с параметром h
и возвращать объем цилиндра с высотой h
и радиусом r
.
Я знаю, как возвращать значения из функций в Python, но как мне вернуть другую функцию ?
python
function
functional-programming
currying
Джулиан Дас
источник
источник
Ответы:
Попробуйте это, используя 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
Обратите внимание, что для возврата функции было достаточно просто определить новую функцию внутри функции и вернуть ее в конце - при этом нужно было внимательно передать соответствующие параметры для каждой функции. К вашему сведению, метод возврата функции из другой функции известен как каррирование .
источник
10
, переданный вами код где-то хранится? Когда он собирается сборщиком мусора?Используя лямбды, также известные как анонимные функции, вы можете абстрагировать
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:
удаления функция будет работать так же?return
он попытается оценить результат перед возвратом, и поскольку это набор переменных, он вернет некоторое значение с плавающей запятой (попробуйте вернуть функцию, и она будет работать).lambda
сообщает, что следующий код не должен оцениваться, а также что область видимости переменной r будет сохранена в функциях, возвращаемых функциейmake_cylinder..
.Просто хочу отметить, что вы можете сделать это с помощью pymonad
import pymonad @pymonad.curry def add(a, b): return a + b add5 = add(5) add5(4) 9
источник
from functools import partial add5 = partial(add, 5)
Точно так жеЯ знаю, что опаздываю на вечеринку, но думаю, это решение может вас заинтересовать.
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
работает.источник