2014-12-23 4 views
2

제가 작성한이 파이썬 스 니펫은 내 이해가 주어진대로 예상대로 동작하지 않습니다. yield. 아마도 누군가가 나를 계몽 할 수있을 것입니다.파이썬 다음으로 동일한 생성기로 보내십시오.

def printvar(): 
    yield 3 
    data = yield 
    print(data) 
    data = yield 
    print(data) 

x = printvar() 
print(next(x)) 
x.send(4) 
x.send(5) 

나는 무엇을 기대 :

3 
4 
5 

내가 무엇을 얻을 :

3 
5 

사람이 동작을 설명 할 수 있습니까?

답변

7

두 가지 문제가 있습니다. 하나는 발전기를 3 번 ​​전진시킴으로써, 까지까지만 진행하면 그 이후의 코드가 아닌 마지막 출력이됩니다. 다른 하나는 send은 실행 결과가 이고 이전에이었던 yield 문 값으로 다음 값이 아닌 값을 넣습니다. 여기에 어떤 일이 발생하는지에 대해 단계별로 설명입니다 :

  1. next에 대한 귀하의 첫 번째 호출은 첫 번째 yield 3을 실행합니다.
  2. 다음에 send(4)을 호출하면 yield 3이 4로 평가되지만 printvar에서 아무 것도하지 않으므로 값은 무시됩니다. .send(4)도 발전기를 첫 번째 data = yield으로 전진시켜 없음을 산출합니다.
  3. 다음 번에 .send(5)을 호출하면 이 처음으로data = yield으로 설정되어 데이터를 5로 설정하고 발전기가 마지막 출력량으로 이동하여 다시 없음을 산출합니다.
  4. 그게 전부입니다. 발전기를 더 이상 진보시키지 않으므로 마지막 yield에서 실행이 중단 된 상태로 마지막 print을 실행하지 않습니다. send이 이미하지가 다음 얻을 것 곳으로,을 굴복 장소 에 값을 전송하는 것입니다 사용하는 경우

것은 기억합니다. 자세한 설명은 this similar question을 참조하십시오.

3

이 시도 :

def printvar(): 
    data = yield 3 
    print(data) 
    data = yield 
    print(data) 

x = printvar() 
print(next(x)) 
x.send(4) 
x.send(5) 

당신의 orginal 한 코드에서 yield 문이 아무것도를 수집하지 않기 때문에 송신 (4) 아무 을 간다.

+0

이로 인해 중지 오류가 발생합니다. –