<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

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

    進一步閱讀

    97av