迭代器和解析

2021-07-22 12:38:59 字數 2731 閱讀 9053

for迴圈可以用於python中的任何序列型別,包括列表、元組以及字串。

實際上,for迴圈甚至比這更為通用:可用於任何可迭代的物件。實際上,對python中所有會從左至右掃瞄物件的迭代工具而言都是如此,這些迭代工具包括了for迴圈、列表解析、in成員關係測試以及map內建函式等。

檔案迭代器

已開啟的檔案物件有個方法名為readline,可以一次從乙個檔案中讀取一行文字,每次呼叫readline方法時,就會前進到下一列。到達檔案末尾時,就會返回空字串,我們可通過它來檢測,從而跳出迴圈。

test.txt檔案內容:

如今,檔案也有乙個方法,名為__next__,差不多有相同的效果:每次呼叫時,就會返回檔案中的下一行。唯一值得注意的區別在於,到達檔案末尾時,__next__會引發內建的stopiteration異常,而不是返回空字串。

這個介面就是python中所謂的迭代協議:有__next__方法的物件會前進到下乙個結果,而在一系列結果的末尾時,則會引發stopiteration。在python中,任何這類物件都認為是可迭代的。任何這類物件也能以for迴圈或其他迭代工具遍歷,因為所有迭代工具內部工作起來都是在每次迭代呼叫__next__,並且捕捉stopiteration異常來確定何時離開。

注意,這裡的print使用end=' '來抑制新增乙個\n,因為行字串已經有了乙個(如果沒有這點,我們的輸出將會變成兩行隔開)。上例是讀取文字檔案的最佳方式,原因有三點:這是最簡單的寫法,執行最快,並且從記憶體使用情況來說也是最好的。相同效果的原始方式,是以for迴圈呼叫檔案的readlines方法,將檔案內容載入到記憶體,做成行字串的列表。

from __future__ import print_function

for line in open("test.txt").readlines():

print(line, end=' ')

這個readlines技術依然能用,從記憶體的使用情況來看,效果很差。實際上,因為這個版本其實是一次把整個檔案載入到記憶體,如果檔案太大,以至於計算機記憶體空間不夠,甚至不能工作。另一方面,因為一次讀取一行,迭代器版本對這類記憶體**的問題就有了免疫能力。此外,基於迭代器的版本會根據每次發布而改進,所以它執行的也應該更快(python3.0通過重寫i/o以支援unicode文字從而使得這一優點不那麼明顯,並且更少依賴於系統)。

當然也可以用while迴圈逐行讀取檔案。

from __future__ import print_function

f=open("test.txt")

while true:

line=f.readline()

if not line:break

print(line, end=' ')

f.close()

比起迭代器for迴圈的版本,這可能執行得更慢一些,因為迭代器在python中是以c語言的速度執行的,而while迴圈版本則是通過python虛擬機器執行python位元組碼中。任何時候,我們把python**換成c程式**,速度應該會變快。

在檔案上使用列表解析

from __future__ import print_function

f=open("test.txt")

lines=f.readlines()

lines=[line.rstrip() for line in lines]

print(lines)

f.close()

Python基礎 迭代和解析

for迴圈可以迭代序列物件,從左到右遍歷序列物件的元素。這裡for迴圈屬於迭代工具,而序列屬於可迭代物件,兩者通過迭代協議聯絡。python提供了內建函式next,以迭代器做輸入,每次返回序列的下一元素,直到序列末尾,引發異常 i iter 1,2,3,4 next i 1 next i 2 nex...

python學習手冊筆記 14 迭代器和解析

00.for迴圈可以用於python鐘任何序列型別,包括列表 元組以及字串 01.本章交替地使用 可迭代的 和 迭代器 來表示通常支援迭代的乙個物件。可迭代的 指的是支援iter的乙個物件,而 迭代器 指的是iter所返回的乙個支援next i 的物件。02.upper 大寫字母 03.當for迴圈...

SGI STL 迭代器解析

整理至侯捷 stl原始碼剖析 迭代器是一種設計模式,現在程式語言基本都語言層面支援了這種模式,定義如下 提供一種方法,使之能遍歷聚合物 容器 中的各個元素,而又不暴露聚合物內部的實現細節。在stl中,迭代器在容器和演算法之間扮演著橋梁的作用,演算法通過迭代器訪問容器中的資料。迭代器要實現下面幾個功能...