有人認爲Python的重視for
和range
之間的一些特殊語法,但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))
不會再...不要** **不**提交圖片**你的代碼。發佈**實際代碼**。 –
回答你的問題:因爲Python認爲這是一個*空*的範圍。所以它根本沒有列舉。爲什麼你想要一個錯誤信息? –
好的,你是對的代碼。我期望有一個錯誤,因爲我正在談論一個不存在的I。那麼在場景之外實際發生了什麼?什麼代碼行運行?謝謝! –