2016-04-24 57 views
3

我最近開始編碼,並且在Codecademy上嘗試學習Python時遇到了一些我不完全理解的內容。函數中的Python錯誤[Beginner]

任務是創建一個函數,告訴它是否被調用,數字是否是質數或不是。

因此,這裏是我的第一個解決方案:

def is_prime(x): 
    if x < 2: 
     return False 
    elif x == 2: 
     return True 
    else: 
     for n in range(2, x-1): 
      if x % n == 0: 
       return False 
      else: 
       return True 

print is_prime(5) 

運行後,它會不停地給該is_prime(3)提供虛假,而不是給人一種真正的消息。 所以在Codecademy網站論壇上,我發現,如果碼的最後一位被alterd搜索到後一點點:

def is_prime(x): 
    if x < 2: 
     return False 
    elif x == 2: 
     return True 
    else: 
     for n in range(2, x-1): 
      if x % n == 0: 
       return False 
    return True 

print is_prime(5) 

它開始正常工作。 任何人都可以向我解釋這種改變如何導致代碼工作? 在此先感謝。

+1

想想你的第一個版本何時會返回true。用紙和鉛筆舉例說明。這應該是非常明顯的,那麼錯誤是什麼(儘管在計算素數時,你絕不會是第一個犯這個錯誤的人,即使只是在今天發佈Python SO問題,所以不用擔心)。 – jonrsharpe

+1

我看不到'is_prime(3)'會爲第一個版本返回True或False,因爲'range(2,3-1)'爲空,因此代碼永遠不會有機會返回默認的「None」以外的任何內容。 – TigerhawkT3

+1

@ TigerhawkT3我猜平地機看到'None'爲false-y – jonrsharpe

回答

4

在第一個代碼片段中會發生什麼,該循環幾乎沒有機會運行。其中的if子句同時具有then和else分支,因此它們中的任何一個都將始終執行。因爲它們中都有一個return,函數會在循環第一次執行時立即返回。

此外,在您的3具體的測試用例的循環不會運行一次,因爲range()指定一個EXLUSIVE上限。 range(2, 2)是一個空的範圍。函數在沒有return的情況下達到最終結果,並且在Python中導致函數返回特殊值None

第二個代碼片段被修改爲只有在找到證明給定數字不是素數的反例時才退出函數。在這種情況下,可以儘早返回該函數,因爲如果找到一個除數,則該數字不可能是總數,並且不需要檢查其餘的。只有當循環結束而沒有找到時,循環後的return True纔會到達。