2013-10-06 51 views
17

我不懂行的含義:使用「與」和「或」運算符與Python字符串

parameter and (" " + parameter) or "" 

其中參數是字符串

爲什麼一個要使用andor運算符一般用python字符串嗎?

+5

這是'」「+參數在參數別人‘’'帶有額外的默默無聞。 – zch

+1

@ Smac89:它確實有道理,但如此我的人會認爲這是不刺激的。 –

回答

17

假設你正在使用的parameter價值,但如果該值是說None,那麼你寧願找一個空字符串""代替None。一般你會做什麼?

if parameter: 
    # use parameter (well your expression using `" " + parameter` in this case 
else: 
    # use "" 

這就是表達式在做什麼。首先,你應該明白什麼andor運營商的作用:

  • a and b回報b如果是True,否則返回a
  • a or b返回a如果a是True,否則返回b

所以,你的表達:

parameter and (" " + parameter) or "" 

這實際上相當於:

  • parameter - A1被評估爲:

    (parameter and (" " + parameter)) or "" 
    # A1    A2    B 
    #   A      or B 
    

    如何,如果表達式求值True

    result = (True and " " + parameter) or "" 
    
    result = (" " + parameter) or "" 
    
    result = " " + parameter 
    
  • parameter - A1None

    result = (None and " " + parameter) or "" 
    
    result = None or "" 
    
    result = "" 
    

作爲一般建議,它的更好和更具有可讀性使用A if C else B形式表達爲條件表達式。所以,你應該更好地使用:

" " + parameter if parameter else "" 

而不是給定的表達式。請參閱PEP 308 - Conditional Expression以瞭解if-else表達式背後的動機。

2

它檢查parameter是否有值。如果它確實佔據了空間。如果不是,則返回空字符串。

$ python 
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> foo = 'bar' 
>>> foo and (" " + foo) or "" 
' bar' 
+0

正確,但你可能想解釋它是如何工作的。 –

4

Python中的空字符串相當於一個False布爾值,與空列表相同。你所介紹的這一行是Python版本的三元運算符(如下面的註釋中所述,現在是一個過時的構造,如Python now has a real ternary operator)。它是基於三個規則:

  • a and b如果aFalse然後b將不會被計算
  • a or b如果aTrue然後b將不會被計算
  • 的邏輯值子句是其最近評估的表達式的值

如果parameter的計算結果爲Trueand子句的第二部分將得到評估:(" " + parameter)。所以如果它不是一個空字符串,它會爲parameter增加前導空間。 or子句的第二部分將不會被評估,因爲您已經可以知道整個表達式是TrueTrue或任何東西總是True)。

如果parameterFalse(在這種情況下空字符串)and條款的第二部分將不會得到評估,因爲你已經可以告訴它是FalseFalse,任何事情總是False)。因此or子句的第二部分被評估返回一個空字符串。

你可以在一個更詳細的方式把它寫:

if parameter: 
    return " " + parameter 
else: 
    return "" 
2

考慮這個TTL。然後,它只是堵塞在不同的場景,看看會發生什麼:)

注意andor評估,以使他們「成功」或「失敗」的第一個值 - 這不一定是真或假的!

a b a or b a and b 
-- -- ------ ------- 
T T a (T) b (T) 
T F a (T) b (F) 
F T b (T) a (F) 
F F b (F) a (F) 

T和F分別表示「Truth-y」和「False-y」值。這種表達式鏈接工作,因爲操作員不需要返回True或False - 它將是值ab

6

Python將空字符串視爲布爾值爲「false」,將非空字符串視爲布爾值爲「true」。

因此,表達式只有兩種可能的結果,即空字符串和非空字符串。

要注意的第二件事是返回「或」和「和」運算符的值。 Python不會返回true或false值,對於字符串和/或運算符,它會返回其中一個字符串(考慮它們具有true或false的值)。 Python使用懶惰的方法:

對於「和」運算符,如果left值爲true,則檢查右值並返回。如果剩餘值爲假,則返回

對於「或」運算符,如果第一個值爲true,則返回它。否則,如果第二個值是假的,那麼第二個值返回

parameter = 'test' 
print(parameter and (" " + parameter) or "") 

輸出中:測試

parameter = '' 
print(parameter and (" " + parameter) or "") 

輸出:(空字符串)

0

與所有的很好的答案,我發現這些報表幫助我記得這個更好,適合我的大腦如何工作(並希望爲更多的人):

  • 「和」返回第一個False項目(例如None,「」,[],(),{},0)或最後一個項目(如果沒有沒有虛假找到)

  • 「或」返回第一個真正的項目或最後一個項目(例如,沒有真正找到)

總之他們都返回決定語句的結果中的第一項。 (在最壞的情況下,該序列中的最後一項)

注意這一規則也適用於鏈的所有「和」或全部「或」語句