2017-08-12 20 views
1

誰かがこの発電機のコードが何をしているのか説明してもらえますか?このPython Generatorはどのように機能しますか?

>>> def f(): 
...  return next((i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}])) 
... 
>>> t = f() 
>>> for item in t: 
...  print(item) 
... 
a 
b 
>>> t 
{'a': 1, 'b': 2} 
>>> 

実際、この関数は単一の値を返すように設計されていますか?

答えて

2

誰かがこのジェネレーターコードのしていることを説明できますか?

(i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]) 

これは、発電機の理解のための構文です。このようにそれを反復してみてください。

In [205]: for x in (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]): 
...:  print(x) 
...:  
{'b': 2, 'a': 1} 
{'d': 4, 'c': 3} 

next()機能は、発電機から次の項目を返します。 nextのドキュメントから:

next(iterator[, default])

そのnext()メソッドを呼び出すことで、イテレータから次の項目を取得します。 デフォルトが指定されている場合は、反復子が使い果たされた場合は 、それ以外の場合はStopIterationが返されます。この場合

、何が返されると、これは辞書です

{'a':1, 'b':2} 

です。 forループをこのように使用すると、キーを繰り返し処理するので、キーの順序が保証されているので、abを順番に印刷します(python3.6を使用している場合)。古いPythonバージョンでは、任意の順序でキーを印刷します。

実際、この関数は単一の値だけを返すように設計されていますか?

はいです。

def f(): 
    yield from (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}])) 
+0

ありがとう:練習として、このように、yield fromreturnを変更してみてください。驚くべきことに、yieldは辞書の最初の項目を返します。 – user3267989

+0

キーが辞書から反復される順序は保証されないことに注意することは重要です。 Python 3.6より前のバージョンでは、ランダムである可能性があります。 3.6では、キーはディクショナリに追加された順序で生成されますが、これは実装の詳細とみなされ、依存する必要はありません。 3.7またはそれ以降のバージョンで変更される可能性があります(これは起こりそうですが、まだ決定されていません)。 – Blckknght

+0

>>> def f(): ...次に降順([{'' ':1、' b ':2}、{' c ':3、' d ':4}] )) ... >>> t = f() >>>のアイテムは ...プリント(アイテム) ... {'a':1、 'b':2} >>> – user3267989

関連する問題