Python中for循環(huán)詳解
與其它大多數(shù)語(yǔ)言一樣,Python 也擁有 for 循環(huán)。你到現(xiàn)在還未曾看到它們的唯一原因就是,Python 在其它太多的方面表現(xiàn)出色,通常你不需要它們。
其它大多數(shù)語(yǔ)言沒(méi)有像 Python 一樣的強(qiáng)大的 list 數(shù)據(jù)類型,所以你需要親自做很多事情,指定開(kāi)始,結(jié)束和步長(zhǎng),來(lái)定義一定范圍的整數(shù)或字符或其它可重復(fù)的實(shí)體。但是在 Python 中,for 循環(huán)簡(jiǎn)單地在一個(gè)列表上循環(huán),與 list 解析的工作方式相同。
1. for 循環(huán)介紹
>>> li = ['a', 'b', 'e']
>>> for s in li: (1)
... print s (2)
a
e
>>> print "\n".join(li) (3)
a
e
(1) for 循環(huán)的語(yǔ)法同 list 解析相似。li 是一個(gè) list,而 s 將從第一個(gè)元素開(kāi)始依次接收每個(gè)元素的值。
(2) 像 if 語(yǔ)句或其它任意縮進(jìn)塊,for 循環(huán)可以包含任意數(shù)目的代碼行。
(3) 這就是你以前沒(méi)看到過(guò) for 循環(huán)的原因:至今我們都不需要它。太令人吃驚了,當(dāng)你想要的只是一個(gè) join 或是 list 解析時(shí),在其它語(yǔ)言中常常需要使用 for 循環(huán)。
要做一個(gè) “通常的” (Visual Basic 標(biāo)準(zhǔn)的) 計(jì)數(shù) for 循環(huán)也非常簡(jiǎn)單。
2. 簡(jiǎn)單計(jì)數(shù)
>>> for i in range(5): (1)
... print i
0
1
2
3
4
>>> li = ['a', 'b', 'c', 'd', 'e']
>>> for i in range(len(li)): (2)
- 104 -Dive Into Python http://diveintopython.org/
... print li[i]
a
c
d
e
(1) range 生成一個(gè)整數(shù)的 list,通過(guò)它來(lái)控制循環(huán)。我知道它看上去有些奇怪,但是它對(duì)計(jì)數(shù)循環(huán)偶爾 (我只是說(shuō)偶爾) 會(huì)有用 。
(2) 我們從來(lái)沒(méi)這么用過(guò)。這是 Visual Basic 的思維風(fēng)格。擺脫它吧。正確遍歷 list 的方法是前面的例子所展示的。
for 循環(huán)不僅僅用于簡(jiǎn)單計(jì)數(shù)。它們可以遍歷任何類型的東西。下面的例子是一個(gè)用 for 循環(huán)遍歷 dictionary 的例子。
3. 遍歷 dictionary
>>> import os
>>> for k, v in os.environ.items(): (1) (2)
... print "%s=%s" % (k, v)
USERPROFILE=C:\Documents and Settings\mpilgrim
OS=Windows_NT
COMPUTERNAME=MPILGRIM
USERNAME=mpilgrim
[...略...]
>>> print "\n".join(["%s=%s" % (k, v)
... for k, v in os.environ.items()]) (3)
USERPROFILE=C:\Documents and Settings\mpilgrim
OS=Windows_NT
COMPUTERNAME=MPILGRIM
USERNAME=mpilgrim
[...略...]
(1) os.environ 是在你的系統(tǒng)上所定義的環(huán)境變量的 dictionary。在 Windows 下,這些變量是可以從 MS-DOS 訪問(wèn)的用戶和系統(tǒng)變量。在 UNIX 下,它們是在你的 shell 啟動(dòng)腳本中所 export (輸出) 的變量。在 Mac OS 中,沒(méi)有環(huán)境變量的概念,所以這個(gè) dictionary 為空。
(2) os.environ.items() 返回一個(gè) tuple 的 list:[(key1, value1), (key2, value2), ...]。for 循環(huán)對(duì)這個(gè) list 進(jìn)行遍歷。第一輪,它將 key1 賦給 k ,value1 賦給 v,所以 k = USERPROFILE,v = C:\Documents and Settings\mpilgrim。第二輪,k 得到第二個(gè)鍵字 OS,v 得到相應(yīng)的值 Windows_NT。
(3) 使用多變量賦值和 list 解析,你可以使用單行語(yǔ)句來(lái)替換整個(gè) for 循環(huán)。在實(shí)際的編碼中是否這樣做只是個(gè)人風(fēng)格問(wèn)題;我喜歡它是因?yàn)?,將一個(gè)dictionary 映射到一個(gè) list,然后將 list 合并成一個(gè)字符串,這一過(guò)程顯得很清晰。其它的程序員寧愿將其寫成一個(gè) for 循環(huán)。請(qǐng)注意在兩種情況下輸出是一樣的,然而這一版本稍微快一些,因?yàn)樗挥幸粭l print 語(yǔ)句而不是許多。
現(xiàn)在我們來(lái)看看在 第 5 章介紹的樣例程序 fileinfo.py 中 MP3FileInfo 的 for 循環(huán) 。
tagDataMap = {"title" : ( 3, 33, stripnulls),
"artist" : ( 33, 63, stripnulls),
"album" : ( 63, 93, stripnulls),
"year" : ( 93, 97, stripnulls),
"comment" : ( 97, 126, stripnulls),
"genre" : (127, 128, ord)} (1)
.
.
.
if tagdata[:3] == "TAG":
for tag, (start, end, parseFunc) in self.tagDataMap.items(): (2)
self[tag] = parseFunc(tagdata[start:end]) (3)
(1) tagDataMap 是一個(gè)類屬性,它定義了我們正在一個(gè) MP3 文件中搜索的標(biāo)記。標(biāo)記存儲(chǔ)為定長(zhǎng)字段,只要我們讀出文件最后 128 個(gè)字節(jié),那么第 3 到 32 字節(jié)總是歌曲的名字,33-62 總是歌手的名字,63-92 為專輯的名字,等等。請(qǐng)注意 tagDataMap 是一個(gè) tuple 的 dictionary,每個(gè) tuple 包含兩個(gè)整數(shù)和一個(gè)函數(shù)引用。
(2) 這個(gè)看上去復(fù)雜一些,但其實(shí)并非如此。這里的 for 變量結(jié)構(gòu)與 items 所返回的 list 的元素的結(jié)構(gòu)相匹配。記住,items 返回一個(gè)形如 (key, value) 的 tuple 的 list。list 第一個(gè)元素是 ("title", (3, 33, <function stripnulls>)),所以循環(huán)的第一輪,tag 為 "title",start 為 3,end 為 33,parseFunc 為函數(shù) stripnulls。
(3) 現(xiàn)在我們已經(jīng)從一個(gè)單個(gè)的 MP3 標(biāo)記中提取出了所有的參數(shù),將標(biāo)記數(shù)據(jù)保存起來(lái)挺容易。我們從 start 到 end 對(duì) tagdata 進(jìn)行分片,從而得到這個(gè)標(biāo)記的實(shí)際數(shù)據(jù),調(diào)用 parseFunc 對(duì)數(shù)據(jù)進(jìn)行后續(xù)的處理,接著將
parseFunc 的返回值作為值賦值給偽字典 self 中的鍵字 tag。在遍歷完 tagDataMap 中所有元素之后,self 擁有了所有標(biāo)記的值,你知道看上去是什么樣。
相關(guān)文章
python 使用事件對(duì)象asyncio.Event來(lái)同步協(xié)程的操作
這篇文章主要介紹了python 使用事件對(duì)象asyncio.Event來(lái)同步協(xié)程的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python中Jupyter notebook快捷鍵總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于Python中Jupyter notebook快捷鍵總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-04-04Win10?Anaconda?新建環(huán)境安裝python-pcl的步驟
這篇文章主要介紹了Win10?Anaconda?新建環(huán)境安裝python-pcl的方法,至于VS環(huán)境下安裝C++?版本的pcl也可以按照此文提供的步驟安裝實(shí)現(xiàn),需要的朋友可以參考下2022-04-04pytorch?K折交叉驗(yàn)證過(guò)程說(shuō)明及實(shí)現(xiàn)方式
這篇文章主要介紹了pytorch?K折交叉驗(yàn)證過(guò)程說(shuō)明及實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Windows下Anaconda的安裝和簡(jiǎn)單使用方法
這篇文章主要介紹了Windows下Anaconda的安裝和簡(jiǎn)單使用方法,需要的朋友可以參考下2018-01-01Python??序列化反序列化和異常處理的問(wèn)題小結(jié)
這篇文章主要介紹了Python?序列化反序列化和異常處理,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12