2016-10-17 76 views
0

我查看兩臺子是否包含在另一個字符串:複合if語句和「IN」運算符來檢查多個子是否包含在一個字符串

if (substr1 and substr2) in str: 
    my_func() 

這是不行的,如果語句已當只有一個子字符串是字符串的一部分時輸入。有人能解釋爲什麼嗎?

我發現了下面的解決方法,我只想知道爲什麼Python的行爲如此。

substr_list = [substr1, substr2] 
if all(substr in str for substr in substr_list): 
    my_func() 
+0

'(substr1和substr2)'是一個布爾值。這個表達式在你的字符串中的結果是什麼?不需要。然後,您需要使用單獨的表達式'如果substr1 in str和substr2 in str:' –

+1

Intro:[shortcircuiting](https://docs.python.org/3/library/stdtypes.html#boolean-operations-and -或不)。首先評估父母身上的物品,並只採取一種。獎勵:不要使用'str'作爲名稱。 'str'是一個內置的函數,在賦值給名字後會被遮蔽。 –

+0

@Moses Koledoye:謝謝你給我介紹術語shortcircuiting – Dahlai

回答

0

它不工作,因爲(substr1 and substr2)回報substr2或操作數,它可以轉換爲False,並在此之後您驗證if substr2 in str

'' and 'Some string' # '' 
'some value' and 'some value 2' # 'some value 2' 
# full example 
string_variable = 'some value' and 'some value 2' # You get 'some value 2' 
string_variable in substr2 
+0

的一些特定行爲** False **:* return substr2或False *。它返回一個操作數。請參閱[shortcircuiting](https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not) –

+0

你是對的,不是False,而是賦予False的操作數。編輯答案 –

-2

所以and工作檢查兩個布爾(True/False值)True ,但(substr1 and substr2)不是布爾值。然而,substr1 in strsubstr2 in str和兩個布爾值,這樣你就可以創建一個語句:

if substr1 in str and substr2 in str: 
    myfunc() 

現在

substr_list = [substr1, substr2] 
if all(substr in str for substr in substr_list): 
    my_func() 

聲明(substr in str for substr in substr_list)創建一個發電機,將返回兩個布爾值。 all所做的是採用任何可迭代的布爾值生成器列表,並返回單個布爾檢查,如果它們全部爲True

相關問題