まず、イテレータ
1、イテレータのコンセプト
1.1イテレータプロトコルは:次のメソッドを提供しなければならないオブジェクトを参照する、本方法は、湖ヴァンの次の反復のいずれかを行う、または呼び出すとStopIterationの異常が(反復を終了させるバックフォワードない行くだけ次)
1.2イテラブル:イテレータプロトコルを実装するオブジェクト。イテレーション:人気の話はリニューアルのプロセスであり、
1.3プロトコルはイテレート可能オブジェクトは、オブジェクトにアクセスする反復プロトコルを使用してイテレータプロトコル、Pythonの内部ツール(forループ、最小関数、和等)を実装し、慣例です。
図2に示すように、循環機構のために、それはイテレータプロトコルの作業に基づいています
データ型トラバーサルforループ2.1:
文字列、リストやタプル:1)タイプを発注
障害の2)種類:辞書、コレクションおよびドキュメント
ループ作品の2.2
1)_ilter_コールセンター法内部に蓄積最初トラバースされるデータオブジェクトは、反復的に変換します
2の後に)異常終了の轟音を見つけること
要約:Forループイテレータベースのプロトコルを通過することができるすべてのオブジェクトのための統一方法を提供することです
3、サンプル
L = [1,3,2 ] のための I における L: #ココア繰り返しオブジェクトのリストL中に入れ、それは反復プロトコルに従い、次いでするプロトコルを介してループに反復ループのための 印刷(I) iter_lはリットル= 。__iter__ () 印刷(iter_l。__next__())
#第二の方法は:組み込みの次の機能は、次の方法は、イテレータの次iter_l .__ __()このメソッド自体を呼び出すことです
L = [1,3,2]
iter_lパス= I .__ __()
プリント(次の(iter_l))
DIC = { " A ":1、" B ":22である} iter_d = DIC。__iter__ () プリント(iter_d。__next__ ()) プリント(iter_d。__next__())#1 _next_()メソッドの実行結果は、キー値である #第二の方法: のための私でDIC: 印刷(I)
第二に、発電機
1)自動的に、それ自体がイテラブルプロトコルをイテレータメモリセーブ計算を遅らせます
2)解析された[]と()ジェネレータ式のリストが得られます。
3)リスト内包とジェネレータ式は、比較的、より経済的なメモリの下でジェネレータ式は、プログラミングの便利な方法です
ジョブの完了に基づいてイテレータプロトコルのループ4)のPython
1、三元表現&リスト内包表記
=名前" CC " RES = " Xiaozhan " IF名== " CC " 他の " 緑の持つ" #三項の表現 を印刷(RES) #第二の方法の L = [ " 卵S%"%I のための I におけるレンジ(10 )IF I> 5。]#リスト解析 プリント(L) #の結果:[ '卵6'、7 '卵'、 '卵8'、 '9個の卵']
2、ジェネレータ式
(L = " 卵%S "%Iは、のために I におけるレンジ(10)IF I> 5。 ) 印刷(L) を印刷(L. __next__ ()) を印刷(次(L)) #の結果: <ジェネレータオブジェクト<genexpr> 0x00000243BFCD9258>の 卵6 個の卵7
図3に示すように、関数発生器
発電機の利点:の戻り値として、リターンと同等のものを得られる1)
2)関数は、次を実行し続けること一端位置から、作動状態を保持します
3.1サンプル
インポート時間 DEF 試験(): time.sleep( 3 ) 収率。1 #各収率はリターンリターンに相当し 得 2 プリント(" 今すぐ開始" ) 収率。3つの RES = テスト()#1 GETジェネレータ 印刷(RES) #生成対象 の印刷(RES。__next__()) #の生成動作yield1 プリント(RES。__next__()) #の発生yield2動作 プリント(RES。__next__()) #の発電動作yield3
インポート時間 DEF テスト(): 印刷(「それを開始」) 利回り 、「I 」 time.sleep( 3 ) 印刷(「2が権利を開始した」) 利回り 「彼女」 time.sleep( 3 ) 印刷(「三人の友が始まりました」) 収率は、 " 彼の" RESが = テスト() プリント(RES) #ジェネレータオブジェクトの 印刷(RES。__next__()) #を実行し、私の発電収率 印刷(RES。__Next__()) #は、発電機を実行し、彼女の産出 を印刷する(RES。__Next__()) #発電機は彼を得実行
DEF prduct_baozi(): 用 I における範囲(100 :) 印刷(" 蒸しパンの友人を開始" ) 収率は 、 " 引き出し%S蒸し"%Iは、 印刷を(" パンの販売を開始" ) Pro1の = prduct_baozi() 包子 = Pro1の。__next__ () 包子 = Pro1の。__next__ () 包子 = Pro1の。__next__ () 包子 = Pro1の。__next__()
3.2send静止位置に割り当てられている値を送信する、位置の機能をご利用いただけ
DEF テスト(): プリント(" 今すぐ開始" ) まず = 降伏 プリント(" 第一" まず、) 収率 2 プリント(" 第二" ) T = 試験() RES = T. __next__ () 印刷(RES ) RES = t.send(「第一の位置に残っている機能は、私の最初の割り当てが与えることです」) 印刷(RES)
3.2生産者消費者モデル(単一スレッドの同時実行)
#プロセス:2つのパン
時間インポート
DEF Custmer(名):
印刷(%名"I [%sは]、私はパンを用意しています")
真中:
包子は=得
time.sleep(1)
〔%に(「%Sは非常に満足して印刷をS]が食べた"%(名前、包子))
C1 = Custmer(" CC ")
C2 = Custmer("ナナ")
C1 .__次に__()
C2 .__次に__()
c1.send("パン「)
C2。送信(「パン」)
#工程II:自動焼き機能の使用
時間インポート
DEF Custmer(名):
印刷(%名"I [%sは]、私はパンを用意しています")
真中:
包子は=得
time.sleep(1)
〔%に(「%Sは非常に満足して印刷をS] "%(名前、包子))食べ
DEFのproductor():
C1 = Custmer(" CC ")
C2 = Custmer("ナナ")
C1 .__次に__()
C2 .__次に__()
c1.sendを("バンズ")
c2.send("パン「)
productor()
#工程III:ループのための複数のパンを作成します
インポート時間 DEF Custmer(名): 印刷(" I [%sの]、私はパン用意しています"%の名を) しばらく真: 包子は = 得 time.sleepを( 1 ) 印刷(" [%と非常に幸せ%S S]は食べた"%(名前、包子)) DEFのproductorを(): C1 = Custmer(" CC " ) C2 = Custmer(" ナナ」) 。C1 __next__ () 。C2 __next__() のための I における範囲(10 ): time.sleep( 1 ) c1.send(" 包子%S "%I) c2.send(" 包子%S "%のI) productor()