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


94

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

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


답변:


192

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이라고 합니다.


1
그래서 10당신이 전달한 건 어딘가에 보관되어 있습니까? 언제 쓰레기를 수거합니까?
sudo


19

익명 함수라고도하는 람다를 사용하면 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

나는 당신이 요청한 것에 대답하고 있다는 것을 알고 있지만 내 이해를 위해 lambda h:제거되면 기능이 동일하게 작동합니까?
schoon

2
@schoon 아니요이 경우에는 작동하지 않습니다. 이것은 실제로 '변수 범위 지정'과 함수 커링 (기본적으로 varibale 범위 지정에 의존)의 아이디어를 강조하는 매우 흥미로운 사례입니다. 그것이 작동하지 않는 이유는 (내 예에서) return반환하기 전에 결과를 평가하려고 시도하고 변수가 많기 때문에 일부 부동 값을 반환하기 때문입니다 (함수를 반환하면 작동합니다). lambda다음 코드를 평가해서는 안되며 변수 r의 범위가 make_cylinder...
DaveIdito

10

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

 import pymonad 

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

 add5 = add(5)
 add5(4)
 9

1
from functools import partial add5 = partial(add, 5)정확히 동일 함
R3ctor

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.