2017-04-06 11 views
0

pythonでgenerator/send関数をもう少し理解しようとしています。私はリンクでいくつかを読んだ:generator send function purpose多くを助けた。Python generatorコルーチン

しかし、以下のコードを理解しようとしています。 next(checker)はなぜ必要なのですか?送信機能がジェネレータの次の項目を自動的に要求しないのですか?私はちょうどそのループの前にnext(checker)を持ってみましたが、それは同じように機能しません。私はsend関数がxとして '試み'を送信し、​​のいずれかを返すと考えました。私はちょうどループの中で次の(チェッカー)を持つ必要がある理由を理解していない。上記

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ベースを返します。最初正しい試行のインデックス、または-1どれも存在しない場合。

attempts = ["hello", "world", "I", "like", "coding"]password = "like"ため、出力は の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 

しかし、発電機とそのユーザとの間yield/send通信があるため、sendで始めることはできません。新たなジェネレータは、値を受け取る可能性のあるyieldではなく、機能本体の先頭で停止します。したがって、発電機が使用する値を開始する前に、常にnext(またはそれに相当するのはsend(None))でなければなりません。

+0

私はまだ完全に理解していません。 x = yieldだけでは何も得られない? send関数が呼び出されたときにx = yieldが実行され、xに試行を渡してからtrueまたはfalseを返すと思ったのですか? – user1179317

+1

@ user1179317:あなたが 'send'を呼び出すと' x = '部分が実行されます。 'next'を呼び出すと、ジェネレータは' yield'に進み、 'None'を返し、一時停止します。 'send'を呼び出すと、あなたが送ったオブジェクトは' yield'式の値になり、 'x'に代入され、' send'の戻り値は次の 'yield'から来ます。 – user2357112

+0

さて、私はそれを得たと思う。ありがとう – user1179317

関連する問題