[python] 다른 함수를 반환하는 함수를 어떻게 작성합니까?

파이썬에서는 make_cylinder_volume(r)다른 함수를 반환 하는 함수를 작성하고 싶습니다 . 반환 된 함수는 매개 변수를 사용하여 호출 할 수 있어야하며 h높이 h와 반경 이있는 실린더의 볼륨을 반환 해야합니다 r.

파이썬의 함수에서 을 반환하는 방법을 알고 있지만 다른 함수를 어떻게 반환 합니까?



답변

Python을 사용하여 이것을 시도하십시오.

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

예를 들어 radius=10height=5다음 과 같이 사용하십시오 .

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

함수를 반환하는 것은 함수 내부에 새 함수를 정의하고 마지막에 반환하는 간단한 문제입니다. 각 함수에 대해 적절한 매개 변수를 전달하는 데주의해야합니다. 참고로 다른 함수에서 함수를 반환하는 기술을 currying이라고 합니다.


답변

익명 함수라고도하는 람다를 사용하면 volume내부 함수 make_cylinder_volume_func를 한 줄로 추상화 할 수 있습니다 . Óscar López의 답변과 다르지 않지만 람다를 사용하는 솔루션은 여전히 ​​’더 기능적’입니다.

다음은 람다 식을 사용하여 허용 된 답변을 작성하는 방법입니다.

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


답변

pymonad로 이것을 할 수 있다는 것을 지적하고 싶습니다

 import pymonad

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

 add5 = add(5)
 add5(4)
 9


답변

파티에 너무 늦었다는 건 알고 있지만이 솔루션이 흥미로울 것 같습니다.

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 입니다.


답변