2017-06-21 170 views
-2

請參閱我今天開始學習Python,並且陷入了一種情況。 我正在解決一個非常簡單的問題,我完成了它,但有一個問題。Python:for循環中的錯誤

首先,讓我告訴問題和約束。這裏的問題是:

給定一個整數,n,請執行以下條件操作:

  1. 如果nodd,打印Weird
  2. 如果neven和在2 to 5包容範圍內,打印Not Weird
  3. 如果neven和在6 to 20包容範圍內,打印Weird
  4. 如果neven和大於20,打印Not Weird

這是我的代碼:

n = input("") 
if n%2!=0 : 
    print ("Weird") 
elif n%2==0 : 
    for n in range(3,4,5) : 
      print ("Not Weird") 
elif n%2==0 : 
    for n in range(6,21) : 
      print ("Weird") 
else : 
    if (n%2==0 & n>20) : 
     print ("Not Weird") 

我編譯的代碼,一切都很好,但對於輸入1820我必須得到Weird作爲輸出,但我得到Not Weird。誰能幫我?

+0

你的意思是二元'&',還是你的意思是邏輯'和'? – cdarke

+0

我的意思是邏輯,就像我們在'C'或'C++'中做的那樣,例如, 'if(x> 4 && x%2 == 0)' –

+0

在這種情況下,它應該是'and',在C中是&&''&'是一個與C中含義相同的二元運算符。在你問之前,在Python中它是'或',而不是'||'。 – cdarke

回答

0

是你特別要求使用的循環?如果沒有,你可以試試這個!

n = int(input("")) 

if n%2==1: 
    print("Weird") 
elif n%2==0 and n in range(3, 6): 
    print("Not Weird") 
elif n%2==0 and n in range(6, 21): 
    print("Weird") 
elif n%2==0 and n>20: 
    print("Not Weird") 
+0

謝謝你這麼多!但爲什麼它不適用於for循環? –

+0

你可以從每個'elif'的開頭省略'n%2 == 0和';如果'n%2 == 1'測試失敗,那麼您只能訪問它們,因此當您已經保證「沒有奇怪」時重新檢查均勻性是多餘的。同樣,特別是在Python 2中,但在Python 3中仍然如此,在範圍(6,21)中執行(例如)elif 6 <= n <= 20:而不是elif n會更好/更快。 '6 <= n <= 20'根本不需要創建一個對象(並且在Py2上,創建的對象是一箇中等大小的'list',它必須逐個掃描,其中'6 <= n < 20'是1-2便宜的邏輯測試)。 – ShadowRanger

+0

是的,這是正確的。 – ne0fr0st

0

你有2個elif,但它不應該具有相同的條件。 更改或刪除一個ELIF

n = input("") 
if n%2!=0 : 
    print ("Weird") 
elif n%2==0 : 
    if n>20: 
     print ("Not Weird") 
    for n in range(3,4,5) : #range shouldn't be like this. But for your understanding i leave it as it is 
      print ("Not Weird") 
    for n in range(6,21) : 
      print ("Weird") 

決賽否則也沒有必要

+0

請閱讀條件並告訴我,如果我刪除一個'elif' –

+0

應該怎麼辦?它會進入第二elif,因爲兩者都是相同的。所以合併2和3 –

+0

哦,是的!等等,我會試試這個 –

0

你有範圍(3,4,5)中的問題。列表(範圍(3,4,5))是[3] ..可能不是你所期望的...範圍是開始,停止,一步。

你可以在n個辦[3,4,5]或範圍(3,6)

+0

我認爲問題出現在第二個'elif'聲明中,因爲輸入'18'和'20'位於'範圍(6,21)' –

0

你的主要問題是,你在之後的每個條件語句繼續重新定義你的for循環n,從而第一個for循環你的n是不是最初給出的。

在您的兩個案例n=18n=20中,第一個條件n%2!=0爲False,因此第二個條件被測試。 n%2==0True,所以執行for n in range(3,4,5):循環。該循環的第一個(也是唯一)迭代將n設置爲3並打印「不奇怪」。由於n現在是3,您代碼中的其餘條件都不是True,所以它們不會執行。

下面將給出您的要求簡單得多:

def isweird(n): 
    if n%2 or n in range(6,21): 
     return 'Weird' 
    if n in range(2,6) or n > 20: 
     return 'Not Weird' 

for n in range(23): 
    print(n, isweird(n)) 

輸出:

0 None 
1 Weird 
2 Not Weird 
3 Weird 
4 Not Weird 
5 Weird 
6 Weird 
7 Weird 
8 Weird 
9 Weird 
10 Weird 
11 Weird 
12 Weird 
13 Weird 
14 Weird 
15 Weird 
16 Weird 
17 Weird 
18 Weird 
19 Weird 
20 Weird 
21 Weird 
22 Not Weird 
0

有一些與您所提供的代碼的問題。

最明顯的是,您在if ... else鏈的兩個分支中重複的條件相同。第二個這樣的條件,

elif n%2==0: 
    for n in range(6,21) : 

永遠不會執行。

此外,在這些分支中使用for循環是不正確的。這些應該是條件。當你想重複一個動作的時候你使用了一個循環,但是在這裏你有一個變量,你想問一個關於它的問題。這是一個「如果」:

elif n%2==0 : 
    if n in range(3,4,5) : 
      print ("Not Weird") 

但是,這引出了下一個錯誤,這是利用range。正如你所寫的,你指定的數字範圍從3開始,運行到4(不含),以5爲步驟。這將是包含3的範圍。 要指定從2到6的包含範圍,您會寫

elif n%2==0 : 
    if n in range(2,7): 
      print ("Not Weird") 

範圍是包含在底端和獨家在頂端。這起初看起來有點違反直覺,但它通常是您在處理零索引時想要的。例如,您希望範圍(10)有10個成員,並以零開始,因此包含所有基數十位數。 你也可以這樣寫

elif n%2==0 : 
    if 2 <= n <= 6: 
      print ("Not Weird") 

這將是我的偏好。

0

所以,讓我們走過你的代碼一行一行地看到發生了什麼18的輸入的情況下發生的:

if n%2!=0 : 
    print ("Weird") 

18模數2等於0,所以這個print語句不會達到。

下一頁:

elif n%2==0 : 
    for n in range(3,4,5) : 
     print ("Not Weird") 

你好,這個比賽!因此,for語句將被執行。 對於值爲18的if/elif/else鏈中不會有其他語句,因爲您在此處找到匹配項。

但是,你不會看到你所期望的,因爲for語句不會做你認爲它。你認爲它會查看n,在列表[3,4,5]中找到的值爲n,將打印值Not Weird

這不是for所做的。相反,n更改爲爲一個範圍內的每個值,然後循環內的代碼將執行n設置爲該值。現在,你想知道爲什麼,如果是這種情況,你看不到Not Weird打印三次?原因是range是一個函數,它不返回提供的數字列表,它返回一堆以(在你的例子中)3開始,以4結尾的數字,但只返回每第5個數字。巧合的是,這給出range只有1個值(值3),這就是爲什麼Not Weird只出現一次。

這裏是你的代碼的修正和註釋版本:

if n%2 != 0: 
    print ("Weird") 
else: 
    #Don't need elif, there are only two cases odd, or not. 
    #But, inside this branch we have three possibilities. 
    if n in [2, 3, 4, 5]: 
     #I just enumerate here, instead of using range. You forgot about 2, BTW 
     print ("Not Weird") 
    elif n in range(6,21) 
     # Note the use of if (or elif), not for. 
     print ("Weird") 
    else: 
     print ("Not Weird")