이것은 알고리즘 질문입니다. 같은 인수를 반복적으로받을 수있는 고차 함수를 갖고 싶습니다 func(3, 5)(4, 9)(1, 2)(...)
. 내가 필요한 것은 함수 (내부 함수)를 반환하는 함수를 정의하는 것뿐이라는 것을 알고 있습니다. 아마도 이와 같이 (올바른 코드인지 확실하지 않습니다)
def func(a, b = 0):
def inner_func(c, d):
nonlocal b
b += c + d
print(b)
...
return inner_func
return inner_func(a, b)
따라서 우리가 실행할 때 :
test0 = func(1, 2)
test1 = test0(2, 3)
최소한 출력을 얻어야합니다.
5
10
하지만 실행하면 :
test0 = func(1, 2)
test1 = test0(2, 3)
test_add = test0(2, 3)
출력은 다음과 같습니다.
5
10
15
그러나 test_add = test0(2, 3)
반환되는 것과 정확히 같은 것을 반환 하고 싶습니다 test1 = test0(2, 3)
.
Expected outputs:
5
10
10
나는 현재 함수를 만들 수있는 방법을 찾아야 test0(2, 3)
만 이전 기능의 입력에 스틱을 func(1, 2)
하고, 1
과 2
. 더 많은 예 :
test0 = func(1, 2)
test1 = test0(2, 3)
Expected outputs:
5
10
test_add = test0(3, 5)
Expected outputs: 13
But got: 18
그렇다면이 목적을 위해 코드를 어떻게 수정해야합니까?
출력을 연결하려면 결과가 호출 가능해야합니다. 그러나 호출을 반복 가능하게하려면 결과도 내부 상태를 저장해야합니다.
이 시점에서 함수를 결과 유형으로 사용하는 것은 잘못된 선택입니다. 기능과 내부 상태를 결합하는 것이 클래스 의 의미입니다.
상태를 저장하는 빠른 도우미 클래스를 작성하십시오.
class func_result:
def __init__(self, prev):
self.prev = prev
def __call__(self, a, b):
val = a+b+self.prev
print(val)
return func_result(val)
def func(a, b):
return func_result(b)(a,b)
test0 = func(1, 2)
test1 = test0(2, 3)
test_add1 = test1(2, 3)
test_add2 = test0(2, 3)
test_add3 = test0(3, 5)
5
10
15
10
13
func_result
클래스가 이제 노출 된다는 사실이 마음에 들지 않으면 함수에 중첩 할 수 있습니다.
def func(a, b):
class func_result:
def __init__(self, prev):
self.prev = prev
def __call__(self, a, b):
val = a+b+self.prev
print(val)
return func_result(val)
return func_result(b)(a,b)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다