2012-07-13 63 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