1. 程式人生 > >python:迭代器和列表解析

python:迭代器和列表解析

建立迭代器:

對一個物件呼叫 iter() 就可以得到它的迭代器. 它的語法如下:

iter(obj)
iter(func, sentinel )

如果你傳遞一個引數給 iter() , 它會檢查你傳遞的是不是一個序列, 如果是, 那麼很簡單:根據索引從 0 一直迭代到序列結束.

另一個建立迭代器的方法是使用類, 一個實現了 __iter__() 和 next() 方法的類可以作為迭代器使用.

如 果 是 傳 遞 兩 個 參 數 給 iter() , 它 會 重 復 地 調 用 func , 直 到 迭 代 器 的 下 個 值 等 於sentinel .

列表解析:

1、解析語法:

[expr for iter_var in iterable]

這個語句的核心是 for 迴圈, 它迭代 iterable 物件的所有條目. 前邊的 expr 應用於序列的每個成員, 最後的結果值是該表示式產生的列表. 迭代變數並不需要是表示式的一部分.

>>> [x ** 2 for x in range(6)]  #它有一個計算序列成員的平方 
[0, 1, 4, 9, 16, 25]
2、列表解析還提供了一個擴充套件版本的語法:
[expr for iter_var in iterable if cond_expr]

這個語法在迭代時會過濾/捕獲滿足條件表示式 cond_expr 的序列成員.

>>> seq = [11, 10, 9, 9, 10, 10, 9, 8, 23, 9, 7, 18, 12, 11, 12]

>>> [x for x in seq if x % 2] #它用於判斷一個數值物件是奇數還是偶數(奇數返回 1 , 偶數返回 0 ) [11, 9, 9, 9, 23, 9, 7, 11]
===磁碟檔案樣例===
假設我們有如下這樣一個數據檔案 hhga.txt , 需要計算出所有非空白字元的數目:
And the Lord spake, saying, "First shalt thou take
out the Holy Pin. Then shalt thou count to three,

no more, no less. Three shall be the number thou shalt
count, and the number of the counting shall be three.
Four shalt thou not count, nei- ther count thou two,
excepting that thou then proceed to three. Five is
right out. Once the number three, being the third
number, be reached, then lobbest thou thy Holy Hand
Grenade of Antioch towards thy foe, who, being
naughty in My sight, shall snuff it."

我們已經知道可以通過 for line in data 迭代檔案內容, 不過, 除了這個, 我們還可以把每行分割( split )為單詞, 然後我們可以像這樣計算單詞個數:

>>> f = open('hhga.txt', 'r')
>>> len([word for line in f for word in line.split()])
91

生成器表示式:(expr for iter_var in iterable) 或 (expr for iter_var in iterable if cond_expr) 

生成器表示式就好像是懶惰的列表解析(這反而成了它主要的優勢). 它還可以用來處理其他列表或生成器

>>> L= (i + 1 for i in range(10) if i % 2)
>>> L
<generator object <genexpr> at 0xb749a52c>
>>> L1=[]
>>> for i in L:
... L1.append(i)
...
>>> L1
[2, 4, 6, 8, 10] 
生成器表示式並不真正建立數字列表, 而是返回一個生成器,這個生成器在每次計算出一個條目後,把這個條目“產生”(yield)出來。 生成器表示式使用了“惰性計算”(lazy evaluation,也有翻譯為“延遲求值”,我以為這種按需呼叫call by need的方式翻譯為惰性更好一些),只有在檢索時才被賦值( evaluated),所以在列表比較長的情況下使用記憶體上更有效。A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them.