2012-05-30 65 views
0

我在用Python學習基本的布爾邏輯。我理解的平等,但運營商感到困惑時,AND和OR在拋出在例如下面的代碼看看:布爾邏輯的使用:和/或與真/假

people = 20 
cats = 30 
dogs = 15 

if people < cats: 
    print "too many cats! the world is doomed!" 

if people == cats or dogs == cats: 
    print "this is too hard" 

我明白了第一個if語句,以及爲什麼它打印。我不知道第二條if語句是如何評估的。我怎麼能改變它來打印該行?

感謝您的幫助!

+0

這意味着它的意思是:它打印如果「人==貓」或「狗==貓」。這兩種情況都不是現在的情況:「人」是20,「貓」是30,而20不等於30.「狗」是15,而15不等於30.我不明白這是怎麼回事這裏有什麼不明白的地方。 –

回答

5

and要求所有其在表達部分的評估,以True整個表達式是True

or是挑剔少得多,只要表達的任何部分的計算結果爲True整個表達式是True

在這種情況下,您可能會遇到短語的術語。這僅僅意味着我們只要確定其結果就會停止評估表達式。

所以對於一個and,我們可以因爲在這一點上,只要我們發現,計算結果爲False部分別老盯着表達的其餘表達不能計算爲True

同樣,在or,只要我們找到一個部分是True,我們知道整個表達式將是True,並且沒有理由看得更遠。

爲您發佈的代碼示例:

if people == cats or dogs == cats: 
    print "this is too hard" 

如果任何一個的這些,或者兩者的people == catsdogs == cats評估,以True,在if語句中的整個表達式將成爲True。由於它們都不是True,因此if語句中的表達式失敗,即False,並且不執行print語句。

最後,如果您想要打印要執行的語句,則必須確保將布爾表達式評估爲True。一種方法是將 dogs改爲30的值,因爲那麼dogs == cats將是True並且那將是 足以使整個表達式True並且獲得要執行的打印。

+0

感謝您的解釋。那麼,只有在if語句爲真時,語句纔會打印? –

+0

是的。另外請注意,在你的例子中,*這兩個語句都不是真的。 (20!= 30!= 15)使用你的值,你可以使用「if not(people == cats)或(dogs == cats)」來運行這條線:「......在這種形式下,你的if塊會只評估一個或兩個條件是否不符合。 – abought

+1

@VarunShetty是的,沒錯。 「if」確實有效,就像我們直覺地想到的那樣。也就是說,「如果是這種情況(即真的),那麼一些行動」。由於if中的布爾表達式的計算結果爲False,因此if語句的正文(在打印情況下)將不會執行。 – Levon

1

或測試兩個或一個語句是否爲真,並測試兩個語句是否都爲真。

1

if語句都以同樣的方式評估。

if something: 
    do_stuff 

如果something爲True,則do_stuff塊運行[1]。如果something不是True,則do_stuff塊不運行。兩個if語句之間的區別並不是那個「工作方式不同」,而是它們在something的不同版本上運行。

andor是採取真值並計算新真值的二元運算。就像在1 + 3中一樣,+是一個二進制操作,它取13的數字,併產生一個新的數字4a and b取兩個真值ab併產生一個新值。而且雖然我們可以有x + yx * y從數字xy產生不同的數據,我們可以有a and ba or b,從而產生不同的真值與真值ab

if聲明不關心這一點。它不需要知道我們如何得到它正在測試的真值,它將以任何方式完全相同。 andor是完全獨立的,它們只是組合真值來獲得新值的方法。


andor工作是如何根據談論的東西,可以是真或假,當我們在使用英語andor某些方面的直覺。

在聲明「如果正在下雨那麼我會得到一把雨傘」,「正在下雨」的部分是一個條件,可以是真或假,其餘的句子是說什麼如果這是真的發生。在英語中,我也可以說「如果它正在下雨我覺得像走路然後我會得到一把傘」;這有兩個單獨的條件:「正在下雨」和「我感覺像走路」這兩個單詞組合成一個條件,單詞。這句話意味着如果「下雨」和「我感覺走路」都是真的,我會拿傘的;如果天氣晴朗,我不認爲我需要一把雨傘,如果我開車,那麼我不在乎我的房子和車子之間受潮。

我還可以這樣說:「如果下雨我感覺就像走話,我會得到一個保護傘」。這句話意味着如果其中一個或兩個條件都成立,我就會得到一把傘。在這裏,我們可以猜測,如果下雨,我希望在今天晚些時候有一把雨傘,即使我不想走路,如果我想走路,我想要一把雨傘,以防在隨後的行程中下雨,即使現在不下雨。

瞭解編程真值和andor運營商的最佳方式是牢記英語andor的這種自然的理解。這爲您提供了一種快速瞭解涉及andor的簡單表達式的直觀方式。但在編程方式andor作品是正式的,所以我們可以正確地寫下他們是如何工作的,不管在正常的英語用法中有什麼不明確或特殊情況。

A and B爲真,如果A爲True,並且B爲True,否則爲假(它是False如果任AB爲False)。 A or B如果AB爲真(如果A爲False且B爲False,則爲False,否則爲True)。下面是顯示了這個表:

A | B | A and B 
------+-------+--------- 
True | True | True 
True | False | False 
False | True | False 
False | False | False 

    A | B | A or B 
------+-------+-------- 
True | True | True 
True | False | True 
False | True | True 
False | False | False 

[1]事實上,這個故事比這更復雜一些(因爲我的整個的答案是正確的)。 Python中的大多數布爾運算(包括if語句和運算符andor)不是基於確切的真值,而是基於「真值」。簡單地說,數字是0,空容器和字符串,特殊值None的行爲就好像它們是False,當您將它們給予期望真值的操作時,其他所有操作就好像它們是True一樣。我們有時會使用術語「truthy」或「falsey」來描述不一定是TrueFalse的值,但其行爲就好像它們一樣。

同樣地,從現有的生產新的真值,像andor操作不必返回TrueFalse,他們可能會回報你給了他們所要求的表,即「truthy」或「falsey」的值以上。

但是,如果有人讀這是在早期階段的學習與真值編程,我會強烈建議你忽略這一點,只是覺得自己是操縱TrueFalse,同樣不用擔心「短路評估」以及檢查事物的順序(如果只涉及真正的TrueFalse,或者甚至大部分時間使用其他值,則無關緊要)。一旦你掌握了基礎知識,就很容易理解這些概念。

+0

感謝您的答案本 - 非常有用的信息。 –