2012-07-13 72 views
13

Ai đó có thể giải thích dòng cuối cùng của đoạn mã Python này cho tôi không?Vòng lặp for trong danh sách làm gì trong Python?

Cell chỉ là một lớp khác. Tôi không hiểu cách vòng lặp for đang được sử dụng để lưu trữ các đối tượng Cell vào đối tượng 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

nó được gọi là một 'danh sách hiểu biết' –

Trả lời

29

Dòng mã bạn đang hỏi đang sử dụng list comprehension để tạo danh sách và gán dữ liệu được thu thập trong danh sách này vào self.cells. Nó tương đương với

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

Giải thích:

Để giải thích tốt nhất cách công trình này, một vài ví dụ đơn giản có thể là bài học trong việc giúp bạn hiểu mã mà bạn có. Nếu bạn sẽ tiếp tục làm việc với mã Python, bạn sẽ bắt gặp lại việc hiểu danh sách và bạn có thể muốn sử dụng nó. Lưu ý, trong ví dụ bên dưới, cả hai đoạn mã là tương đương ở chỗ chúng tạo ra một giá trị list được lưu trữ trong danh sách myList.

Ví dụ:

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

tương đương với

Danh sách
myList = [i for i in range(10)] 

comprehensions có thể phức tạp hơn quá, vì vậy ví dụ nếu bạn đã có một số điều kiện xác định nếu giá trị nên đi vào một danh sách bạn cũng có thể thể hiện điều này bằng cách hiểu danh sách.

Ví dụ này chỉ thu thập các giá trị chẵn trong danh sách:

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

và danh sách hiểu tương đương:

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

Hai lưu ý cuối cùng:

  • Bạn có thể đã "lồng nhau "liệt kê các sự hiểu biết, nhưng chúng nhanh chóng trở nên khó hiểu :)
  • Danh sách hiểu sẽ chạy nhanh hơn so với tương đương cho vòng lặp, và do đó thường là một yêu thích với các lập trình viên Python thường xuyên, những người quan tâm về hiệu quả.

Ok, một ví dụ cuối cùng cho thấy bạn cũng có thể áp dụng các chức năng cho các mục bạn đang lặp trong danh sách.Này sử dụng float() để chuyển đổi một danh sách các chuỗi giá trị nổi:

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

cho:

new_data 
[3.0, 7.4, 8.2] 
1

Nó cũng giống như nếu bạn đã làm điều này:

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

này được gọi là list comprehension.

Các vấn đề liên quan