2017-07-25 30 views
2

我是新來的Python和我有一個問題關於使用如果內部語句while循環:蟒蛇:差的B/W多IFS和if-elif的,否則在一個while循環

的代碼是寫猜謎遊戲,直到您輸入的數字與生成的隨機整數相匹配。

示例代碼編寫如下:

import random 
answer=int(random.uniform(1,10)) 
number=int(input("guess:")) 
if number==answer: 
    print("correct!") 
while(number!=answer): 
    if number > answer: 
     print("smaller!") 
     number=int(input("guess again")) 
    if number < answer: 
     print("bigger!") 
     number=int(input("guess again")) 
    if number == answer: 
     print("bingo!!") 
     break 

和我得到的結果是:

的猜測:5小!再猜一次3更大!再猜一次4賓果!

,但是當我用如果 - elif的 - elif的如果 - elif的,否則 while循環,而不是多個if的,在第一個猜測的情況下是內部錯誤和隨後的猜測(ES)正確,最後賓果!沒有顯示,例如:

import random 
answer=int(random.uniform(1,10)) 
number=int(input("guess:")) 
if number==answer: 
    print("correct!") 
while(number!=answer): 
    if number > answer: 
     print("smaller!") 
     number=int(input("guess again")) 
    elif number < answer: 
     print("bigger!") 
     number=int(input("guess again")) 
    elif number == answer: 
     print("bingo!!") 
     break 

結果變成了:

的猜測:5小!再猜一次3

如圖所示,經過最後的正確猜測,代碼剛剛停止,並且「賓果!!」沒有顯示。

任何人都可以幫助我理解爲什麼在使用多個if和if-elif-else/elif while while循環時出現這種差異? 非常感謝!

補充:我意識到我的問題最終是,我每次輸入一個新值後number,從那裏的代碼將再次與新number運行,當我使用多個if的,這怎麼不同或者if-elif-else。

+0

你不能用',而(數量=答案!):',並期望測試'數== answer'裏面你循環 – PRMoureu

+0

我意識到,但在多個if的第一種情況下,結果按我的預期工作(即賓果顯示出來),我想知道爲什麼是這種情況.... – XYZ1007

回答

0

想象一下以下(第一方案):

  1. 你猜錯號碼(假設8代替5)的第一次。
  2. while進入循環,因爲number!=answer
  3. 你得到"smaller!"消息,提示再猜。現在你輸入5
  4. if number==answer:測試在同一個循環內完成。由於現在是True,因此顯示"bingo!!"
  5. while條件已經過測試,並且由於現在您的答案是正確的,因此不會再次輸入循環。
  6. 該程序退出。

現在第二個方案:

  1. 你猜錯號碼(假設8代替5)的第一次。
  2. while進入循環,因爲number!=answer
  3. 你得到"smaller!"消息,提示再猜。現在你輸入5
  4. elif number==answer:測試是而不是完成,因爲之前的if子句已經成功。沒有消息顯示。
  5. while條件已經過測試,並且由於現在您的答案是正確的,因此不會再次輸入循環。
  6. 該程序退出。
+0

因此,在第一種情況下,是這樣嗎? TRU e無論我猜了多少次並輸入了'number'的新值,if語句都會在while循環中進行檢查,這是while循環在第一次猜測出錯後首次進入while循環嗎? – XYZ1007

+0

我認爲我沒有得到的是,當我爲'number'輸入一個新值時,它將從代碼中的哪個位置再次運行?比如在第一種情況下,猜測8而不是5,所以在while循環中,它首先檢查**,如果**,條件匹配,所以提示'number'的新值,然後我猜對了這個新數字,它是,*因爲它們處於相同的縮進級別*,所以它將首先進入**秒,如果**,發現不匹配,則移動到**第三,如果**,找到匹配並執行,那麼它上移一個級別回到while循環條件並退出? – XYZ1007

2

