이 시나리오에서는 이해가 불가능하지만 생성자를 만들 수 있습니다. 그로 가기 전에, 당신이 그들이 마지막 (행동) 인수가 falsy 때마다 falsy 뭔가를 (같은 False
또는 None
) 반환하는 방식으로 귀하의 최고의 및 단계를 함수를 정의하는 것도 제안한다. 코드를 단순화합니다.
그럼 당신이 발전기를 정의 할 수 있습니다
def unfold(s):
while s:
yield s
s = step(s, best(action_space(s)))
이 지연되는 장점이 있습니다. 이처럼 사용할 수 있습니다
e = [s for s in unfold(State())]
또는 단지를 :
e = list(unfold(State()))
더 함수형 프로그래밍 접근 방식이 재귀 함수가 될 수있다 : 당신이 이름의 필요를 발견하면
def unfold(s):
return [s] + unfold(step(s, best(action_space(s)))) if s else []
e = unfold(State())
기능 성가신, 그럼 당신은이 트릭을 갈 수 :
e = (lambda unfold:lambda s:unfold(unfold,s))(
lambda unfold, s: [s] + unfold(unfold, step(s, best(action_space(s)))) if s else []
)(State())
이것은 매우 불분명합니다. 첫 번째 함수는 다른 함수를 인수 (두 번째 줄에있는 함수)와 함께 즉시 호출합니다. 실제 unfold 함수는 첫 번째 함수의 매개 변수 이름으로 이름을 가져옵니다.
그런 다음이 첫 번째 기능은 상태 인수를 받아 다른 함수 (lambda s:unfold(unfold,s)
)을 반환하고 그것으로을 전개 호출합니다. 또한이 함수를 즉시 호출하여 초기 값 State()
을 전달합니다.
펼치기 unfold 또한 범위 내에서 유지하기 위해 재귀 트리 아래로 전달된다는 점에 유의하십시오.
그리고 귀하의 질문은 무엇입니까? 이 혼란스런 사양을 감안할 때 나를 위해 codez을 작성 하시겠습니까? 어쨌든 당신이 원하는 것은 use ['functools.reduce'] (https://docs.python.org/3.5/library/functools.html#functools.reduce)입니다. 이것은 파이썬의 fold 연산입니다. – Bakuriu
@Bakuriu 실제로, 이것은 [unfold] (https://en.wikipedia.org/wiki/Anamorphism)입니다. – phg
@Bakuriu 찾는 방법이나 최소한 키워드를 묻습니다.나는 내가 찾고있는 해결책이 정확히'reduce'의 oposite라고 생각한다. 'reduce'가 2 요소를 취하고 하나를 반환하는 동안, 필요한 함수는 1 (마지막) 요소를 취하여 함수를 적용한 후 2를 반환합니다. 나는'확장 '이 그것의 이름 일 수 있다고 생각한다. – FPFTW