2012-07-13 38 views
13

有人可以向我解釋這段Python代碼片段的最後一行嗎?Python中的列表中的for循環是做什麼的?

Cell只是另一個類。我不明白如何使用for循環將Cell對象存儲到Column對象中。

class Column(object): 

    def __init__(self, region, srcPos, pos): 

     self.region = region 
     self.cells = [Cell(self, i) for i in xrange(region.cellsPerCol)] #Please explain this line. 
+2

它被稱爲「列表理解」 – 2012-07-13 23:00:17

回答

29

您詢問的代碼行使用list comprehension來創建列表並將此列表中收集的數據分配到self.cells。它相當於

self.cells = [] 
for i in xrange(region.cellsPerCol): 
    self.cells.append(Cell(self, i)) 

說明

最好地解釋如何這個工作,幾個簡單的例子可能是在幫助你瞭解你的代碼啓發。如果你要繼續使用Python代碼,你會再次遇到列表理解,你可能想自己使用它。

注意,在下面的例子中,兩個代碼段是在等效他們創建存儲在列表myList值的list

例如:

myList = [] 
for i in range(10): 
    myList.append(i) 

相當於

myList = [i for i in range(10)] 

列表內涵可以更復雜了,所以例如,如果你有這樣的決定,如果值應該進入一個列表中,您一定條件也可以用列表理解來表達這一點。

這個例子只收集列表中的偶數值:

myList = [] 
for i in range(10): 
    if i%2 == 0:  # could be written as "if not i%2" more tersely 
     myList.append(i) 

,等效列表理解:

myList = [i for i in range(10) if i%2 == 0] 

最後兩個注意事項:

  • 你可以有「嵌套「列表的意思,但他們很快就很難理解:)
  • 列表理解將比等效的for-loop運行得更快,因此常常是關注效率的常規Python程序員的最愛。

好吧,最後一個例子顯示你也可以將函數應用到你在列表中迭代的項目。它使用float()轉換字符串列表的浮動值:

data = ['3', '7.4', '8.2'] 
new_data = [float(n) for n in data] 

給出:

new_data 
[3.0, 7.4, 8.2] 
1

這是因爲如果你這樣做是相同的:

def __init__(self, region, srcPos, pos): 
    self.region = region 
    self.cells = [] 
    for i in xrange(region.cellsPerCol): 
     self.cells.append(Cell(self, i)) 

這就是所謂的list comprehension