2017-04-06 5 views
0

파이썬에서 generator/send 함수를 좀 더 이해하려고합니다. 나는 많은 것을 도왔던 링크 : generator send function purpose를 읽었다.파이썬 생성기 코 루틴

하지만 아래 코드를 이해하려고합니다. next(checker)은 왜 필요한가요? 보내기 기능이 자동으로 발전기의 다음 항목을 요구하지 않습니까? 나는 단지 for 루프 앞에 next(checker)을 가지려고했으나 같은 방법으로는 기능을하지 못한다. 나는 send 함수가 x로 '시도'를 보내고 x == password의 결과를 산출한다고 생각했다. 나는 그저 왜 루프에 다음 (체커)이 있어야하는지 이해하지 못한다.

def checkPassword(attempts, password): 
    def check(): 
     while True: 
      x = yield 
      yield x == password 

    checker = check() 
    for i, attempt in enumerate(attempts): 
     next(checker) 
     if checker.send(attempt): 
      return i + 1 

    return -1 

기능은 위의 문제의 기본은 다음과 같습니다.

"로컬 테스트하려는 기능을 확인하기 위해 시도의 목록과 올바른 암호를 감안할 때, 1 기 반환 첫 번째 시도의 정확한 인덱스 또는 attempts = ["hello", "world", "I", "like", "coding"]password = "like" -1 없음이 없다면.

가 출력되어야 checkpassword를 (a ttempts, password) = 4 "

답변

4

송신 기능이 자동으로 발전기의 다음 항목을 요청하지 않습니까?

그래,하지만이 발전기가 기록되는 방법은, 절반 값은이 yield에서 온 : 단지 None를 산출

x = yield 

합니다. next에 대한 전화는 None을 사용합니다.


발전기는 next 전화의 대부분을 제거하기 위해, 다르게 기록 된 수 : 그러나

def checkPassword(attempts, password): 
    def check(): 
     x = yield 
     while True: 
      x = yield x == password 

    checker = check() 
    next(checker) 
    for i, attempt in enumerate(attempts): 
     if checker.send(attempt): 
      return i + 1 

    return -1 

, 발전기 및 send로 시작할 수 없습니다 자사의 사용자 사이의 yield/send 통신, 이후 새로운 생성자는 값을받을 수있는 yield이 아닌 함수 본문의 시작 부분에서 중지됩니다. 따라서 발전기가 사용할 값을 시작하기 전에 반드시 next (또는 이와 동등한 숫자는 send(None))이어야합니다.

+0

나는 아직도 완전히 이해하지 못한다. x = yield는 단지 yield만을 산출합니까? send 함수가 호출 될 때 x = yield가 실행 된 것으로 생각하고 x에 시도를 전달한 다음 true 또는 false를 반환합니다. – user1179317

+1

@ user1179317 :'x ='부분은'send'를 호출 할 때 실행됩니다. 'next'를 호출하면 생성기는'yield'로 진행하고'None'을 반환하고 일시 정지합니다. 'send'를 호출하면 여러분이 보낸 객체는'yield' 표현식의 값이되고'x'에 할당되고'send'의 반환 값은 다음'yield'에서옵니다. – user2357112

+0

좋아, 알았어. 감사합니다 – user1179317