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

                    4.6. andor 的特殊性質

                    Python 中,andor 執行布爾邏輯演算,如你所期待的一樣。但是它們并不返回布爾值,而是返回它們實際進行比較的值之一。

                    例 4.15. and 介紹

                    >>> 'a' and 'b'         1
                    'b'
                    >>> '' and 'b'          2
                    ''
                    >>> 'a' and 'b' and 'c' 3
                    'c'
                    1 使用 and 時,在布爾環境中從左到右演算表達式的值。0''[](){}None 在布爾環境中為假;其它任何東西都為真。還好,幾乎是所有東西。默認情況下,布爾環境中的類實例為真,但是你可以在類中定義特定的方法使得類實例的演算值為假。你將會在第 5 章中了解到類和這些特殊方法。如果布爾環境中的所有值都為真,那么 and 返回最后一個值。在這個例子中,and 演算 'a' 的值為真,然后是 'b' 的演算值為真,最終返回 'b'
                    2 如果布爾環境中的某個值為假,則 and 返回第一個假值。在這個例子中,'' 是第一個假值。
                    3 所有值都為真,所以 and 返回最后一個真值,'c'

                    例 4.16. or 介紹

                    >>> 'a' or 'b'          1
                    'a'
                    >>> '' or 'b'           2
                    'b'
                    >>> '' or [] or {}      3
                    {}
                    >>> def sidefx():
                    ...     print "in sidefx()"
                    ...     return 1
                    >>> 'a' or sidefx()     4
                    'a'
                    1 使用 or 時,在布爾環境中從左到右演算值,就像 and 一樣。如果有一個值為真,or 立刻返回該值。本例中,'a' 是第一個真值。
                    2 or 演算 '' 的值為假,然后演算 'b' 的值為真,于是返回 'b'
                    3 如果所有的值都為假,or 返回最后一個假值。or 演算 '' 的值為假,然后演算 [] 的值為假,依次演算 {} 的值為假,最終返回 {}
                    4 注意 or 在布爾環境中會一直進行表達式演算直到找到第一個真值,然后就會忽略剩余的比較值。如果某些值具有副作用,這種特性就非常重要了。在這里,函數 sidefx 永遠都不會被調用,因為 or 演算 'a' 的值為真,所以緊接著就立刻返回 'a' 了。

                    如果你是一名 C 語言黑客,肯定很熟悉 bool ? a : b 表達式,如果 bool 為真,表達式演算值為 a,否則為 b。基于 Pythonandor 的工作方式,你可以完成相同的事情。

                    4.6.1. 使用 and-or 技巧

                    例 4.17. and-or 技巧介紹

                    >>> a = "first"
                    >>> b = "second"
                    >>> 1 and a or b 1
                    'first'
                    >>> 0 and a or b 2
                    'second'
                    
                    1 這個語法看起來類似于 C 語言中的 bool ? a : b 表達式。整個表達式從左到右進行演算,所以先進行 and 表達式的演算。1 and 'first' 演算值為 'first',然后 'first' or 'second' 的演算值為 'first'
                    2 0 and 'first' 演算值為 False,然后 0 or 'second' 演算值為 'second'

                    然而,由于這種 Python 表達式單單只是進行布爾邏輯運算,并不是語言的特定構成,這是 and-or 技巧和 C 語言中的 bool ? a : b 語法非常重要的不同。如果 a 為假,表達式就不會按你期望的那樣工作了。(你能知道我被這個問題折騰過嗎?不止一次?)

                    例 4.18. and-or 技巧無效的場合

                    >>> a = ""
                    >>> b = "second"
                    >>> 1 and a or b         1
                    'second'
                    1 由于 a 是一個空字符串,在 Python 的布爾環境中空字符串被認為是假的,1 and '' 的演算值為 '',最后 '' or 'second' 的演算值為 'second'。噢!這個值并不是你想要的。

                    and-or 技巧,也就是 bool and a or b 表達式,當 a 在布爾環境中的值為假時,不會像 C 語言表達式 bool ? a : b 那樣工作。

                    and-or 技巧后面真正的技巧是,確保 a 的值決不會為假。最常用的方式是使 a 成為 [a]b 成為 [b],然后使用返回值列表的第一個元素,應該是 ab中的某一個。

                    例 4.19. 安全使用 and-or 技巧

                    >>> a = ""
                    >>> b = "second"
                    >>> (1 and [a] or [b])[0] 1
                    ''
                    1 由于 [a] 是一個非空列表,所以它決不會為假。即使 a0 或者 '' 或者其它假值,列表 [a] 也為真,因為它有一個元素。

                    到現在為止,這個技巧可能看上去問題超過了它的價值。畢竟,使用 if 語句可以完成相同的事情,那為什么要經歷這些麻煩事呢?哦,在很多情況下,你要在兩個常量值中進行選擇,由于你知道 a 的值總是為真,所以你可以使用這種較為簡單的語法而且不用擔心。對于使用更為復雜的安全形式,依然有很好的理由要求這樣做。例如,在 Python 語言的某些情況下 if 語句是不允許使用的,比如在 lambda 函數中。

                    進一步閱讀

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

                                      这里只有精品视频