문제

루비의 다음 코드와 동등한 파이썬은 무엇입니까?

def loop
  cont=nil
  for i in 1..4
    puts i
    callcc {|continuation| cont=continuation} if i==2
  end
  return cont
end

> c=loop
1
2
3
4
> c.call
3
4

참조: 가벼운 개발 성공의 비밀, 파트 9 : 연속 기반 프레임 워크

도움이 되었습니까?

해결책

당신이 인용 한 기사에는 링크가 포함되어 있습니다 연속은 간단하고 설명되었습니다 파이썬 언어의 연속에 대해 이야기하는 리소스 섹션에서.

다른 팁

살펴보십시오 생산하다 발전기를 만들기위한 진술.

나는 루비를 말하지 않지만 당신이 이것을 찾고있는 것 같습니다.

def loop():
    for i in xrange(1,5):
        print i
        if i == 2:
            yield


for i in loop():
    print "pass"

편집 : 나는 이것이 기본적으로 실제 연속의 전문화라는 것을 알고 있지만 대부분의 목적으로 충분해야합니다. 사용 yield 연속과 반환 .next() 생성기의 메시지 (호출만으로 반환 loop()) 리엔터에.

사용 generator_tools (설치하기 위해서: '$ easy_install generator_tools'):

from generator_tools import copy_generator

def _callg(generator, generator_copy=None):
    for _ in generator: # run to the end
        pass
    if generator_copy is not None:
        return lambda: _callg(copy_generator(generator_copy))

def loop(c):
    c.next() # advance to yield's expression
    return _callg(c, copy_generator(c))

if __name__ == '__main__':
    def loop_gen():
        i = 1
        while i <= 4:
            print i
            if i == 2:
                yield
            i += 1

    c = loop(loop_gen())
    print("c:", c)
    for _ in range(2):
        print("c():", c())

산출:

1
2
3
4
('c:', <function <lambda> at 0x00A9AC70>)
3
4
('c():', None)
3
4
('c():', None)

특별한 경우에 작동하는 약한 해결 방법이 많이 있지만 (이 질문에 대한 다른 답변 참조), Python Language Construct는 없습니다. callcc 또는 동등한 것을 구축하는 데 사용할 수 있습니다. callcc.

당신은 시도하고 싶을 수도 있습니다 스택이없는 파이썬 아니면 그 그린 렛 하나의 샷 연속을 구축 할 수있는 코 루틴을 제공하는 파이썬 확장은 루비의 것보다 여전히 약합니다. callcc (완전한 연속을 제공하는).

def loop():    
    def f(i, cont=[None]):        
        for i in range(i, 5):
            print i
            if i == 2:
                cont[0] = lambda i=i+1: f(i)
        return cont[0]
    return f(1)

if __name__ == '__main__':
    c = loop()
    c()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top