<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 4.7.?使用 `lambda` 函數 * 4.7.1\. 真實世界中的 lambda 函數 Python 支持一種有趣的語法,它允許你快速定義單行的最小函數。這些叫做 `lambda` 的函數,是從 Lisp 借用來的,可以用在任何需要函數的地方。 ## 例?4.20.?`lambda` 函數介紹 ``` >>> def f(x): ... return x*2 ... >>> f(3) 6 >>> g = lambda x: x*2 >>> g(3) 6 >>> (lambda x: x*2)(3) 6 ``` | | | | --- | --- | | \[1\] | 這是一個 `lambda` 函數,完成同上面普通函數相同的事情。注意這里的簡短的語法:在參數列表周圍沒有括號,而且忽略了 `return` 關鍵字 (隱含存在,因為整個函數只有一行)。而且,該函數沒有函數名稱,但是可以將它賦值給一個變量進行調用。 | | \[2\] | 使用 `lambda` 函數時甚至不需要將它賦值給一個變量。這可能不是世上最有用的東西,它只是展示了 `lambda` 函數只是一個內聯函數。 | 總的來說,`lambda` 函數可以接收任意多個參數 (包括[可選參數](optional_arguments.html "4.2.?使用可選參數和命名參數")) 并且返回單個表達式的值。`lambda` 函數不能包含命令,包含的表達式不能超過一個。不要試圖向 `lambda` 函數中塞入太多的東西;如果你需要更復雜的東西,應該定義一個普通函數,然后想讓它多長就多長。 > 注意 > `lambda` 函數是一種風格問題。不一定非要使用它們;任何能夠使用它們的地方,都可以定義一個單獨的普通函數來進行替換。我將它們用在需要封裝特殊的、非重用代碼上,避免令我的代碼充斥著大量單行函數。 ## 4.7.1.?真實世界中的 `lambda` 函數 `apihelper.py` 中的 `lambda` 函數: ``` processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) ``` 注意這里使用了 [`and-or`](and_or.html "4.6.?and 和 or 的特殊性質") 技巧的簡單形式,它是沒問題的,因為 `lambda` 函數[在布爾環境中](../native_data_types/lists.html#tip.boolean)總是為真。(這并不意味這 `lambda` 函數不能返回假值。這個函數對象的布爾值為真;它的返回值可以是任何東西。) 還要注意的是使用了沒有參數的 `split` 函數。你已經看到過它帶[一個或者兩個參數](../native_data_types/joining_lists.html#odbchelper.split.example "例?3.28.?分割字符串")的使用,但是不帶參數它按空白進行分割。 ## 例?4.21.?`split` 不帶參數 ``` >>> s = "this is\na\ttest" >>> print s this is a test >>> print s.split() ['this', 'is', 'a', 'test'] >>> print " ".join(s.split()) 'this is a test' ``` | | | | --- | --- | | \[1\] | 這是一個多行字符串,通過使用轉義字符的定義代替了[三重引號](../getting_to_know_python/documenting_functions.html#odbchelper.triplequotes "例?2.2.?定義 buildConnectionString 函數的 doc string")。`\n` 是一個回車,`\t` 是一個制表符。 | | \[2\] | 不帶參數的 `split` 按照空白進行分割。所以三個空格、一個回車和一個制表符都是一樣的。 | | \[3\] | 通過 `split` 分割字符串你可以將空格統一化;然后再以單個空格作為分隔符用 `join` 將其重新連接起來。這也就是 `info` 函數將多行 `doc string` 合并成單行所做的事情。 | 那么 `info` 函數到底用這些 `lambda` 函數、`split` 函數和 `and-or` 技巧做了些什么呢? ``` processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) ``` `processFunc` 現在是一個函數,但是它到底是哪一個函數還要取決于 `collapse` 變量。如果 `collapse` 為真,``processFunc`(_string_)` 將壓縮空白;否則 ``processFunc`(_string_)` 將返回未改變的參數。 在一個不很健壯的語言中實現它,像 Visual Basic,你很有可能要創建一個函數,接受一個字符串參數和一個 _`collapse`_ 參數,并使用 `if` 語句確定是否壓縮空白,然后再返回相應的值。這種方式是低效的,因為函數可能需要處理每一種可能的情況。每次你調用它,它將不得不在給出你所想要的東西之前,判斷是否要壓縮空白。在 Python 中,你可以將決策邏輯拿到函數外面,而定義一個裁減過的 `lambda` 函數提供確切的 (唯一的) 你想要的。這種方式更為高效、更為優雅,而且很少引起那些令人討厭 (哦,想到那些參數就頭昏) 的錯誤。 ## `lambda` 函數進一步閱讀 * Python Knowledge Base 討論了使用 `lambda` 來[間接調用函數](http://www.faqts.com/knowledge-base/view.phtml/aid/6081/fid/241)。 * _Python Tutorial_ 演示了如何[從一個 `lambda` 函數內部訪問外部變量](http://www.python.org/doc/current/tut/node6.html#SECTION006740000000000000000)。([PEP 227](http://python.sourceforge.net/peps/pep-0227.html) 解釋了在 Python 的未來版本中將如何變化。) * _The Whole Python FAQ_ 有關于[令人模糊的使用 `lambda` 單行語句](http://www.python.org/cgi-bin/faqw.py?query=4.15&querytype=simple&casefold=yes&req=search)的例子。
                  <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>

                              哎呀哎呀视频在线观看