<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    6.3. for 循環

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

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

                    例 6.8. for 循環介紹

                    >>> li = ['a', 'b', 'e']
                    >>> for s in li:         1
                    ...     print s          2
                    a
                    b
                    e
                    >>> print "\n".join(li)  3
                    a
                    b
                    e
                    1 for 循環的語法同 list 解析相似。li 是一個 list,而 s 將從第一個元素開始依次接收每個元素的值。
                    2 if 語句或其它任意縮進塊for 循環可以包含任意數目的代碼行。
                    3 這就是你以前沒看到過 for 循環的原因:至今我們都不需要它。太令人吃驚了,當你想要的只是一個 join 或是 list 解析時,在其它語言中常常需要使用 for 循環。

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

                    例 6.9. 簡單計數

                    >>> 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
                    ...     print li[i]
                    a
                    b
                    c
                    d
                    e
                    
                    1 正如你在 例 3.20 “連續值賦值” 所看到的,range 生成一個整數的 list,通過它來控制循環。我知道它看上去有些奇怪,但是它對計數循環偶爾 (我只是說偶爾) 會有用 。
                    2 我們從來沒這么用過。這是 Visual Basic 的思維風格。擺脫它吧。正確遍歷 list 的方法是前面的例子所展示的。

                    for 循環不僅僅用于簡單計數。它們可以遍歷任何類型的東西。下面的例子是一個用 for 循環遍歷 dictionary 的例子。

                    例 6.10. 遍歷 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 賦給 kvalue1 賦給 v,所以 k = USERPROFILEv = C:\Documents and Settings\mpilgrim。第二輪,k 得到第二個鍵字 OSv 得到相應的值 Windows_NT
                    3 使用多變量賦值list 解析,你可以使用單行語句來替換整個 for 循環。在實際的編碼中是否這樣做只是個人風格問題;我喜歡它是因為,將一個 dictionary 映射到一個 list,然后將 list 合并成一個字符串,這一過程顯得很清晰。其它的程序員寧愿將其寫成一個 for 循環。請注意在兩種情況下輸出是一樣的,然而這一版本稍微快一些,因為它只有一條 print 語句而不是許多。

                    現在我們來看看在 第 5 章 介紹的樣例程序 fileinfo.pyMP3FileInfofor 循環 。

                    例 6.11. 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"start3end33parseFunc 為函數 stripnulls
                    3 現在我們已經從一個單個的 MP3 標記中提取出了所有的參數,將標記數據保存起來挺容易。我們從 startendtagdata 進行分片,從而得到這個標記的實際數據,調用 parseFunc 對數據進行后續的處理,接著將 parseFunc 的返回值作為值賦值給偽字典 self 中的鍵字 tag。在遍歷完 tagDataMap 中所有元素之后,self 擁有了所有標記的值,你知道看上去是什么樣

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频