1. 程式人生 > 程式設計 >python不相等的兩個字串的 if 條件判斷為True詳解

python不相等的兩個字串的 if 條件判斷為True詳解

今天遇到一個非常基礎的問題,結果搞了好久好久.....趕快寫一篇部落格記錄一下:

本來兩個不一樣的字串,在if 的條件判斷中被判定為True,下面是錯誤的程式碼:

test_str = 'happy'
if test_str == 'good' or 'happy': #這樣if判斷永遠是True,寫法錯誤
  print('aa')
else:
  print('bbbb')

這是正確的程式碼:

test_str = 'happy'
if test_str == 'good' or test_str == 'happy':
  print('aa')
else:
  print('bbbb')

補充知識:python基礎(if判斷條件語句,比較、布林運算子)

1.條件和條件語句

在編寫的程式中,語句都是逐條執行的。現在更進一步,讓程式選擇是否執行特定的語句塊。

1 )布林值的用武之地

真值也稱布林值,是以在真值方面做出了巨大貢獻的George Boole命名的。

用作布林表示式(如用作if語句中的條件)時,下面的值都將被直譯器視為假:

False None 0 "" () [] {}

換而言之,標準值False和None、各種型別(包括浮點數、複數等)的數值0、空序列(如空字串、空元組和空列表)以及空對映(如空字典)都被視為假,而其他各種值都被視為真,包括特殊值True。

正如Python老手Laura Creighton指出的,這種差別類似於“有些東西”和“沒有東西”的差別,而不是真和假的差別。

這意味著任何Python值都可解釋為真值。乍一看這有點令人迷惑,但也很有用。雖然可供選擇的真值非常多,但標準真值為True和False。在有些語言(如C語言和2.3之前的Python版本)中,標準真值為0(表示假)和1(表示真)。實際上,True和False不過是0和1的別名,雖然看起來不同,但作用是相同的。

>>> True 
True 
>>> False 
False 
>>> True == 1 
True 
>>> False == 0 
True 
>>> True + False + 42 
43 

因此,如果你看到一個返回1或0的表示式(可能是使用較舊的Python版本編寫的),就知道這實際上意味著True或False。

布林值True和False屬於型別bool,而bool與list、str和tuple一樣,可用來轉換其他的值。

>>> bool('I think,therefore I am') 
True 
>>> bool(42) 
True 
>>> bool('') 
False 
>>> bool(0) 
False 

鑑於任何值都可用作布林值因此你幾乎不需要顯式地進行轉換(Pthon會自動轉換)

雖然[]和""都為假(即bool([]) == bool("") == False),但它們並不相等(即[] != "")。

對其他各種為假的物件來說,情況亦如此(一個更顯而易見的例子是() != False)。

2) 有條件地執行和 if 語句

真值可合併,先來看看真值可用來做什麼。請嘗試執行下面的指令碼:

name = input('What is your name? ') 
if name.endswith('Gumby'): 
 print('Hello,Mr. Gumby') 

這就是if語句,讓你能夠有條件地執行程式碼。這意味著如果條件(if和冒號之間的表示式)為前面定義的真,就執行後續程式碼塊(這裡是一條print語句);如果條件為假,就不執行。

3)else 子句

在前一節的示例中,如果你輸入以Gumby結尾的名字,方法name.endswith將返回True,導致後續程式碼塊執行——列印問候語。如果你願意,可使用else子句增加一種選擇(之所以叫子句是因為else不是獨立的語句,而是if語句的一部分)。

name = input('What is your name?') 
if name.endswith('Gumby'): 
 print('Hello,Mr. Gumby') 
else: 
 print('Hello,stranger') 

在這裡,如果沒有執行第一個程式碼塊(因為條件為假),將進入第二個程式碼塊。

還有一個與if語句很像的“親戚”,它就是條件表示式——C語言中三目運算子的Python版本。下面的表示式使用if和else確定其值:

status = "friend" if name.endswith("Gumby") else "stranger"

如果條件(緊跟在if後面)為真,表示式的結果為提供的第一個值(這裡為"friend"),否則為第二個值(這裡為"stranger")。

4)elif 子句

要檢查多個條件,可使用elif。elif是else if的縮寫,由一個if子句和一個else子句組合而成,也就是包含條件的else子句。

num = int(input('Enter a number: ')) 
ifnum > 0: 
 print('The number is positive') 
elifnum < 0: 
 print('The number is negative') 
else: 
 print('The number is zero') 

5)程式碼塊巢狀

你可將if語句放在其他if語句塊中,如下所示:

name = input('What is your name? ') 
if name.endswith('Gumby'): 
   if name.startswith('Mr.'): 
     print('Hello,Mr. Gumby') 
   elif name.startswith('Mrs.'): 
     print('Hello,Mrs. Gumby') 
   else: 
     print('Hello,Gumby') 
else: 
   print('Hello,stranger') 

在這裡,如果名字以Gumby結尾,就同時檢查名字開頭,這是在第一個程式碼塊中使用一條獨立的if語句完成的。請注意,這裡還使用了elif。最後一個分支(else子句)沒有指定條件——如果沒有選擇其他分支,就選擇最後一個分支。如果需要,這裡的兩個else子句都可省略。如果省略裡面的else子句,將忽略並非以Mr.或Mrs.打頭的名字(假設名字為Gumby)。如果省略外面的else子句,將忽略陌生人。

6)更復雜的條件

1. 比較運算子

在條件表示式中,最基本的運算子可能是比較運算子,它們用於執行比較。

python不相等的兩個字串的 if 條件判斷為True詳解

