next
è prezioso per far avanzare un iteratore quando necessario, senza che l'avanzamento controllo di un esplicito for
loop. Ad esempio, se si desidera "il primo elemento in S che è maggiore di 100", next(x for x in S if x > 100)
lo darà a te, senza muss, senza problemi, senza lavoro non necessario (dato che tutto termina non appena si trova un idoneo x
) - e si ottiene un'eccezione (StopIteration
) se inaspettatamente no x
corrisponde alla condizione. Se è prevista una mancata corrispondenza e si desidera None
in questo caso, lo consegnerà next((x for x in S if x > 100), None)
. Per questo scopo specifico, potrebbe essere più chiaro se next
fosse effettivamente denominato first
, ma che tradirebbe il suo uso molto più generale.
Considerare, ad esempio, l'operazione di unire più sequenze (ad es. Unione o intersezione di sequenze ordinate, ad esempio file ordinati, in cui gli elementi sono linee). Ancora una volta, next
è proprio quello che il medico ha ordinato, perché nessuna delle sequenze può dominare sugli altri controllando un "ciclo principale for
". Quindi, supponendo che per semplicità non possano esistere duplicati (una condizione che non è difficile da rilassare se necessario), si mantengono le coppiein un elenco controllato da heapq
, e la fusione diventa facile ... ma solo grazie alla magia di next
per avanzare il corregge il file una volta che il suo oggetto è stato usato e solo quel file.
import heapq
def merge(*theopentextfiles):
theheap = []
for afile in theopentextfiles:
theitem = next(afile, '')
if theitem: theheap.append((theitem, afile))
heapq.heapify(theheap)
while theheap:
theitem, afile = heapq.heappop(theheap)
yielf theitem
theitem = next(afile, '')
if theitem: heapq.heappush(theheap, (theitem, afile))
Basta cercare di fare qualsiasi cosa ovunque questo elegante senza next
... -!)
Si potrebbe andare avanti per molto tempo, ma i due casi d'uso "avanzano un iteratore di un posto (senza lasciarlo controllare un intero ciclo for
) "e" ottenere solo il primo elemento da un account iteratore "per gli usi più importanti di next
.
fonte
2010-09-06 01:58:30
+1 Bella risposta! –
@ AJ, grazie! –
+1 L'hai fatto di nuovo. Mi sono appena reso conto che il mio utile qualsiasi aka prima poteva essere definito (prima non False in qualsiasi sequenza o ultimo valore in sequenza se tutti sono False) potrebbe essere definito anche con next e iter. –