標籤:python python基礎 python指令碼 迴圈對象
以前總想著集中時間來學東西,經過這次國慶假期發現這TM根本就不現實啊,還是每天抽點時間,日積月累這樣比較好。
一、迴圈對象
迴圈對象的並不是隨著Python的誕生就存在的,但它的發展迅速,特別是Python 3x的時代,迴圈對象正在成為迴圈的標準形式。
迴圈對象是這樣一個對象,它包含有一個next()方法(__next__()方法,在python 3x中),
這個方法的目的是進行到下一個結果,而在結束一系列結果之後,舉出StopIteration錯誤。
當一個迴圈結構(比如for)調用迴圈對象時,它就會每次迴圈的時候調用next()方法,直到StopIteration出現,
for迴圈接收到,就知道迴圈已經結束,停止調用next()。
二、類比
假如有一個檔案test.txt,內容如下:
123abcxyz
現在我們來逐條讀取其內容:
f = open("test.txt")print f.next()print f.next()print f.next()# print f.next() #Traceback...in:...StopIteration在最後一個注釋掉的print f.next()會報錯,提示StopIteration
open()返回的實際上是一個迴圈對象,包含有next()方法。
而該next()方法每次返回的就是新的一行的內容,到達檔案結尾時舉出StopIteration。
這就相當於我們類比了如下迴圈:
for line in open("test.txt"): print lineor結構自動調用next()方法,將該方法的返回值賦予給line。迴圈知道出現StopIteration的時候結束。
三、產生器
產生器(generator)的主要目的是構成一個使用者自訂的迴圈對象。
產生器的編寫方法和函數定義類似,只是在return的地方改為yield。
產生器中可以有多個yield。當產生器遇到一個yield時,會暫停運行產生器,返回yield後面的值。
當再次調用產生器的時候,會從剛才暫停地方繼續運行,直到下一個yield。
產生器自身又構成一個迴圈器,每次迴圈使用一個yield返回的值。
下面是一個產生器:
def gen(): a = 2 yield a a = a * 2 yield a yield 1024
該產生器共有三個yield, 如果用作迴圈器時,會進行三次迴圈。
for i in gen(): print i
看另一個產生器:
def gen(): for i in range(4): yield i
可以寫成產生器運算式的形式:
G = (x for x in range(4))
產生器運算式是產生器的一種簡便的編寫方式。
四、表推導
表推導(list comprehension)是快速產生表的方法。
例如:
L = []for b in range(10): L.append(b**2)
以上產生了表L,但實際上有快捷的寫法,也就是表推導的方式:
L = [b**2 for b in range(10)]print(L)
輸出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
又如:
xl = [1,3,5]yl = [9,12,13]L = [ x**2 for (x,y) in zip(xl,yl) if y > 10]print(L)
輸出:
[9, 25]
Pythian學習筆記6:迴圈對象