2012-07-13 16 views
13

Czy ktoś może wyjaśnić mi ostatnią linię tego fragmentu kodu Pythona?Co robi pętla for z listy w Pythonie?

Cell to tylko kolejna klasa. Nie rozumiem, w jaki sposób pętla for jest używana do przechowywania obiektów Cell w obiekcie 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

nazywany jest „lista ze zrozumieniem” –

Odpowiedz

29

Linia kodu, o którą pytasz, to list comprehension, aby utworzyć listę i przypisać dane zebrane na tej liście do self.cells. Jest to odpowiednik

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

Wyjaśnienie:

Aby jak najlepiej wyjaśnić jak to działa, kilka prostych przykładów może być pouczające pomagając zrozumieć kod trzeba. Jeśli będziesz kontynuował pracę z kodem Pythona, ponownie zobaczysz spisywanie słów i możesz go użyć samodzielnie.

Uwaga, w poniższym przykładzie, oba segmenty kodu są równoważne w które tworzą list wartości przechowywane w liście myList.

Na przykład:

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

jest równoważna

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

listowe listy mogą być też bardziej skomplikowane, więc na przykład jeśli miał jakiś warunek, że określona, ​​jeśli wartości powinny przejść do listy, którą może również wyrazić to ze zrozumieniem listy.

Ten przykład tylko zbiera parzyste wartości w liście:

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

i równoważnej listowego:

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

Dwa końcowe Uwagi:

  • można mieć „zagnieżdżone "wymieniają obawy, ale szybko stają się trudne do zrozumienia :)
  • Zrozumienie listy będzie działało szybciej niż odpowiednik pętli for i dlatego często jest ulubionym przez zwykłych programistów Pythona, którzy są zaniepokojeni wydajnością.

OK, ostatni przykład pokazujący, że można również zastosować funkcje do elementów, które są iteracyjne na liście.Wykorzystuje float() przekonwertować listy ciągów do pływaka wartości:

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

otrzymujemy:

new_data 
[3.0, 7.4, 8.2] 
1

To jest taka sama, jak gdyby to zrobił:

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

To się nazywa list comprehension.