2011-11-05 2 views
7

Ho un problema di codice comprensione relative a python:Python conversione follia

def convex_hull(pts): 
    """Returns the points on the convex hull of pts in CCW order.""" 
    for m in (2 ** (2 ** t) for t in xrange(len(pts))): 
     hulls = [_graham_scan(pts[i:i + m]) for i in xrange(0, len(pts), m)] 
//more code 

io non riesco a capire come sono quei due 'per' dovrebbe funzionare.

Purtroppo il riferimento del comando non mostra un tale esempio di utilizzo, e non posso davvero dire se questo -really- significa che uno per è l'assegnazione lato sinistro dell'altro?

Inoltre, che cosa potrebbe significare l'assegnazione in basso? L'istruzione 'for' restituisce un valore?!?!

Grazie e scusa per la domanda per principianti.

+0

La prima riga di questa funzione è uno stile di codifica davvero orribile. 'per t in xrange (len (pts)): m = 2 ** 2 ** t' è più veloce, più corto e molto più facile da leggere. –

risposta

11

Per comprendere questo codice, è necessario prima comprendere list comprehensions e generator expressions. Ecco un esempio di un semplice elenco di comprensione:

>>> [str(i) for i in range(5)] 
['0', '1', '2', '3', '4'] 

Come si può vedere, questa linea fa l'equivalente delle seguenti regolare for ciclo:

lst = [] 
for i in range(5): 
    lst.append(str(i)) 

In sostanza, si tratta di una scorciatoia per creare liste. Le espressioni del generatore sono simili, tranne che invece di restituire una lista restituiscono un generatore che restituirà gli stessi valori di una lista di comprensione, senza effettivamente creare l'elenco completo. Questo è più efficiente quando stai andando a scorrere i valori.

Ora che lo sfondo è fuori strada, ecco come si potrebbe espandere tale codice utilizzando regolari for loop:

def convex_hull(pts): 
    """Returns the points on the convex hull of pts in CCW order.""" 
    for t in xrange(len(pts)): 
     m = 2 ** (2 ** t) 
     hulls = [] 
     for i in xrange(0, len(pts), m): 
      hulls.append(_graham_scan(pts[i:i + m])) 
    # more code 

quanto per il tuo commento, pts[i:i + m] sta prendendo una fetta della lista dall'indice i fino all'indice i + m, si può sostanzialmente leggere fette come questo:

[first index to include : first index to exclude : step] 

This answer ha una buona spiegazione con alcuni esempi.

+0

Hah, fantastico! inizia a dare un senso. Un'ultima cosa: puoi dire cosa significano i punti [i: i + m]? È un sotto-array, immagino? – roamcel

+0

@roamcel - Vedi la mia modifica, quella sintassi viene chiamata slicing, e fa esattamente quello che pensavi di aver fatto :) –

+0

Fantastico, grazie! – roamcel