在 Python 中使用“and”布爾運(yùn)算符(在線(xiàn)翻譯器)
目錄

在 Python 中使用布爾邏輯
Python 和運(yùn)算符入門(mén)
在布爾表達(dá)式中使用 Python 和運(yùn)算符
短路評(píng)估
對(duì)通用對(duì)象使用 Python 和運(yùn)算符
混合布爾表達(dá)式和對(duì)象
組合 Python 邏輯運(yùn)算符
在布爾上下文中使用 Python 和運(yùn)算符
if 語(yǔ)句
while 循環(huán)
在非布爾上下文中使用 Python 和運(yùn)算符
將 Python 和 Operator 付諸行動(dòng)
扁平化嵌套 if 語(yǔ)句
檢查數(shù)值范圍
有條件地鏈接函數(shù)調(diào)用
結(jié)論
Python中有三個(gè)布爾運(yùn)算符或邏輯運(yùn)算符:and,or,和not。在決定程序?qū)⒆裱膱?zhí)行路徑之前,您可以使用它們來(lái)檢查是否滿(mǎn)足某些條件。在本教程中,您將了解and運(yùn)算符以及如何在代碼中使用它。
在本教程中,您將學(xué)習(xí)如何:
理解Python操作符背后的邏輯and
構(gòu)建和理解使用運(yùn)算符的布爾和非布爾表達(dá)式and
and在布爾上下文中使用運(yùn)算符來(lái)決定程序的操作過(guò)程
and在非布爾上下文中使用運(yùn)算符使您的代碼更簡(jiǎn)潔
您還將編寫(xiě)一些實(shí)際示例,這些示例將幫助您了解如何使用and運(yùn)算符以Pythonic 的方式處理不同的問(wèn)題。即使您沒(méi)有使用 的所有功能and,了解它們也能讓您編寫(xiě)更好、更準(zhǔn)確的代碼。
在 Python 中使用布爾邏輯
早在 1854 年,George Boole 就撰寫(xiě)了The Laws of Thought,其中包含所謂的布爾代數(shù)。該代數(shù)依賴(lài)于兩個(gè)值:true和false。它還定義了一組布爾操作的,也被稱(chēng)為邏輯運(yùn)算,由通用運(yùn)算符表示AND,OR,和NOT。
這些布爾值和運(yùn)算符在編程中非常有用。例如,您可以使用運(yùn)算符構(gòu)造任意復(fù)雜的布爾表達(dá)式,并確定它們的結(jié)果真值是真還是假。您可以使用布爾表達(dá)式的真值來(lái)決定程序的動(dòng)作過(guò)程。
在 Python 中,Boolean 類(lèi)型?bool是 的子類(lèi),int可以采用值Trueor?False:
>>>
>>> issubclass(bool, int) True >>> help(bool) Help on class bool in module builtins: class bool(int) ... >>> type(True)
正如您在這段代碼中看到的那樣,Python 實(shí)現(xiàn)bool為int具有兩個(gè)可能值的子類(lèi),True以及False。這些值是Python中的內(nèi)置常量。他們?cè)趦?nèi)部為整數(shù)來(lái)實(shí)現(xiàn)的數(shù)字與值1的True和0為False。請(qǐng)注意,True和 都False必須大寫(xiě)。
除了bool類(lèi)型之外,Python 還提供了三個(gè)布爾運(yùn)算符或邏輯運(yùn)算符,允許您將布爾表達(dá)式和對(duì)象組合成更復(fù)雜的表達(dá)式。這些運(yùn)算符如下:
使用這些運(yùn)算符,您可以連接多個(gè)布爾表達(dá)式和對(duì)象來(lái)構(gòu)建您自己的表達(dá)式。與其他語(yǔ)言不同,Python 使用英文單詞來(lái)表示布爾運(yùn)算符。這些詞是語(yǔ)言的關(guān)鍵字,因此您不能將它們用作標(biāo)識(shí)符。
在本教程中,您將了解 Python 的and運(yùn)算符。該運(yùn)算符實(shí)現(xiàn)邏輯AND運(yùn)算。您將了解它的工作原理以及如何在布爾或非布爾上下文中使用它。
Pythonand運(yùn)算符入門(mén)
Python 的and運(yùn)算符接受兩個(gè)操作數(shù),它們可以是布爾表達(dá)式、對(duì)象或組合。使用這些操作數(shù),and運(yùn)算符可以構(gòu)建更復(fù)雜的表達(dá)式。and表達(dá)式中的操作數(shù)通常稱(chēng)為條件。如果兩個(gè)條件都為真,則and表達(dá)式返回真結(jié)果。否則,它返回一個(gè)錯(cuò)誤的結(jié)果:
>>>
>>> True and True True >>> False and False False >>> True and False False >>> False and True False
這些示例表明,and表達(dá)式僅True在表達(dá)式中的兩個(gè)操作數(shù)都為真時(shí)才返回。由于and運(yùn)算符需要兩個(gè)操作數(shù)來(lái)構(gòu)建表達(dá)式,因此它是一個(gè)二元運(yùn)算符。
上面的快速示例顯示了所謂的and運(yùn)算符真值表:
此表總結(jié)了布爾表達(dá)式(如 )的結(jié)果真值operand1 and operand2。表達(dá)式的結(jié)果取決于其操作數(shù)的真值。如果兩者都是真的,那就是真的。否則就是假的。這是and操作符背后的一般邏輯。但是,此運(yùn)算符可以做的比 Python 中的多。
在以下部分中,您將學(xué)習(xí)如何使用and不同類(lèi)型的操作數(shù)來(lái)構(gòu)建您自己的表達(dá)式。
and在布爾表達(dá)式中使用 Python 的運(yùn)算符
您通常會(huì)使用邏輯運(yùn)算符來(lái)構(gòu)建復(fù)合布爾表達(dá)式,它們是產(chǎn)生布爾值的變量和值的組合。換句話(huà)說(shuō),布爾表達(dá)式返回Trueor?False。
比較和相等測(cè)試是此類(lèi)表達(dá)式的常見(jiàn)示例:
>>>
>>> 5 == 3 + 2 True >>> 5 > 3 True >>> 5 < 3 False >>> 5 != 3 True >>> [5, 3] == [5, 3] True >>> "hi" == "hello" False
所有這些表達(dá)式都返回Trueor?False,這意味著它們是布爾表達(dá)式。您可以使用and關(guān)鍵字將它們組合起來(lái),以創(chuàng)建一次測(cè)試兩個(gè)或多個(gè)子表達(dá)式的復(fù)合表達(dá)式:
>>>
>>> 5 > 3 and 5 == 3 + 2 True >>> 5 < 3 and 5 == 5 False >>> 5 == 5 and 5 != 5 False >>> 5 < 3 and 5 != 5 False
在這里,當(dāng)您組合兩個(gè)True表達(dá)式時(shí),您會(huì)得到True結(jié)果。任何其他組合返回False。從這些示例中,您可以得出結(jié)論,使用and運(yùn)算符創(chuàng)建復(fù)合布爾表達(dá)式的語(yǔ)法如下:
expression1 and expression2
如果子表達(dá)式expression1和expression2計(jì)算結(jié)果都為T(mén)rue,則復(fù)合表達(dá)式為T(mén)rue。如果至少一個(gè)子表達(dá)式的計(jì)算False結(jié)果為 ,則結(jié)果為False。
and構(gòu)建復(fù)合表達(dá)式時(shí)可以使用的運(yùn)算符數(shù)量沒(méi)有限制。這意味著您可以使用多個(gè)and運(yùn)算符在單個(gè)表達(dá)式中組合兩個(gè)以上的子表達(dá)式:
>>>
>>> 5 > 3 and 5 == 3 + 2 and 5 != 3 True >>> 5 < 3 and 5 == 3 and 5 != 3 False
同樣,如果所有子表達(dá)式的計(jì)算結(jié)果都為T(mén)rue,那么您將得到True。否則,您將獲得False.?特別是當(dāng)表達(dá)式變長(zhǎng)時(shí),您應(yīng)該記住 Python 從左到右依次計(jì)算表達(dá)式。
短路評(píng)估
Python 的邏輯運(yùn)算符,例如andand?or,使用稱(chēng)為短路求值或惰性求值的東西。換句話(huà)說(shuō),Python僅在需要時(shí)評(píng)估右側(cè)的操作數(shù)。
為了確定and表達(dá)式的最終結(jié)果,Python 從評(píng)估左操作數(shù)開(kāi)始。如果為假,則整個(gè)表達(dá)式為假。在這種情況下,無(wú)需計(jì)算右側(cè)的操作數(shù)。Python 已經(jīng)知道最終結(jié)果。
左操作數(shù)為假會(huì)自動(dòng)使整個(gè)表達(dá)式為假。評(píng)估剩余的操作數(shù)會(huì)浪費(fèi) CPU 時(shí)間。Python 通過(guò)短路評(píng)估來(lái)防止這種情況。
相反,and運(yùn)算符僅在第一個(gè)操作數(shù)為真時(shí)才對(duì)右側(cè)的操作數(shù)求值。在這種情況下,最終結(jié)果取決于右操作數(shù)的真值。如果為真,則整個(gè)表達(dá)式為真。否則,表達(dá)式為假。
要演示短路功能,請(qǐng)查看以下示例:
>>>
>>> def true_func(): ... print("Running true_func()") ... return True ... >>> def false_func(): ... print("Running false_func()") ... return False ... >>> true_func() and false_func() # Case 1 Running true_func() Running false_func() False >>> false_func() and true_func() # Case 2 Running false_func() False >>> false_func() and false_func() # Case 3 Running false_func() False >>> true_func() and true_func() # Case 4 Running true_func() Running true_func() True
下面是這段代碼的工作原理:
情況 1:Python 求值true_func(),返回True.?為了確定最終結(jié)果,Python 計(jì)算false_func()并獲取False.?您可以通過(guò)查看兩個(gè)函數(shù)的輸出來(lái)確認(rèn)這一點(diǎn)。
情況 2:Python 求值false_func(),返回False。Python 已經(jīng)知道最終結(jié)果是False,所以它不會(huì)評(píng)估true_func()。
案例 3:Python 運(yùn)行false_func()并得到False結(jié)果。它不需要第二次評(píng)估重復(fù)函數(shù)。
案例 4:Python 求值true_func()并得到True結(jié)果。然后它再次評(píng)估該函數(shù)。由于兩個(gè)操作數(shù)都計(jì)算為T(mén)rue,因此最終結(jié)果為T(mén)rue。
Python 從左到右處理布爾表達(dá)式。當(dāng)它不再需要評(píng)估任何進(jìn)一步的操作數(shù)或子表達(dá)式來(lái)確定最終結(jié)果時(shí),它就會(huì)停止。總結(jié)這個(gè)概念,您應(yīng)該記住,如果and表達(dá)式中的左操作數(shù)為假,則不會(huì)計(jì)算右操作數(shù)。
短路評(píng)估會(huì)對(duì)代碼的性能產(chǎn)生重大影響。要利用這一點(diǎn),請(qǐng)?jiān)跇?gòu)建and表達(dá)式時(shí)考慮以下提示:
將耗時(shí)的表達(dá)式放在and關(guān)鍵字的右側(cè)。這樣,如果短路規(guī)則生效,代價(jià)高的表達(dá)式就不會(huì)運(yùn)行。
將更可能為假的表達(dá)式放在and關(guān)鍵字的左側(cè)。這樣,Python 更有可能僅通過(guò)評(píng)估左操作數(shù)來(lái)確定整個(gè)表達(dá)式是否為假。
有時(shí)您可能希望避免在特定布爾表達(dá)式中進(jìn)行惰性求值。您可以通過(guò)使用按位運(yùn)算符(?&,?|,?~) 來(lái)實(shí)現(xiàn)。這些運(yùn)算符也適用于布爾表達(dá)式,但它們會(huì)急切地評(píng)估操作數(shù):
>>>
>>> def true_func(): ... print("Running true_func()") ... return True ... >>> def false_func(): ... print("Running false_func()") ... return False ... >>> # Use logical and >>> false_func() and true_func() Running false_func() False >>> # Use bitwise and >>> false_func() & true_func() Running false_func() Running true_func() False
在第一個(gè)表達(dá)式中,and運(yùn)算符按預(yù)期工作延遲。它計(jì)算第一個(gè)函數(shù),由于結(jié)果為假,它不計(jì)算第二個(gè)函數(shù)。然而,在第二個(gè)表達(dá)式中,&即使第一個(gè)函數(shù)返回,按位 AND 運(yùn)算符 (?) 也會(huì)急切地調(diào)用這兩個(gè)函數(shù)False。請(qǐng)注意,在這兩種情況下,最終結(jié)果都是False。
盡管此技巧有效,但通常不鼓勵(lì)使用。您應(yīng)該使用按位運(yùn)算符來(lái)操作位,使用布爾運(yùn)算符來(lái)處理布爾值和表達(dá)式。要更深入地了解按位運(yùn)算符,請(qǐng)查看Python 中的按位運(yùn)算符。
and對(duì)通用對(duì)象使用 Python 的運(yùn)算符
您可以使用and運(yùn)算符將兩個(gè) Python 對(duì)象組合到一個(gè)表達(dá)式中。在這種情況下,Python 在內(nèi)部使用bool()來(lái)確定操作數(shù)的真值。因此,您將獲得特定對(duì)象而不是布爾值。你只得到True或者False如果給定的操作數(shù)顯式計(jì)算結(jié)果為T(mén)rue或False:
>>>
>>> 2 and 3 3 >>> 5 and 0.0 0.0 >>> [] and 3 [] >>> 0 and {} 0 >>> False and "" False
在這些示例中,and如果計(jì)算結(jié)果為,則表達(dá)式返回左側(cè)的操作數(shù)False。否則,它返回右邊的操作數(shù)。為了產(chǎn)生這些結(jié)果,and運(yùn)算符使用 Python 的內(nèi)部規(guī)則來(lái)確定對(duì)象的真值。Python 文檔說(shuō)明了這些規(guī)則,如下所示:
默認(rèn)情況下,一個(gè)對(duì)象被認(rèn)為是真,除非它的類(lèi)定義了一個(gè)__bool__()返回False的__len__()方法或一個(gè)返回零的方法,當(dāng)與對(duì)象一起調(diào)用時(shí)。以下是大多數(shù)被認(rèn)為是 false 的內(nèi)置對(duì)象:
常量定義為 false:None和False.
任何數(shù)字類(lèi)型的零:0,?0.0,?0j,?Decimal(0),Fraction(0, 1)
空序列和集合:'',?(),?[],?{},?set(),range(0)
(來(lái)源)
考慮到這些規(guī)則,再次查看上面的代碼。在第一個(gè)示例中,整數(shù)2為真(非零),因此and返回正確的操作數(shù)3。在第二個(gè)示例中,5為真,因此and即使計(jì)算結(jié)果為 ,也會(huì)返回正確的操作數(shù)False。
下一個(gè)示例使用空列表 (?[]) 作為左操作數(shù)。由于空列表的計(jì)算結(jié)果為 false,因此該and表達(dá)式返回空列表。獲得True或的唯一情況False是在表達(dá)式中顯式使用布爾對(duì)象。
注意:如果您需要獲取True或False來(lái)自and涉及公共對(duì)象而不是布爾表達(dá)式的表達(dá)式,則可以使用bool().?此內(nèi)置函數(shù)顯式返回True或False取決于您作為參數(shù)提供的特定對(duì)象的真值。
以下是and當(dāng)您將運(yùn)算符與常見(jiàn) Python 對(duì)象而不是布爾表達(dá)式一起使用時(shí),您可以如何總結(jié)該運(yùn)算符的行為。請(qǐng)注意,Python 使用每個(gè)對(duì)象的真值來(lái)確定最終結(jié)果:
通常,如果and表達(dá)式中的操作數(shù)是對(duì)象而不是布爾表達(dá)式,則運(yùn)算符會(huì)在其計(jì)算結(jié)果為 時(shí)返回左側(cè)的對(duì)象False。否則,它會(huì)返回右側(cè)的對(duì)象,即使它的計(jì)算結(jié)果為False。
混合布爾表達(dá)式和對(duì)象
您還可以在and表達(dá)式中組合布爾表達(dá)式和常見(jiàn)的 Python 對(duì)象。在這種情況下,如果and表達(dá)式為假,則表達(dá)式仍返回左操作數(shù),否則返回右操作數(shù)。返回值可以是True、False或常規(guī)對(duì)象,具體取決于表達(dá)式的哪一部分提供該結(jié)果:
>>>
>>> 2 < 4 and 2 2 >>> 2 and 2 < 4 True >>> 2 < 4 and [] [] >>> [] and 2 < 4 [] >>> 5 > 10 and {} False >>> {} and 5 > 10 {} >>> 5 > 10 and 4 False >>> 4 and 5 > 10 False
這些示例使用布爾表達(dá)式和常見(jiàn)對(duì)象的組合。在每對(duì)示例中,您會(huì)看到可以獲取非布爾對(duì)象或布爾值,True或False.?結(jié)果將取決于表達(dá)式的哪一部分提供了最終結(jié)果。
下表總結(jié)了and組合布爾表達(dá)式和常見(jiàn) Python 對(duì)象時(shí)運(yùn)算符的行為:
為了找出返回的內(nèi)容,Python 計(jì)算左側(cè)的布爾表達(dá)式以獲取其布爾值(True或False)。然后 Python 使用其內(nèi)部規(guī)則來(lái)確定右側(cè)對(duì)象的真值。
作為測(cè)試您理解的練習(xí),您可以嘗試通過(guò)將第三列中的操作數(shù)的順序交換為 來(lái)重寫(xiě)此表object and expression。嘗試預(yù)測(cè)每行將返回什么。
組合 Python 邏輯運(yùn)算符
正如您在本教程前面看到的,Python 提供了兩個(gè)額外的邏輯運(yùn)算符:or運(yùn)算符和not運(yùn)算符。您可以將它們與and運(yùn)算符一起使用來(lái)創(chuàng)建更復(fù)雜的復(fù)合表達(dá)式。如果要使用多個(gè)邏輯運(yùn)算符做出準(zhǔn)確清晰的表達(dá)式,則需要考慮每個(gè)運(yùn)算符的優(yōu)先級(jí)。換句話(huà)說(shuō),您需要考慮 Python 執(zhí)行它們的順序。
與其他運(yùn)算符相比,Python 的邏輯運(yùn)算符的優(yōu)先級(jí)較低。但是,有時(shí)使用一對(duì)括號(hào) (?()) 來(lái)確保一致且可讀的結(jié)果是有益的:
>>>
>>> 5 or 2 and 2 > 1 5 >>> (5 or 3) and 2 > 1 True
這些示例將or運(yùn)算符和and運(yùn)算符組合在一個(gè)復(fù)合表達(dá)式中。就像and運(yùn)算符一樣,運(yùn)算or符使用短路評(píng)估。and然而,與 不同的是,or一旦找到真正的操作數(shù),運(yùn)算符就會(huì)停止。您可以在第一個(gè)示例中看到這一點(diǎn)。由于5為真,or子表達(dá)式立即返回5而不計(jì)算表達(dá)式的其余部分。
相比之下,如果將or子表達(dá)式括在一對(duì)括號(hào)中,則它可以作為單個(gè)真操作數(shù)工作,并且2 > 1也會(huì)被評(píng)估。最終結(jié)果是True。
要點(diǎn)是,如果您在單個(gè)表達(dá)式中使用多個(gè)邏輯運(yùn)算符,那么您應(yīng)該考慮使用括號(hào)來(lái)明確您的意圖。這個(gè)技巧還將幫助您獲得正確的邏輯結(jié)果。
and在布爾上下文中使用 Python 的運(yùn)算符
像所有 Python 的布爾運(yùn)算符一樣,and運(yùn)算符在布爾上下文中特別有用。您可以在布爾上下文中找到布爾運(yùn)算符的大多數(shù)實(shí)際用例。
兩個(gè)主要結(jié)構(gòu)在 Python 中定義了布爾上下文:
if語(yǔ)句讓您執(zhí)行條件執(zhí)行并根據(jù)某些初始條件的結(jié)果采取不同的行動(dòng)方案。
while循環(huán)允許您執(zhí)行條件迭代并在給定條件為真時(shí)運(yùn)行重復(fù)性任務(wù)。
這兩個(gè)結(jié)構(gòu)是您所謂的控制流語(yǔ)句的一部分。它們幫助您決定程序的執(zhí)行路徑。
您可以使用 Python 的and運(yùn)算符在if語(yǔ)句和while循環(huán)中構(gòu)造復(fù)合布爾表達(dá)式。
if?聲明
布爾表達(dá)式通常被稱(chēng)為條件,因?yàn)樗鼈兺ǔR馕吨枰獫M(mǎn)足給定的要求。它們?cè)跅l件語(yǔ)句的上下文中非常有用。在 Python 中,這種類(lèi)型的語(yǔ)句以if關(guān)鍵字開(kāi)頭并以條件結(jié)尾。條件語(yǔ)句還可以包含elifandelse子句。
Python 條件語(yǔ)句遵循英語(yǔ)語(yǔ)法中的條件邏輯。如果條件為真,則if執(zhí)行代碼塊。否則,執(zhí)行跳轉(zhuǎn)到不同的代碼塊:
>>>
>>> a = -8 >>> if a < 0: ... print("a is negative") ... elif a > 0: ... print("a is positive") ... else: ... print("a is equal to 0") ... a is negative
由于a持有負(fù)數(shù),條件a < 0為真。該if代碼塊中運(yùn)行,而你得到的消息a is negative?印在屏幕上。a但是,如果將 的值更改為正數(shù),則elif塊會(huì)運(yùn)行并且 Python 會(huì)打印a is positive.?最后,如果您設(shè)置a為零,則else代碼塊將執(zhí)行。繼續(xù)玩,a看看會(huì)發(fā)生什么!
現(xiàn)在假設(shè)您要確保在運(yùn)行某段代碼之前滿(mǎn)足兩個(gè)條件——這意味著它們都為真。要嘗試此操作,假設(shè)您需要獲取運(yùn)行腳本的用戶(hù)的年齡,處理該信息,并向用戶(hù)顯示他們當(dāng)前的生命階段。
啟動(dòng)您最喜歡的代碼編輯器或 IDE并創(chuàng)建以下腳本:
# age.py age = int(input("Enter your age: ")) if age >= 0 and age <= 9: print("You are a child!") elif age > 9 and age <= 18: print("You are an adolescent!") elif age > 18 and age <= 65: print("You are an adult!") elif age > 65: print("Golden ages!")
在這里,您使用用戶(hù)的年齡input(),然后使用將其轉(zhuǎn)換為整數(shù)int()。該if子句檢查是否age大于或等于0。在同一個(gè)子句中,它檢查是否age小于或等于9。為此,您需要構(gòu)建一個(gè)and復(fù)合布爾表達(dá)式。
這三個(gè)elif子句檢查其他時(shí)間間隔以確定與用戶(hù)年齡相關(guān)的生命階段。
如果您從命令行運(yùn)行此腳本,則會(huì)得到如下內(nèi)容:
$ python age.py Enter your age: 25 You are an adult!
根據(jù)您在命令行中輸入的年齡,腳本會(huì)采取一種或另一種行動(dòng)。在此特定示例中,您提供 25 歲的年齡,并將消息You are an adult!打印到您的屏幕上。
while?循環(huán)
的while環(huán)是可使用的第二構(gòu)建and表達(dá)式來(lái)控制程序的執(zhí)行流程。通過(guò)and在while語(yǔ)句頭中使用運(yùn)算符,您可以測(cè)試多個(gè)條件并在滿(mǎn)足所有條件時(shí)重復(fù)循環(huán)的代碼塊。
假設(shè)您正在為制造商設(shè)計(jì)控制系統(tǒng)的原型。該系統(tǒng)有一個(gè)關(guān)鍵機(jī)制,應(yīng)在 500 psi 或更低的壓力下工作。如果壓力超過(guò) 500 psi 而保持在 700 psi 以下,則系統(tǒng)必須運(yùn)行一系列給定的標(biāo)準(zhǔn)安全操作。對(duì)于大于 700 psi 的壓力,系統(tǒng)必須運(yùn)行一套全新的安全措施。
要解決此問(wèn)題,您可以使用while帶有and表達(dá)式的循環(huán)。這是一個(gè)模擬可能解決方案的腳本:
1# pressure.py 2 3from time import sleep 4from random import randint 5 6def control_pressure(): 7 pressure = measure_pressure() 8 while True: 9 if pressure <= 500: 10 break 11 12 while pressure > 500 and pressure <= 700: 13 run_standard_safeties() 14 pressure = measure_pressure() 15 16 while pressure > 700: 17 run_critical_safeties() 18 pressure = measure_pressure() 19 20 print("Wow! The system is safe...") 21 22def measure_pressure(): 23 pressure = randint(490, 800) 24 print(f"psi={pressure}", end="; ") 25 return pressure 26 27def run_standard_safeties(): 28 print("Running standard safeties...") 29 sleep(0.2) 30 31def run_critical_safeties(): 32 print("Running critical safeties...") 33 sleep(0.7) 34 35if __name__ == "__main__": 36 control_pressure()
在 中control_pressure(),您while在第 8 行創(chuàng)建一個(gè)無(wú)限循環(huán)。如果系統(tǒng)穩(wěn)定且壓力低于 500 psi,則條件語(yǔ)句跳出循環(huán),程序結(jié)束。
在第 12 行,第一個(gè)嵌套while循環(huán)運(yùn)行標(biāo)準(zhǔn)安全操作,而系統(tǒng)壓力保持在 500 psi 和 700 psi 之間。在每次迭代中,循環(huán)都會(huì)獲得一個(gè)新的壓力測(cè)量值,以便在下一次迭代中再次測(cè)試條件。如果壓力超過(guò) 700 psi,則第 16 行上的第二個(gè)回路將運(yùn)行關(guān)鍵安全操作。
注意:上例中的實(shí)現(xiàn)control_pressure()旨在展示and操作符如何在while循環(huán)上下文中工作。
但是,這不是您可以編寫(xiě)的最有效的實(shí)現(xiàn)。您可以重構(gòu)control_pressure()以使用單個(gè)循環(huán)而不使用and:
def control_pressure(): while True: pressure = measure_pressure() if pressure > 700: run_critical_safeties() elif 500 < pressure <= 700: run_standard_safeties() elif pressure <= 500: break print("Wow! The system is safe...")
在這個(gè)替代實(shí)現(xiàn)中and,您使用鏈?zhǔn)奖磉_(dá)式而不是 using?,500 < pressure <= 700它的作用相同,pressure > 500 and pressure <= 700但更干凈,更 Pythonic。另一個(gè)優(yōu)點(diǎn)是您measure_pressure()只調(diào)用一次,這最終會(huì)更有效率。
要運(yùn)行此腳本,請(qǐng)打開(kāi)命令行并輸入以下命令:
$ python pressure.py psi=756; Running critical safeties... psi=574; Running standard safeties... psi=723; Running critical safeties... psi=552; Running standard safeties... psi=500; Wow! The system is safe...
屏幕上的輸出應(yīng)該與此示例輸出略有不同,但您仍然可以了解應(yīng)用程序的工作原理。
and在非布爾上下文中使用 Python 的運(yùn)算符
這個(gè)事實(shí)and可以返回對(duì)象除了剛才True和False是一個(gè)有趣的功能。例如,此功能允許您使用and運(yùn)算符進(jìn)行條件執(zhí)行。假設(shè)您需要更新一個(gè)flag變量,如果給定列表中的第一項(xiàng)等于某個(gè)預(yù)期值。對(duì)于這種情況,您可以使用條件語(yǔ)句:
>>>
>>> a_list = ["expected value", "other value"] >>> flag = False >>> if len(a_list) > 0 and a_list[0] == "expected value": ... flag = True ... >>> flag True
在這里,條件檢查列表是否至少有一項(xiàng)。如果是,則檢查列表中的第一項(xiàng)是否等于"expected value"字符串。如果兩項(xiàng)檢查都通過(guò),flag則更改為T(mén)rue。您可以利用and運(yùn)算符來(lái)簡(jiǎn)化此代碼:
>>>
>>> a_list = ["expected value", "other value"] >>> flag = False >>> flag = len(a_list) > 0 and a_list[0] == "expected value" >>> flag True
在此示例中,突出顯示的行完成了所有工作。它檢查兩個(gè)條件并一次性完成相應(yīng)的分配。此表達(dá)式and從if您在前一個(gè)示例中使用的語(yǔ)句中取出運(yùn)算符,這意味著您不再在布爾上下文中工作。
上面示例中的代碼比您之前看到的等效條件語(yǔ)句更簡(jiǎn)潔,但可讀性較差。要正確理解此表達(dá)式,您需要了解and運(yùn)算符內(nèi)部的工作方式。
將 Python 的and運(yùn)算符付諸實(shí)踐
到目前為止,您已經(jīng)學(xué)習(xí)了如何使用 Python 的and運(yùn)算符來(lái)創(chuàng)建復(fù)合布爾表達(dá)式和非布爾表達(dá)式。您還學(xué)習(xí)了如何在if語(yǔ)句和while循環(huán)等布爾上下文中使用此邏輯運(yùn)算符。
在本節(jié)中,您將構(gòu)建一些實(shí)際示例,以幫助您決定何時(shí)使用and運(yùn)算符。通過(guò)這些示例,您將學(xué)習(xí)如何利用and編寫(xiě)更好、更多 Pythonic 的代碼。
扁平化嵌套if語(yǔ)句
Python之禪的一項(xiàng)原則指出“扁平優(yōu)于嵌套”。例如,雖然具有兩級(jí)嵌套if語(yǔ)句的代碼是正常的并且完全沒(méi)問(wèn)題,但是當(dāng)您有兩級(jí)以上的嵌套時(shí),您的代碼確實(shí)開(kāi)始看起來(lái)混亂和復(fù)雜。
假設(shè)您需要測(cè)試給定的數(shù)字是否為正數(shù)。然后,一旦您確認(rèn)它是正數(shù),您就需要檢查該數(shù)字是否低于給定的正值。如果是,您可以使用手頭的數(shù)字進(jìn)行特定計(jì)算:
>>>
>>> number = 7 >>> if number > 0: ... if number < 10: ... # Do some calculation with number... ... print("Calculation done!") ... Calculation done!
涼爽的!這兩個(gè)嵌套if語(yǔ)句解決了您的問(wèn)題。您首先檢查數(shù)字是否為正,然后檢查它是否小于10。在這個(gè)小例子中,print()對(duì)你的特定計(jì)算的調(diào)用是一個(gè)占位符,只有當(dāng)兩個(gè)條件都為真時(shí)才會(huì)運(yùn)行。
即使代碼有效,通過(guò)刪除嵌套的if.?你怎么能這樣做?好吧,您可以使用and運(yùn)算符將兩個(gè)條件組合在一個(gè)復(fù)合條件中:
>>>
>>> number = 7 >>> if number > 0 and number < 10: ... # Do some calculation with number... ... print("Calculation done!") ... Calculation done!
像and運(yùn)算符這樣的邏輯運(yùn)算符通常提供一種通過(guò)刪除嵌套條件語(yǔ)句來(lái)改進(jìn)代碼的有效方法。盡可能利用它們。
在此特定示例中,您and將創(chuàng)建一個(gè)復(fù)合表達(dá)式,用于檢查數(shù)字是否在給定的范圍或區(qū)間內(nèi)。Python 通過(guò)鏈接表達(dá)式提供了一種更好的方法來(lái)執(zhí)行此檢查。例如,您可以將上面的條件寫(xiě)為0 < number < 10。這是下一節(jié)的主題。
檢查數(shù)值范圍
仔細(xì)查看下一節(jié)中的示例,您可以得出結(jié)論,Python 的and運(yùn)算符是檢查特定數(shù)值是否在給定區(qū)間或范圍內(nèi)的便捷工具。例如,以下表達(dá)式檢查數(shù)字x是否在0和之間10,包括兩個(gè):
>>>
>>> x = 5 >>> x >= 0 and x <= 10 True >>> x = 20 >>> x >= 0 and x <= 10 False
在第一個(gè)表達(dá)式中,and運(yùn)算符首先檢查是否x大于或等于0。由于條件為真,and運(yùn)算符檢查是否x小于或等于10。最終結(jié)果為真,因?yàn)榈诙€(gè)條件也為真。這意味著該數(shù)字在所需的間隔內(nèi)。
在第二個(gè)示例中,第一個(gè)條件為真,但第二個(gè)條件為假。一般結(jié)果為假,這意味著該數(shù)字不在目標(biāo)區(qū)間內(nèi)。
您可以將此邏輯包含在一個(gè)函數(shù)中并使其可重用:
>>>
>>> def is_between(number, start=0, end=10): ... return number >= start and number <= end ... >>> is_between(5) True >>> is_between(20) False >>> is_between(20, 10, 40) True
在此示例中,is_between()將number作為參數(shù)。它還需要start和end,它定義了目標(biāo)間隔。請(qǐng)注意,這些參數(shù)具有默認(rèn)參數(shù)值,這意味著它們是可選參數(shù)。
您的is_between()函數(shù)返回計(jì)算and表達(dá)式的結(jié)果,該表達(dá)式檢查是否number在start和之間end,包括兩者。
注意:無(wú)意中編寫(xiě)and總是返回的表達(dá)式False是一個(gè)常見(jiàn)的錯(cuò)誤。假設(shè)你要編寫(xiě)一個(gè)表達(dá)式之間排除值0,并10從給定的計(jì)算。
為了達(dá)到這個(gè)結(jié)果,你從兩個(gè)布爾表達(dá)式開(kāi)始:
number < 0
number > 10
以這兩個(gè)表達(dá)式為起點(diǎn),您可以考慮使用and將它們組合成一個(gè)復(fù)合表達(dá)式。但是,沒(méi)有任何數(shù)字同時(shí)小于0和大于10,因此您最終會(huì)遇到始終為假的情況:
>>>
>>> for number in range(-100, 100): ... included = number < 0 and number > 10 ... print(f"Is {number} included?", included) ... Is -100 included? False Is -99 included? False ... Is 0 included? False Is 1 included? False ... Is 98 included? False Is 99 included? False
在這種情況下,and處理手頭問(wèn)題的邏輯運(yùn)算符是錯(cuò)誤的。您應(yīng)該改用or運(yùn)算符。來(lái)試試看吧!
盡管使用and運(yùn)算符可以讓您優(yōu)雅地檢查一個(gè)數(shù)字是否在給定的間隔內(nèi),但還有一種更 Pythonic 的技術(shù)可以解決同樣的問(wèn)題。在數(shù)學(xué)中,你可以寫(xiě) 0 < x < 10 來(lái)表示 x 在 0 到 10 之間。
在大多數(shù)編程語(yǔ)言中,這個(gè)表達(dá)式?jīng)]有意義。然而,在 Python 中,這個(gè)表達(dá)式就像一個(gè)魅力:
>>>
>>> x = 5 >>> 0 < x < 10 True >>> x = 20 >>> 0 < x < 10 False
在不同的編程語(yǔ)言中,這個(gè)表達(dá)式會(huì)以求值開(kāi)始0 < x,這是真的。下一步是將真正的布爾值與 進(jìn)行比較10,這沒(méi)有多大意義,因此表達(dá)式失敗。在 Python 中,發(fā)生了一些不同的事情。
Python 在內(nèi)部將這種類(lèi)型的表達(dá)式重寫(xiě)為等效的and表達(dá)式,例如x > 0 and x < 10.?然后執(zhí)行實(shí)際評(píng)估。這就是為什么您在上面的示例中得到正確結(jié)果的原因。
就像您可以使用多個(gè)and運(yùn)算符鏈接多個(gè)子表達(dá)式一樣,您也可以在不顯式使用任何and運(yùn)算符的情況下鏈接它們:
>>>
>>> x = 5 >>> y = 15 >>> 0 < x < 10 < y < 20 >>> # Equivalent and expression >>> 0 < x and x < 10 and 10 < y and y < 20 True
您還可以使用此 Python 技巧來(lái)檢查多個(gè)值是否相等:
>>>
>>> x = 10 >>> y = 10 >>> z = 10 >>> x == y == z True >>> # Equivalent and expression >>> x == y and y == z True
鏈?zhǔn)奖容^表達(dá)式是一個(gè)很好的特性,您可以用多種方式編寫(xiě)它們。但是,您應(yīng)該小心。在某些情況下,最終的表達(dá)式可能難以閱讀和理解,尤其是對(duì)于來(lái)自無(wú)法使用此功能的語(yǔ)言的程序員而言。
有條件地鏈接函數(shù)調(diào)用
如果您曾經(jīng)在Unix 系統(tǒng)上使用過(guò)Bash,那么您可能知道這種構(gòu)造。這是一種方便的技術(shù),允許您在鏈中運(yùn)行多個(gè)命令。當(dāng)且僅當(dāng)前一個(gè)命令成功時(shí),每個(gè)命令才會(huì)運(yùn)行:command1 && command2
$ cd /not_a_dir && echo "Success" bash: cd: /not_a_dir: No such file or directory $ cd /home && echo "Success" Success
這些示例使用 Bash 的短路 AND 運(yùn)算符 (?&&) 使echo命令的執(zhí)行依賴(lài)于命令的成功cd。
由于 Pythonand也實(shí)現(xiàn)了惰性求值的思想,您可以用它來(lái)模擬這個(gè) Bash 技巧。例如,您可以在單個(gè)and表達(dá)式中鏈接一系列函數(shù)調(diào)用,如下所示:
func1() and func2() and func3() ... and funcN()
在這種情況下,Python 調(diào)用func1().?如果函數(shù)的返回值計(jì)算為真值,則 Python 調(diào)用func2(),依此類(lèi)推。如果其中一個(gè)函數(shù)返回 false 值,則 Python 將不會(huì)調(diào)用其余函數(shù)。
下面是一個(gè)使用一些pathlib函數(shù)來(lái)操作文本文件的示例:
>>>
>>> from pathlib import Path >>> file = Path("hello.txt") >>> file.touch() >>> # Use a regular if statement >>> if file.exists(): ... file.write_text("Hello!") ... file.read_text() ... 6 'Hello!' >>> # Use an and expression >>> file.exists() and file.write_text("Hello!") and file.read_text() 'Hello!'
好的!在一行代碼中,您無(wú)需if語(yǔ)句即可有條件地運(yùn)行三個(gè)函數(shù)。在這個(gè)特定示例中,唯一可見(jiàn)的區(qū)別是.write_text()返回它寫(xiě)入文件的字節(jié)數(shù)。交互式 shell 會(huì)自動(dòng)將該值顯示在屏幕上。請(qǐng)記住,當(dāng)您將代碼作為腳本運(yùn)行時(shí),這種差異是不可見(jiàn)的。
結(jié)論
Python 的and運(yùn)算符允許您構(gòu)建復(fù)合布爾表達(dá)式,您可以使用這些表達(dá)式來(lái)決定程序的操作過(guò)程。您可以使用and運(yùn)算符解決布爾或非布爾上下文中的多個(gè)問(wèn)題。了解如何and正確使用運(yùn)算符可以幫助您編寫(xiě)更多Pythonic代碼。
在本教程中,您學(xué)習(xí)了如何:
使用 Python 的and運(yùn)算符
使用 Python 的運(yùn)算符構(gòu)建布爾和非布爾表達(dá)式and
決定行動(dòng)方針使用你的程序的and操作在布爾上下文
and在非布爾上下文中使用運(yùn)算符使您的代碼更簡(jiǎn)潔
通過(guò)本教程中的實(shí)際示例可以幫助您大致了解如何使用and運(yùn)算符在 Python 代碼中做出決策。
Python 面向?qū)ο缶幊?/p>
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。