2012-07-13 12 views
13

Qualcuno può spiegare l'ultima riga di questo frammento di codice Python?Cosa fa un ciclo for all'interno di un elenco in Python?

Cell è solo un'altra classe. Non capisco come il ciclo for venga utilizzato per memorizzare oggetti Cell nell'oggetto 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

è chiamato un 'di lista' –

risposta

29

La riga di codice che si sta chiedendo utilizza list comprehension per creare un elenco e assegnare i dati raccolti in questo elenco a self.cells. È equivalente a

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

Spiegazione:

Per spiegare meglio come questo funziona, alcuni semplici esempi potrebbero essere istruttivo per aiutare a capire il codice che avete. Se continuerai a lavorare con il codice Python, troverai di nuovo la comprensione degli elenchi e potresti volerlo utilizzare da solo.

nota, nell'esempio di seguito, entrambi i segmenti di codice sono equivalenti in quanto creano una list di valori memorizzati nella lista myList.

Per esempio:

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

è equivalente a

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

di lista può essere più complessa troppo, così per esempio se si ha qualche condizione che ha determinato se i valori devono andare in una lista che si potrebbe anche esprimere questo con la comprensione delle liste.

Questo esempio solo raccoglie i valori pari nei nell'elenco:

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

e l'elenco equivalente di comprensione:

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

Due note finali:

  • si può avere "annidati "elencare le preoccupazioni, ma diventano rapidamente difficili da comprendere :)
  • La comprensione degli elenchi verrà eseguita più velocemente del ciclo for corrispondente e, pertanto, è spesso un preferito dai normali programmatori Python che si preoccupano dell'efficienza.

Ok, un ultimo esempio che mostra che è possibile applicare le funzioni anche agli elementi su cui si sta iterando nell'elenco.Questo utilizza float() per convertire una lista di stringhe di galleggiare valori:

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

dà:

new_data 
[3.0, 7.4, 8.2] 
1

E 'lo stesso come se avete fatto queste cose:

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

Questo è chiamato un list comprehension.