2012-03-31 72 views
4

在C,它被認爲是不好的做法,調用strlen這樣的:在循環的條件語句中調用len()是否正確?

for (i = 0; strlen (str) != foo; i++) 
{ 
    // stuff 
} 

究其原因,當然是,它是低效的,因爲它「罪狀」,在一個字符串多次的字符。

然而,在Python,我看到這樣的代碼往往:

for i in range (0, len (list)): 
    # stuff 

這是不好的做法?我應該將len()的結果存儲在一個變量中並使用它嗎?

+5

我希望你看不到這樣的代碼,但是出於完全不同的原因:Python提供了直接的迭代,並且你展示的代碼正在爲使事情變得比必要更困難而走出困境。你可以直接用'my_list:'中的項目獲得'my_list'項目;';沒有必要生成索引。 – 2012-03-31 07:44:09

回答

10

在Python中,for循環遍歷一個類似列表的對象,它沒有每次都檢查的條件語句。爲了說明,以下兩個循環在功能上是等價的;該while環是for (i=0; i< n; i++) { ... }直接翻譯,而for循環是這樣做的Python的方式:

i = 0 
while i < n: 
    # do some actions using i 
    i += 1 

for i in range(n): 
    # do some actions using i 

for循環,range(n)是在循環開始前進行評估,並然後它的返回值是在循環中使用。換句話說,range(n)被評估一次(並且只有一次)以得到i應該採用的值列表*。

因此,在給定的具體例子,Python看到for i in range(0, len(list)),評估range(0, len(list))(所以len被調用一次),並存儲輸出(它不叫range(或len)再次)。

(*在Python 3.X range實際上並不返回一個列表,但在使用它的循環時,在功能方面沒有區別)

3

這在python中很好,因爲range函數會創建一個for循環隨後使用的列表。因此len只被調用一次。另外,你不需要額外的0,因爲如果沒有額外的選項,range從0開始計數。

作爲一個方面說明,您通常會想使用xrange,因爲它會創建一個延遲評估的生成器。

+0

注意:在python 3範圍內創建一個生成器,並且xrange已被刪除。 – jamylak 2012-03-31 05:14:13

+2

@jamylak當然,我只是假設早期版本。所有python代碼都是爲Python 3編寫的那一天將是一個美好的一天。 – Squazic 2012-03-31 05:19:21

4

for i in range(len(whatever))是Python的風格差。正如其他人所提到的,直接迭代可通過for element in whatever獲得。然而,人們仍然這樣做的原因有兩個:

  1. 他們是C程序員,並沒有圍繞直接迭代的思想。

  2. 他們希望在遍歷整個列表時修改列表,否則需要索引。如果是這種情況,Pythonic的做法是enumerate函數:for i, element in enumerate(whatever)