Python中for迴圈詳解_python

來源:互聯網
上載者:User

與其它大多數語言一樣,Python 也擁有 for 迴圈。你到現在還未曾看到它們的唯一原因就是,Python 在其它太多的方面表現出色,通常你不需要它們。

其它大多數語言沒有像 Python 一樣的強大的 list 資料類型,所以你需要親自做很多事情,指定開始,結束和步長,來定義一定範圍的整數或字元或其它可重複的實體。但是在 Python 中,for 迴圈簡單地在一個列表上迴圈,與 list 解析的工作方式相同。

1. for  迴圈介紹

複製代碼 代碼如下:

>>> li = ['a', 'b', 'e']
>>> for s in li:         (1)
...     print s          (2)
a

e
>>> print "\n".join(li)  (3)
a

e

(1)  for 迴圈的文法同 list 解析相似。li 是一個 list,而 s 將從第一個元素開始依次接收每個元素的值。
(2)  像 if 語句或其它任意縮排塊,for 迴圈可以包含任意數目的程式碼。
(3)  這就是你以前沒看到過 for 迴圈的原因:至今我們都不需要它。太令人吃驚了,當你想要的只是一個 join 或是 list 解析時,在其它語言中常常需要使用 for 迴圈。

要做一個 “通常的” (Visual Basic 標準的) 計數 for 迴圈也非常簡單。

2. 簡單計數

複製代碼 代碼如下:

>>> 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 產生一個整數的 list,通過它來控制迴圈。我知道它看上去有些奇怪,但是它對計數迴圈偶爾 (我只是說偶爾) 會有用 。
(2)  我們從來沒這麼用過。這是 Visual Basic 的思維風格。擺脫它吧。正確遍曆 list 的方法是前面的例子所展示的。

for 迴圈不僅僅用於簡單計數。它們可以遍曆任何類型的東西。下面的例子是一個用 for 迴圈遍曆 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 是在你的系統上所定義的環境變數的 dictionary。在 Windows 下,這些變數是可以從 MS-DOS 訪問的使用者和系統變數。在 UNIX 下,它們是在你的 shell 啟動指令碼中所 export (輸出) 的變數。在 Mac OS 中,沒有環境變數的概念,所以這個 dictionary 為空白。
(2)  os.environ.items() 返回一個 tuple 的 list:[(key1, value1), (key2, value2), ...]。for 迴圈對這個 list 進行遍曆。第一輪,它將 key1 賦給 k ,value1 賦給 v,所以 k = USERPROFILE,v = C:\Documents and Settings\mpilgrim。第二輪,k 得到第二個鍵字 OS,v 得到相應的值 Windows_NT。
(3)  使用多變數賦值和 list 解析,你可以使用單行語句來替換整個 for 迴圈。在實際的編碼中是否這樣做只是個人風格問題;我喜歡它是因為,將一個dictionary 映射到一個 list,然後將 list 合并成一個字串,這一過程顯得很清晰。其它的程式員寧願將其寫成一個 for 迴圈。請注意在兩種情況下輸出是一樣的,然而這一版本稍微快一些,因為它只有一條 print 語句而不是許多。

現在我們來看看在 第 5 章介紹的範例程式 fileinfo.py 中 MP3FileInfo 的 for 迴圈 。

複製代碼 代碼如下:

    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 是一個類屬性,它定義了我們正在一個 MP3 檔案中搜尋的標記。標記儲存為定長欄位,只要我們讀出檔案最後 128 個位元組,那麼第 3 到 32 位元組總是歌曲的名字,33-62 總是歌手的名字,63-92 為專輯的名字,等等。請注意 tagDataMap 是一個 tuple 的 dictionary,每個 tuple 包含兩個整數和一個函數引用。
(2)  這個看上去複雜一些,但其實並非如此。這裡的 for 變數結構與 items 所返回的 list 的元素的結構相匹配。記住,items 返回一個形如 (key, value) 的 tuple 的 list。list 第一個元素是 ("title", (3, 33, <function stripnulls>)),所以迴圈的第一輪,tag 為 "title",start 為 3,end 為 33,parseFunc 為函數 stripnulls。
(3)  現在我們已經從一個單個的 MP3 標記中提取出了所有的參數,將標記資料儲存起來挺容易。我們從 start 到 end 對 tagdata 進行分區,從而得到這個標記的實際資料,調用 parseFunc 對資料進行後續的處理,接著將
parseFunc 的傳回值作為值賦值給偽字典 self 中的鍵字 tag。在遍曆完 tagDataMap 中所有元素之後,self 擁有了所有標記的值,你知道看上去是什麼樣。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.