簡單地說,如果先前的「if」(或「elif」)情況未執行,則「elif」(僅用於「else if」)纔會執行。如果你有一系列「if」語句(而不是「if」後面跟着一系列「elif」語句),將評估前者的所有條件(並且對於任何條件評估爲真的情況,對應的「if」的主體也將被評估);相反,一旦在「if」...「elif」鏈中找到一個真實案例,就不會考慮鏈中的附加條件。

當在循環(或任何地方,就此而言)中使用它時,您需要考慮您的預期行爲。成爲程序員的好習慣是問自己,「這怎麼會出錯?」。而且,作爲一種猜測的好方法,考慮「兩種情況都可能是真實的嗎?如果兩種情況都匹配,是否應該執行這兩種情況?」。另外請注意,在循環中,通過添加顯式的「continue」語句可以跳回循環的下一個循環,可以得到與「if ...」序列相同的「if ... elif」效果而不評估剩下的「如果」(或其他)陳述。

0

解決方案非常簡單。

在你的第一個例子(if的節點)中,你使用if後if,所以,當你問一個數字的猜測時,你會檢查下一個if。

例如:

從這個代碼:

while(number!=answer): 
    if number > answer: 
     print("smaller!") 
     number=int(input("guess again")) 
    if number < answer: 
     print("bigger!") 
     number=int(input("guess again")) 
    if number == answer: 
     print("bingo!!") 
     break 

如果您的號碼越大(第二如果)你鍵入正確的一個,你會檢查它的第三個如果。所以郵件將被打印。

另一方面,我們使用if/elif/else的第二個例子。

while(number!=answer): 
    if number > answer: 
     print("smaller!") 
     number=int(input("guess again")) 
    elif number < answer: 
     print("bigger!") 
     number=int(input("guess again")) 
    elif number == answer: 
     print("bingo!!") 
     break 

如果我們有電話號碼,以防1的例子,我們的猜測說一個比較大的數字,它不會檢查的第三個條件,因爲它是第一個if的條件。代碼將再次發生,並且在「賓果」情況下不會繼續。

試試這個,你會看到代碼是相同的。嘗試使用if/elif/else而不是if樹,因爲是在python中檢查事物的正確方法。

import random 
number=-1 
answer=int(random.uniform(1,10)) 
while(number!=answer): 
    number=int(input("guess:")) 
    if number > answer: 
     print("smaller!") 
     number=int(input("guess again")) 
    elif number < answer: 
     print("bigger!") 
     number=int(input("guess again")) 
    elif number == answer: 
     print("bingo!!") 
     break 
+0

如果我理解正確,在第一種情況下,無論我猜到了多少次並輸入了新的「number」值,if語句都會在同一個while循環下進行檢查,這是while循環的第一個while循環猜錯了。每次輸入一個新號碼,它都會檢查所有三個if是否從上到下輸入如果滿足? – XYZ1007

+0

在第二種情況下,每當輸入一個新的「號碼」時,while條件將被檢查?如果仍然是數字!=答案,它根據條件確定if或第一個elif內的內容,但是如果number == answer,則執行while循環的條件不再是TRUE,因此直接退出循環? – XYZ1007

+0

對於第一種情況的另一個問題:說答案= 5,並且第一次我猜數字= 8,那麼它將滿足* first *如果並且在第一個if條件中做什麼。然後說我猜數字= 5,這個新的數字,如果所有的條件檢查之前,它達到最後一個條件?它會從第一個條件再次開始嗎?或者它會從停止的地方開始,然後檢查第二個條件是否是第一個? – XYZ1007

0

此行爲不同

if condition1: -> checks 
    do1 -> executes if condition1 is true 
if condition2: -> checks too in any case!! 
    do2 -> executes if condition2 is true 

比這

if condition1: -> checks 
    do1 -> executes if condition1 is true 
elif condition2: -> checks only if condition1 is false!! 
    do2 -> executes if condition1 is false and condition2 is true!!