Pythonステップ06循環オブジェクト

4618 ワード

原文:
Pythonステップ06循環オブジェクト
作者:Vamei出典:http://www.cnblogs.com/vamei 転載を歓迎します.この声明も保留してください.ありがとうございます.
 
この話の主な目的はPythonプログラムを読む時にサイクルオブジェクトに対して基本的な概念を持つことです.
循環対象はPythonの誕生に伴って存在するわけではないが、その発展は速く、特にPython 3 xの時代には、循環対象は循環の標準的な形になりつつある.
 
循環対象は何ですか?
ループオブジェクトは、次の結果に進むためのオブジェクトであり、一連の結果を終了した後、StopIterationエラーを挙げるためのnext()メソッドが含まれています.
ある循環構造(例えばfor)が循環対象を呼び出した時、それは循環のたびにnext()方法を呼び出します.StopIterationが出現するまで、forループが受信されると、ループが終了したことが分かります.next()の呼び出しを停止します.
test.txtのファイルがあると仮定します.
1234 abcd efg
私たちはpythonコマンドラインを実行します.
>>f=open('test.txt')
>>f.next()
>>f.next()

f.nextを入力し続けて、最後にStopIterationが現れます.
open()は実際にはループオブジェクトで、next()の方法が含まれています.このnext()メソッドは毎回戻ってくるのが新しい一行の内容で、ファイルの最後に到達する時StopIterationを挙げます.このようにして、私達は手作業で循環しました.
自動的に進行すると、
for line in open('test.txt'): print line
ここで、for構造は自動的にnext()メソッドを呼び出して、この方法の戻り値をラインに与えます.ループはStopIterationが出たときに終了します.
 
シーケンスに対して、循環オブジェクトを使用する利点は、サイクルがまだ始まっていないときに、使用する要素を生成することです.使用される要素は、サイクル中に逐次生成され得る.このように、空間を節約して、効率を高めて、プログラミングは更に柔軟です.
 
サンデー
技術的には、循環対象とfor循環呼び出しの間にもう一つの中間層があります.循環対象をローズマリーに変換することです.この変換はiter()関数を用いて達成された.しかし、論理的な観点からは、しばしばこのレベルを無視することができますので、循環オブジェクトとローズマリーはしばしばお互いを指します.
 
生成器
ジェネレータ(generator)の主な目的は、ユーザーがカスタマイズした循環オブジェクトを構成することである.
ジェネレータの作成方法と関数の定義は似ていますが、returnのところでyieldに変更されました.ジェネレータには複数のyieldがあります.ジェネレータがyieldに出会うと、運転ジェネレータを一時停止し、yieldの後の値を返します.ジェネレータを再起動すると、先の一時停止した場所から次のyieldまで運転を続けます.生成器自体はもう一つの循環器を構成しており、毎回1つのyieldを使って戻ります.
 
次はジェネレータです.
def gen(): a = 100

    yield a a = a*8

    yield a yield 1000
この生成器は全部で3つのyieldがあります.循環器として使用する場合、3回のサイクルを行います.
for i in gen(): print i
 
次のジェネレータを再検討します.
def gen(): for i in range(4): yield i
また、ジェネレータ式(Generator Expression)としても記述できます.
G = (x for x in range(4))
生成器式は生成器の簡単な作成方法である.読者はさらに調べることができる.
 
表の導出
表導出(list compone hension)は、クイックジェネレーションテーブルの方法である.その文法は簡単で、実用的な価値があります.
 
私たちがテーブルLを生成すると仮定します.
L = [] for x in range(10): L.append(x**2)
上記は表Lが発生しましたが、実際にはすばやい書き方があります.つまり、表導出の方式です.
L = [x**2 for x in range(10)]
これはジェネレータ式と似ています.中かっこだけを使います.
(表導出のメカニズムは実際には循環対象を利用しており、興味があれば調べることができる.)
 
練習します 以下の表の導出は何を生成しますか?
xl = [1,3,5] yl = [9,12,13] L = [ x**2 for (x,y) in zip(xl,yl) if y > 10]
 
締め括りをつける
オブジェクトを循環させる
生成器
表の導出