<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            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 函數中。

            進一步閱讀

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线