<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 6.3.?`for` 循環 與其它大多數語言一樣,Python 也擁有 `for` 循環。你到現在還未曾看到它們的唯一原因就是,Python 在其它太多的方面表現出色,通常你不需要它們。 其它大多數語言沒有像 Python 一樣的強大的 list 數據類型,所以你需要親自做很多事情,指定開始,結束和步長,來定義一定范圍的整數或字符或其它可重復的實體。但是在 Python 中,`for` 循環簡單地在一個列表上循環,與 [list 解析](../native_data_types/mapping_lists.html "3.6.?映射 list")的工作方式相同。 ## 例?6.8.?`for` 循環介紹 ``` >>> li = ['a', 'b', 'e'] >>> for s in li: ... print s a b e >>> print "\n".join(li) a b e ``` | | | | --- | --- | | \[1\] | `for` 循環的語法同 [list 解析](../native_data_types/mapping_lists.html "3.6.?映射 list")相似。`li` 是一個 list,而 `s` 將從第一個元素開始依次接收每個元素的值。 | | \[2\] | 像 `if` 語句或其它任意[縮進塊](../getting_to_know_python/indenting_code.html "2.5.?代碼縮進"),`for` 循環可以包含任意數目的代碼行。 | | \[3\] | 這就是你以前沒看到過 `for` 循環的原因:至今我們都不需要它。太令人吃驚了,當你想要的只是一個 `join` 或是 list 解析時,在其它語言中常常需要使用 `for` 循環。 | 要做一個 “通常的” (Visual Basic 標準的) 計數 `for` 循環也非常簡單。 ## 例?6.9.?簡單計數 ``` >>> for i in range(5): ... print i 0 1 2 3 4 >>> li = ['a', 'b', 'c', 'd', 'e'] >>> for i in range(len(li)): ... print li[i] a b c d e ``` | | | | --- | --- | | \[1\] | 正如你在 [例?3.20 “連續值賦值”](../native_data_types/declaring_variables.html#odbchelper.multiassign.range "例?3.20.?連續值賦值") 所看到的,`range` 生成一個整數的 list,通過它來控制循環。我知道它看上去有些奇怪,但是它對計數循環偶爾 (我只是說_偶爾_) 會有用 。 | | \[2\] | 我們從來沒這么用過。這是 Visual Basic 的思維風格。擺脫它吧。正確遍歷 list 的方法是前面的例子所展示的。 | `for` 循環不僅僅用于簡單計數。它們可以遍歷任何類型的東西。下面的例子是一個用 `for` 循環遍歷 dictionary 的例子。 ## 例?6.10.?遍歷 dictionary ``` >>> import os >>> for k, v in os.environ.items(): ... 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()]) 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\] | 使用[多變量賦值](../native_data_types/declaring_variables.html#odbchelper.multiassign "3.4.2.?一次賦多值")和 [list 解析](../native_data_types/mapping_lists.html "3.6.?映射 list"),你可以使用單行語句來替換整個 `for` 循環。在實際的編碼中是否這樣做只是個人風格問題;我喜歡它是因為,將一個 dictionary 映射到一個 list,然后將 list 合并成一個字符串,這一過程顯得很清晰。其它的程序員寧愿將其寫成一個 `for` 循環。請注意在兩種情況下輸出是一樣的,然而這一版本稍微快一些,因為它只有一條 `print` 語句而不是許多。 | 現在我們來看看在 [第 5 章](../object_oriented_framework/index.html) 介紹的樣例程序 `fileinfo.py` 中 `MP3FileInfo` 的 `for` 循環 。 ## 例?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)} . . . if tagdata[:3] == "TAG": for tag, (start, end, parseFunc) in self.tagDataMap.items(): self[tag] = parseFunc(tagdata[start:end]) ``` | | | | --- | --- | | \[1\] | `tagDataMap` 是一個[類屬性](../object_oriented_framework/class_attributes.html "5.8.?類屬性介紹"),它定義了我們正在一個 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, &lt;function stripnulls&gt;))`,所以循環的第一輪,`tag` 為 `"title"`,`start` 為 `3`,`end` 為 `33`,`parseFunc` 為函數 `stripnulls`。 | | \[3\] | 現在我們已經從一個單個的 MP3 標記中提取出了所有的參數,將標記數據保存起來挺容易。我們從 `start` 到 `end` 對 `tagdata` 進行[分片](../native_data_types/lists.html#odbchelper.list.slice "例?3.8.?list 的分片 (slice)"),從而得到這個標記的實際數據,調用 `parseFunc` 對數據進行后續的處理,接著將 `parseFunc` 的返回值作為值賦值給偽字典 `self` 中的鍵字 `tag`。在遍歷完 `tagDataMap` 中所有元素之后,`self` 擁有了所有標記的值,[你知道看上去是什么樣](../object_oriented_framework/special_class_methods.html#fileinfo.specialmethods.setname "例?5.15.?設置 MP3FileInfo 的 name")。 |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看