反復可能オブジェクト:オブジェクトITER方式の実現が反復的です
反復子:方法及び次ITER方法の実現は、イテレータの目的であります
BuilderはあるIterator
オブジェクトが、list
、dict
、str
しかしIterable(可迭代对象)
、ではありませんIterator(迭代器)
。
コレクションインポートイテレータ #のイテレータ からコレクションのインポート反復処理可能 #のイテラブルの 印刷(でisinstance(S、イテレータ)) #のイテレータされていない判断 を印刷(でisinstance(S、反復処理可能)) #の判断ではない反復可能オブジェクトのある #は反復することを反復子オブジェクトがに変換される 印刷(でisinstance(ITER(S)、反復子))
なぜlist
、dict
、str
および他のデータ型はありませんかIterator
?
PythonがあるためであるIterator
のオブジェクト表現データフローは、することができるイテレータオブジェクトnext()
起動が機能し続けるとスローデータが存在しないことまで、次のデータを返しStopIteration
、エラーを。このデータ・ストリームは、順序付けられたシーケンスとして見ることができるが、我々は唯一のを続行することができ、事前にシーケンスの長さを知ることができないnext()
ので、次のデマンドがデータ関数の計算を実現するIterator
だけで次のデータを返す必要があり、計算が不活性でありますそれが計算されます。
Iterator
でも、このようなすべての自然数などのデータ、の無限の流れを表します。リストは、すべての自然数を使用して格納されることはありません。
ジェネレータ:ジェネレータはイテレータです
2つの方法でメソッド・ジェネレータを作成します。
1.式[]括弧に()括弧のリスト
= [Iは+ 1 のための Iの中範囲(5)] #リスト式 印刷(A) B =(Iは、+ 1 のための I にレンジ(5)) #の生成 プリント(B) を印刷(次に(B)) プリント(次に(B)) プリント(次に(B)) プリント(次に(B)) プリント(次に(B)) プリント(次に(B)) 出力: [ 1、2、3、4、5 ] < 0x00000163C820BAF0 ATジェネレータ<genexpr>を>オブジェクト 。1 2 。3 。4 。5 トレースバック(最新のラストコール): ファイル」E:/myproj/pytest_demo/b.py 」、13行目は、あるに <Module1の> 印刷(次(B)) を呼び出すとStopIteration
最も一般的な発電機やサイクルはを求めて:
Bで私がのために:
プリント(I)
2.関数を定義ファンクション・ジェネレータを呼び出すことによって得られ、文収率が含まれています
DEF FIB(MAX): N-、A、B = 0,0,1 ながら N- < 最大: 収量B A、B = B、A + B :N- = 1 + N- リターン ' DONE ' A(6 = FIBは)呼番号を含みます関数は、文はすぐに実行されません、それだけで、ビルダーを返す場合にのみ、プログラムの次の関数呼び出しによって、または発電機()関数は、実際に実行されますトラバース得 印刷を(a)の ために私に嘘(6 ): 印刷(I) 出力: <ジェネレータFIB AT 0x000001866F62BAF0オブジェクト> 1。 1。 2 3。 5。 8。
収量について:
そして、リターンを得るために同様のプログラムの実行を返し、再び呼び出されたときにそう、プログラムは最後の利回り部門から継続します
あなたはまだ不明上記の原理を実行する場合、それはさらにサンプルコードをデバッグすることによって理解することができます...