2017-10-19 29 views
1

我一直在做一些練習,並且對你們有一個問題。 以下是我添加的圖片。 爲number =2我們在第二行得到的範圍是從2直到2關於蟒蛇中的範圍的誤解2.7

所以,爲什麼我不收到一些錯誤信息?它是如何工作的?

該程序如何知道跳過它並返回True

代碼:

def main(number): 
    for i in range(2,int(number**0.5)+1): 
     if number % i == 0: 
      return False 
    return True 
print main(2) 

謝謝! code example

+1

不會再...不要** **不**提交圖片**你的代碼。發佈**實際代碼**。 –

+0

回答你的問題:因爲Python認爲這是一個*空*的範圍。所以它根本沒有列舉。爲什麼你想要一個錯誤信息? –

+0

好的,你是對的代碼。我期望有一個錯誤,因爲我正在談論一個不存在的I。那麼在場景之外實際發生了什麼?什麼代碼行運行?謝謝! –

回答

0

有人認爲Python的重視forrange之間的一些特殊語法,但range對象支持迭代

這意味着它有一個__iter__函數返回一個迭代器,並且這支持iterator protocol。這是一個協議,允許我們枚舉該對象外的項目。就像我們還可以列舉一個列表,元組,集合等。

for另一方面簡單地使用這個協議,以便每次迭代它的目的是從迭代器中取出下一個元素。如果有下一個元素,它將該元素分配給左側的變量。如果迭代器耗盡(不再有元素),它會停止。

如果您構造了range(start,stop)對象,其中stop <= start。該範圍對象被認爲是:它根本不枚舉任何項目。 for確實不是知道它在枚舉什麼,但是因爲range(..)元素的迭代器只是說沒有元素了,所以for停止。

你可能確實認爲它會更好,如果range(..)提高的情況下,錯誤的stop小於或等於start。但通常它是想要的行爲沒有錯誤上升,循環根本不執行。

您可以比較for i in range(0,n)到Java/C++語言的家庭結構:

for(int i = 0; i < n; i++) { 
    //... 
} 

在這種情況下,如果n小於或等於零時,迴路也不會被執行。 range(..)有些對象是這種類型的循環的發生器。

一個額外注意的是,range實際上比這個答案在這裏描述的更復雜,因爲你還可以添加step,你可以倒計時。但是這對這個答案的語義沒有影響。

通過在all語句中使用生成器,可以使代碼更加優雅。像:

def main(number): 
    return all(number % i for i in range(2,int(number**0.5)+1)) 

此外,我們還可以提升性能了一下,只檢查除數(2):

def main(number): 
    sq = int(number ** 0.5) + 1 
    return (number & 1) and all(number % i for i in range(3, n, 2)) 
+0

哇!非常感謝。多好的回答!非常感激!非常感謝你 –

+0

@AlmogCarmeli如果你的問題得到了解答,請給予這個用戶禮貌[標記他們的答案接受](https://stackoverflow.com/help/someone-answers)。 –