從理論上說,可使用<和<=等運算子比較任意兩個物件x和y的相對大小,並獲得一個真值,但這種比較僅在x和y的型別相同或相近時(如兩個整數或一個整數和一個浮點數)才有意義。

將整數與字串相加毫無意義,檢查一個整數是否小於一個字串也是一樣。

與賦值一樣,Python也支援鏈式比較:可同時使用多個比較運算子,如0 < age < 100。有些比較運算子需要特別注意

相等運算子

要確定兩個物件是否相等,可使用比較運算子,用兩個等號(==)表示。

>>> "foo" == "foo" 
True 
>>> "foo" == "bar" 
False 

兩個等號?為何不像數學中那樣使用一個等號呢?但這裡還是試試一個等號吧。

>>> "foo" = "foo"
SyntaxError: can't assign to literal

一個等號是賦值運算子,用於修改值,而進行比較時你可不想這樣做。

is:相同運算子

這個運算子很有趣,其作用看似與==一樣,但實際上並非如此。

>>> x = y = [1,2,3] 
>>> z = [1,3] 
>>> x == y 
True 
>>> x == z 
True 
>>> x is y 
True 
>>> x is z 
False

在前幾個示例中,看不出什麼問題,但最後一個示例的結果很奇怪:x和z相等,但x is z的結果卻為False。為何會這樣呢?因為is檢查兩個物件是否相同(而不是相等)。變數x和y指向同一個列表,而z指向另一個列表(其中包含的值以及這些值的排列順序都與前一個列表相同)。這兩個列表雖然相等,但並非同一個物件。這好像不可理喻?請看下面的示例:

>>> x = [1,3] 
>>> y = [2,4] 
>>> x is not y 
True 
>>> del x[2] 
>>> y[1] = 1 
>>> y.reverse() 

在這個示例中,我首先建立了兩個不同的列表x和y。如你所見,x is not y(與x is y相反)的結果為True,接下來,我稍微修改了這兩個列表,現在它們雖然相等,但依然是兩個不同的列表。

>>> x == y 
True 
>>> x is y 
False 

顯然,這兩個列表相等但不相同。

總之,==用來檢查兩個物件是否相等,而is用來檢查兩個物件是否相同(是同一個物件)。

不要將is用於數和字串等不可變的基本值。鑑於Python在內部處理這些物件的方式,這樣做的結果是不可預測的。

in:成員資格運算子

與其他比較運算子一樣,它也可用於條件表示式中。

name = input('What is your name?') 
if 's' in name: 
 print('Your name contains the letter "s".') 
else: 
 print('Your name does not contain the letter "s".') 

字串和序列的比較

字串是根據字元的字母排列順序進行比較的。

>>> "alpha" < "beta"
True

雖然基於的是字母排列順序,但字母都是Unicode字元,它們是按碼點排列的。

實際上,字元是根據順序值排列的。要獲悉字母的順序值,可使用函式ord。這個函式的作用與函式chr相反。

這種方法既合理又一致,但可能與你排序的方式相反。例如,涉及大寫字母時,排列順序就可能與你想要的不同。

>>> "a" < "B"
False

一個訣竅是忽略大小寫。為此可使用字串方法lower,如下所示:

>>> "a".lower() < "B".lower() 
True 
>>> 'FnOrD'.lower() == 'Fnord'.lower() 
True 

其他序列的比較方式與此相同,但這些序列包含的元素可能不是字元,而是其他型別的值。

>>> [1,2] < [2,1]
True


如果序列的元素為其他序列,將根據同樣的規則對這些元素進行比較。

>>> [2,[1,4]] < [2,5]]
True

2. 布林運算子

至此,你已見過很多返回真值的表示式(實際上,考慮到所有值都可解釋為真值,因此所有的表示式都返回真值),但你可能需要檢查多個條件。例如,假設你要編寫一個程式,讓它讀取一個數,並檢查這個數是否位於1~10(含)。為此,可像下面這樣做:

number = int(input('Enter a number between 1 and 10: ')) 
if number <= 10: 

   if number >= 1: 
     print('Great!') 
   else: 
     print('Wrong!') 
else: 
   print('Wrong!')

這可行,但有點笨拙,因為輸入了print('Wrong!')兩次。重複勞動可不是好事,那麼該如何辦呢?很簡單。

number = int(input('Enter a number between 1 and 10: ')) 
if number <= 10 and number >= 1: 
  print('Great!') 
else: 
  print('Wrong!') 

通過使用鏈式比較1 <= number <= 10可進一步簡化這個示例。

運算子and是一個布林運算子。它接受兩個真值,並在這兩個值都為真時返回真,否則返回假。還有另外兩個布林運算子:or和not。通過使用這三個運算子,能以任何方式組合真值。

if ((cash > price) or customer_has_good_credit) and not out_of_stock:
give_goods()

短路邏輯和條件表示式

布林運算子有個有趣的特徵:只做必要的計算。例如,僅當x和y都為真時,表示式x and y才為真。因此如果x為假,這個表示式將立即返回假,而不關心y。實際上,如果x為假,這個表示式將返回x,否則返回y。這種行為稱為短路邏輯(或者延遲求值):布林運算子常被稱為邏輯運算子,在有些情況下將“繞過”第二個值。對於運算子or,情況亦如此。在表示式x or y中,如果x為真,就返回x,否則返回y。請注意,這意味著位於布林運算子後面的程式碼(如函式呼叫)可能根本不會執行。像下面這樣的程式碼就利用了這種行為:

name = input('Please enter your name: ') or '<unknown>'

如果沒有輸入名字,上述or表示式的結果將為'<unknown>'。在很多情況下,寧願使用條件表示式,而不耍這樣的短路花樣。

以上這篇python不相等的兩個字串的 if 條件判斷為True詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。