2015-04-19 117 views
-1

讓我們的標準Java for循環Python for循環中引發了什麼?

for (int i = 0; i < 10; i++) { 
    System.out.println(i); 
} 

我可以清楚地看到所發生的事情在for循環。 i初始化爲0.在每次迭代中檢查條件並進行增量。

這裏的Python版本

for i in range(0, 10): 
    print(i) 

這個循環過程中發生了什麼事,詳細?

+0

所以你問Python是如何實現的。 – Maroun

+0

是的,我在問python是如何實現的。 – Ogen

+0

[瞭解Python的迭代器,迭代和迭代協議 - 它們究竟是什麼?]的可能的重複(http://stackoverflow.com/questions/9884132/understanding-pythons-iterator-iterable-and-iteration-protocols-what -exact) –

回答

1

查看range()內置函數的文檔,可以看到該函數「創建包含算術級數的列表」。在遍歷該列表,如果它直接傳遞給循環:

for i in range(0, 10): 
    print(i) 

此代碼是基本相同

for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: 
    print(i) 

in關鍵字基本上是說在每一個元素提供的可迭代對象 - 在本例中是一個列表。 「對於列表中的每個項目」。循環知道何時停止,因爲範圍函數生成一個有限列表 - 這個列表有它的長度,這就是停止條件。在內部,當循環嘗試讀取超出範圍的索引時,會生成一個StopIteration exception並觸發終止條件。

+0

「in」關鍵字在做什麼。這個循環如何知道何時停止? – Ogen

+1

@Ogen - 循環知道何時停止,因爲範圍函數生成一個有限列表 - 這個列表有它的長度,那就是停止條件。在內部,當循環嘗試讀取超出範圍的索引時,會生成一個「StopIteration」異常並觸發終止條件。 – Lix

+1

@Ogen'in'關鍵字基本上是針對**中提供的每個元素**提供的可迭代對象 - 在本例中是一個列表。 「**列表中的每個項目**」。 – Lix

1

range(0,10)返回從0號的列表至9 循環遍歷該列表中,每次迭代分配列表中的下一個號碼到i

3

的誤解是,這兩個環是類似。

Java的表單從某個初始值開始打印出來,只要該值小於某個終端值,它就會繼續循環。

Python實際上將每一個元素都包含在你給它的任何迭代中,並且打印出它的內容而不增加任何增量。

因爲在這種情況下,可迭代是range的結果,這是您獲取版本之間元素更改的行爲。

  • 如果你正在使用Python < 3,range熱切生成元素的列表供您使用的功能。這種惰性的生成變體是xrange,其中根據需要生成值。在這種情況下,由於您要在整個集合中循環完成,並且內存限制並不高,所以您不會注意到兩者之間的差異。

  • 在Python> = 3中,rangebehaves similar to xrange因爲它是另一種序列類型,它也生成它需要的實時值。

這裏的關鍵區別在於,在一個Python循環變量代表包含在迭代的實際,而Java用標準for循環產生的值。

如果你使用的enhanced-for loop代替,那麼你會得到接近 Python的循環是如何工作的:

int[] list = {1, 2, 3, 4, 5, 6, 7, 8, 9} 
for(int i : list) { 
    System.out.println(i); 
}