<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 功能強大 支持多語言、二開方便! 廣告
                # 17.5.?`plural.py`, 第 4 階段 讓我們精煉出代碼中的重復之處,以便更容易地定義新規則。 ## 例?17.9.?`plural4.py` ``` import re def buildMatchAndApplyFunctions((pattern, search, replace)): matchFunction = lambda word: re.search(pattern, word) applyFunction = lambda word: re.sub(search, replace, word) return (matchFunction, applyFunction) ``` | | | | --- | --- | | \[1\] | `buildMatchAndApplyFunctions` 是一個動態生成其它函數的函數。它將 `pattern`,`search` 和 `replace` (實際上是一個元組,我們很快就會提到這一點),通過使用 `lambda` 語法構建一個接受單參數 (`word`) 并以傳遞給 `buildMatchAndApplyFunctions` 的 `pattern` 和傳遞給新函數的 `word` 調用 `re.search` 的匹配函數!哇塞! | | \[2\] | 構建應用規則函數的方法相同。應用規則函數是一個接受單參數并以傳遞給 `buildMatchAndApplyFunctions` 的 `search` 和 `replace` 以及傳遞給這個應用規則函數的 `word` 調用 `re.sub` 的函數。在一個動態函數中應用外部參數值的技術被稱作_閉合 (closures)_。你實際上是在應用規則函數中定義常量:它只接受一個參數 (`word`),但用到了定義時設置的兩個值 (`search` 和 `replace`)。 | | \[3\] | 最終,`buildMatchAndApplyFunctions` 函數返回一個包含兩個值的元組:你剛剛創建的兩個函數。你在這些函數中定義的常量 (`matchFunction` 中的 `pattern` 以及 `applyFunction` 中的 `search` 和 `replace`) 保留在這些函數中,由 `buildMatchAndApplyFunctions` 一同返回。這簡直太酷了。 | 如果這太費解 (它應該是這樣,這是個怪異的東西),可能需要通過了解它的使用來搞明白。 ## 例?17.10.?`plural4.py` 繼續 ``` patterns = \ ( ('[sxz]$', '$', 'es'), ('[^aeioudgkprt]h$', '$', 'es'), ('(qu|[^aeiou])y$', 'y$', 'ies'), ('$', '$', 's') ) rules = map(buildMatchAndApplyFunctions, patterns) ``` | | | | --- | --- | | \[1\] | 我們的復數化規則現在被定義成一組字符串 (不是函數)。第一個字符串是你在調用 `re.search` 時使用的正則表達式;第二個和第三個字符串是你在通過調用 `re.sub` 來應用規則將名詞變為復數時使用的搜索和替換表達式。 | | \[2\] | 這很神奇。把傳進去的 `patterns` 字符串轉換為傳回來的函數。如何做到的呢?將這些字符串映射給 `buildMatchAndApplyFunctions` 函數之后,三個字符串參數轉換成了兩個函數組成的元組。這意味著 `rules` 被轉換成了前面范例中相同的內容:由許多調用 `re.search` 函數的匹配函數和調用 `re.sub` 的規則應用函數構成的函數組組成的一個元組。 | 我發誓這不是我信口雌黃:`rules` 被轉換成了前面范例中相同的內容。剖析 `rules` 的定義,你看到的是: ## 例?17.11.?剖析規則定義 ``` rules = \ ( ( lambda word: re.search('[sxz]$', word), lambda word: re.sub('$', 'es', word) ), ( lambda word: re.search('[^aeioudgkprt]h$', word), lambda word: re.sub('$', 'es', word) ), ( lambda word: re.search('[^aeiou]y$', word), lambda word: re.sub('y$', 'ies', word) ), ( lambda word: re.search('$', word), lambda word: re.sub('$', 's', word) ) ) ``` ## 例?17.12.?`plural4.py` 的完成 ``` def plural(noun): for matchesRule, applyRule in rules: if matchesRule(noun): return applyRule(noun) ``` | | | | --- | --- | | \[1\] | 由于 `rules` 列表和前面的范例是相同的,`plural` 函數沒有變化也就不令人詫異了。記住,這沒什么特別的,按照順序調用一系列函數。不必在意規則是如何定義的。在[第 2 階段](stage2.html "17.3.?plural.py, 第 2 階段"),它們被定義為各具名稱的函數。在[第 3 階段](stage3.html "17.4.?plural.py, 第 3 階段"),他們被定義為匿名的 `lambda` 函數。現在第 4 階段,它們通過 `buildMatchAndApplyFunctions` 映射原始的字符串列表被動態創建。無所謂,`plural` 函數的工作方法沒有變。 | 還不夠興奮吧!我必須承認,在定義 `buildMatchAndApplyFunctions` 時我跳過了一個微妙之處。讓我們回過頭再看一下。 ## 例?17.13.?回頭看 `buildMatchAndApplyFunctions` ``` def buildMatchAndApplyFunctions((pattern, search, replace)): ``` | | | | --- | --- | | \[1\] | 注意到雙括號了嗎?這個函數并不是真的接受三個參數,實際上只接受一個參數:一個三元素元組。但是在函數被調用時元組被展開了,元組的三個元素也被賦予了不同的變量:`pattern`, `search` 和 `replace`。亂嗎?讓我們在使用中理解。 | ## 例?17.14.?調用函數時展開元組 ``` >>> def foo((a, b, c)): ... print c ... print b ... print a >>> parameters = ('apple', 'bear', 'catnap') >>> foo(parameters) catnap bear apple ``` | | | | --- | --- | | \[1\] | 調用 `foo` 的正確方法是使用一個三元素元組。函數被調用時,元素被分別賦予 `foo` 中的多個局部變量。 | 現在,讓我們回過頭看一看這個元組自動展開技巧的必要性。`patterns` 是一個元組列表,并且每個元組都有三個元素。調用 `map(buildMatchAndApplyFunctions, patterns)`,這并_不_ 意味著是以三個參數調用 `buildMatchAndApplyFunctions`。使用 `map` 映射一個列表到函數時,通常使用單參數:列表中的每個元素。就 `patterns` 而言,列表的每個元素都是一個元組,所以 `buildMatchAndApplyFunctions` 總是是以元組來調用,在 `buildMatchAndApplyFunctions` 中使用元組自動展開技巧將元素賦值給可以被使用的變量。
                  <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>

                              哎呀哎呀视频在线观看