Python: nested para bucles o statement “siguiente”

Soy un aficionado novato y nido para bucles cuando escribo python, así:

dict = { key1: {subkey/value1: value2} ... keyn: {subkeyn/valuen: valuen+1} } for key in dict: for subkey/value in key: do it to it 

Soy consciente de una palabra clave “siguiente” que lograría el mismo objective en una línea (hice una pregunta sobre cómo usarla pero no la entendí del todo).

Así que para mí, un bucle nested es mucho más legible. ¿Por qué, entonces la gente usa “siguiente”? Leí en alguna parte que Python es un lenguaje de tipo e interpretado dinámicamente y porque + concontinúa los números de cadenas y sums, debe verificar los tipos de variables para cada iteración de bucle para saber qué son los operadores, etc. ¿Esto de alguna manera, acelerando la ejecución o es solo una cuestión de estilo / preferencia?

next es valioso para avanzar un iterador cuando sea necesario , sin que ese avance controle un bucle explícito. Por ejemplo, si desea “el primer elemento en S que sea mayor que 100”, el next(x for x in S if x > 100) le dará a usted, no muss, ni alboroto, ni trabajo innecesario (ya que todo termina como tan pronto como se StopIteration una x adecuada) – y obtendrá una excepción ( StopIteration ) si inesperadamente no x coincide con la condición. Si se espera una no coincidencia y no desea None en ese caso, a next((x for x in S if x > 100), None) lo entregará. Para este propósito específico, podría ser más claro para usted si el next se llamara first , pero eso traicionaría su uso mucho más general.

Considere, por ejemplo, la tarea de fusionar múltiples secuencias (por ejemplo, una unión o intersección de secuencias ordenadas, por ejemplo, archivos ordenados, donde los elementos son líneas). Una vez más, el next es justo lo que recetó el médico, porque ninguna de las secuencias puede dominar sobre las otras controlando A “main for loop”. Por lo tanto, asumiendo que para simplificar no pueden existir duplicados (una condición que no es difícil de relajar si es necesario), se mantienen los pares (currentitem, itsfile) en una lista controlada por heapq , y la fusión se vuelve fácil … pero solo gracias a la magia a next para avanzar el archivo correcto una vez que se haya utilizado su elemento, y solo ese archivo.

 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)) 

Solo intenta hacer cualquier cosa en este elegante sin el next …! -)

Uno podría continuar durante mucho tiempo, pero los dos casos de uso “hacen avanzar un iterador en un lugar (sin dejar que controle un bucle completo)” y “obtenga el primer elemento de un iterador” para los usos más importantes del next .