Buscar..


Introducción

Como una de las funciones más básicas de la programación, los bucles son una pieza importante para casi todos los lenguajes de programación. Los bucles permiten a los desarrolladores configurar ciertas partes de su código para que se repitan a través de una serie de bucles que se conocen como iteraciones. Este tema cubre el uso de múltiples tipos de bucles y aplicaciones de bucles en Python.

Sintaxis

  • mientras que <expresión booleana>:
  • para <variable> en <iterable>:
  • para <variable> en rango (<número>):
  • para <variable> en el rango (<start_number>, <end_number>):
  • para <variable> en el rango (<start_number>, <end_number>, <step_size>):
  • para i, <variable> in enumerate (<iterable>): # con índice i
  • para <variable1>, <variable2> en zip (<iterable1>, <iterable2>):

Parámetros

Parámetro Detalles
expresión booleana Expresión que se puede evaluar en un contexto booleano, por ejemplo, x < 10
variable Nombre de variable para el elemento actual del iterable
iterable cualquier cosa que implemente iteraciones

Iterando sobre listas

Para recorrer una lista puedes usar for :

for x in ['one', 'two', 'three', 'four']:
    print(x)

Esto imprimirá los elementos de la lista:

one
two
three
four

La función de range genera números que también se utilizan a menudo en un bucle for.

for x in range(1, 6):
    print(x)

El resultado será un tipo de secuencia de rango especial en python> = 3 y una lista en python <= 2. Ambos se pueden pasar usando el bucle for.

1
2
3
4
5

Si desea recorrer los elementos de una lista y también tener un índice para los elementos, puede usar la función de enumerate de Python:

for index, item in enumerate(['one', 'two', 'three', 'four']):
    print(index, '::', item)

enumerate generará tuplas, que se desempaquetan en index (un entero) y item (el valor real de la lista). El bucle de arriba se imprimirá

(0, '::', 'one')
(1, '::', 'two')
(2, '::', 'three')
(3, '::', 'four')

Iterar sobre una lista con manipulación de valores usando map y lambda , es decir, aplicar la función lambda en cada elemento de la lista:

x = map(lambda e :  e.upper(), ['one', 'two', 'three', 'four'])
print(x)

Salida:

['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x

NB: en Python 3.x map devuelve un iterador en lugar de una lista, por lo que, en caso de que necesite una lista, debe emitir la print(list(x)) del resultado print(list(x)) (consulte http://www.riptutorial.com/python/ example / 8186 / map-- en http://www.riptutorial.com/python/topic/809/incompatibilities-moving-from-python-2-to-python-3 ).

Para bucles

for bucles, repita una colección de elementos, como list o dict , y ejecute un bloque de código con cada elemento de la colección.

for i in [0, 1, 2, 3, 4]:
    print(i)

Lo anterior for bucle se repite sobre una lista de números.

Cada iteración establece el valor de i en el siguiente elemento de la lista. Entonces primero será 0 , luego 1 , luego 2 , etc. La salida será la siguiente:

0  
1
2
3
4

range es una función que devuelve una serie de números bajo una forma iterable, por lo que se puede utilizar en for bucles:

for i in range(5):
    print(i)

da exactamente el mismo resultado que el primer bucle for . Tenga en cuenta que 5 no se imprime, ya que el rango aquí corresponde a los primeros cinco números que cuentan desde 0 .

Objetos iterables e iteradores.

for loop puede iterar en cualquier objeto iterable que sea un objeto que defina una función __getitem__ o __iter__ . La función __iter__ devuelve un iterador, que es un objeto con una función next que se utiliza para acceder al siguiente elemento de la iterable.

Romper y continuar en bucles

declaración de break

Cuando una instrucción de break ejecuta dentro de un bucle, el flujo de control se "interrumpe" inmediatamente:

i = 0
while i < 7:
    print(i)
    if i == 4:
        print("Breaking from loop")
        break
    i += 1

El condicional de bucle no se evaluará después de que se ejecute la instrucción break . Tenga en cuenta que las declaraciones de break solo se permiten dentro de los bucles , sintácticamente. No se puede usar una declaración de break dentro de una función para terminar los bucles que llamaron a esa función.

La ejecución de lo siguiente imprime cada dígito hasta el número 4 cuando se cumple la instrucción break y el bucle se detiene:

0
1
2
3
4
Breaking from loop

break declaraciones de break también se pueden usar dentro for bucles, la otra construcción de bucle proporcionada por Python:

for i in (0, 1, 2, 3, 4):
    print(i)
    if i == 2:
        break

La ejecución de este bucle ahora imprime:

0
1
2

Tenga en cuenta que 3 y 4 no se imprimen ya que el bucle ha finalizado.

Si un bucle tiene una cláusula else , no se ejecuta cuando el bucle termina a través de una instrucción de break .

continue declaración

Una instrucción de continue pasará a la siguiente iteración del bucle, omitiendo el resto del bloque actual pero continuando el bucle. Al igual que con break , continue solo puede aparecer dentro de los bucles:

for i in (0, 1, 2, 3, 4, 5):
    if i == 2 or i == 4:
        continue
    print(i)

0
1
3
5

Tenga en cuenta que 2 y 4 no se imprimen, esto se debe a que continue va a la siguiente iteración en lugar de continuar print(i) cuando i == 2 o i == 4 .

Bucles anidados

break y continue solo funciona en un solo nivel de bucle. El siguiente ejemplo solo saldrá del bucle for interno, no del bucle while externo:

while True:
    for i in range(1,5):
        if i == 2:
            break    # Will only break out of the inner loop!

Python no tiene la capacidad de romper múltiples niveles de bucles a la vez; si se desea este comportamiento, refactorizar uno o más bucles en una función y reemplazar la break con el return puede ser la forma de hacerlo.

Usa el return desde dentro de una función como un break

La declaración de return sale de una función, sin ejecutar el código que viene después de ella.

Si tiene un bucle dentro de una función, usar el return desde dentro de ese bucle es equivalente a tener una break ya que el resto del código del bucle no se ejecuta ( tenga en cuenta que cualquier código después del bucle tampoco se ejecuta ):

def break_loop():
    for i in range(1, 5):
        if (i == 2):
            return(i)
        print(i)
    return(5)

Si tiene bucles anidados, la instrucción de return romperá todos los bucles:

def break_all():
    for j in range(1, 5):
        for i in range(1,4):
            if i*j == 6:
                return(i)
            print(i*j)

saldrá:

1 # 1*1
2 # 1*2
3 # 1*3
4 # 1*4
2 # 2*1
4 # 2*2
# return because 2*3 = 6, the remaining iterations of both loops are not executed

Bucles con una cláusula "else"

Las declaraciones for y while (loops) pueden tener opcionalmente una cláusula else (en la práctica, este uso es bastante raro).

El else cláusula sólo se ejecuta después de un for bucle termina por iteración a la terminación, o después de un while bucle termina por su expresión condicional convertirse en falsa.

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

salida:

 0
 1
 2
 done

La cláusula else no se ejecuta si el bucle termina de alguna otra manera (a través de una declaración de break o al generar una excepción):

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

salida:

0
1

La mayoría de los otros lenguajes de programación carecen de esta cláusula else opcional de bucles. El uso de la palabra clave else en particular a menudo se considera confuso.

El concepto original para dicha cláusula se remonta a Donald Knuth y el significado de la palabra clave else queda claro si reescribimos un bucle en términos de declaraciones if y goto de días anteriores a la programación estructurada o de un lenguaje ensamblador de nivel inferior.

Por ejemplo:

while loop_condition():
    ...
    if break_condition():
        break
    ...

es equivalente a:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

Estos siguen siendo equivalentes si adjuntamos una cláusula else a cada uno de ellos.

Por ejemplo:

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

es equivalente a:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>:

Un bucle for con una cláusula else puede entenderse de la misma manera. Conceptualmente, hay una condición de bucle que permanece verdadera mientras el objeto o la secuencia iterable aún tenga algunos elementos restantes.

¿Por qué uno usaría esta construcción extraña?

El caso de uso principal para la construcción for...else es una implementación concisa de búsqueda como por ejemplo:

a = [1, 2, 3, 4]
for i in a:
    if type(i) is not int:
        print(i)
        break
else:
    print("no exception") 

Para hacer que la else de este constructo sea menos confuso, uno puede pensar en él como " si no se rompe " o " si no se encuentra ".

Algunas discusiones sobre esto se pueden encontrar en [Python-ideas] Resumen de los hilos de for ... else , ¿Por qué python usa 'else' después de los bucles for y while? , y otras cláusulas en declaraciones de bucle

Iterando sobre los diccionarios

Teniendo en cuenta el siguiente diccionario:

 d = {"a": 1, "b": 2, "c": 3}

Para iterar a través de sus claves, puede utilizar:

for key in d:
    print(key)

Salida:

"a"
"b"
"c"

Esto es equivalente a:

for key in d.keys():
    print(key)

o en Python 2:

for key in d.iterkeys():
    print(key)

Para iterar a través de sus valores, use:

for value in d.values():
    print(value)

Salida:

1
2
3

Para iterar a través de sus claves y valores, use:

for key, value in d.items():
    print(key, "::", value)

Salida:

a :: 1
b :: 2
c :: 3

Tenga en cuenta que en Python 2, .keys() , .values() y .items() devuelven un objeto de list . Si simplemente necesita iterar el resultado, puede usar el .iterkeys() , .itervalues() y .iteritems() .

La diferencia entre .keys() y .iterkeys() , .values() y .itervalues() , .items() y .iteritems() es que los métodos iter* son generadores. Por lo tanto, los elementos dentro del diccionario se producen uno por uno a medida que se evalúan. Cuando se devuelve un objeto de list , todos los elementos se empaquetan en una lista y luego se devuelven para una evaluación adicional.

Tenga en cuenta también que en Python 3, el orden de los elementos impresos de la manera anterior no sigue ningún orden.

Mientras bucle

A while bucle hará que las sentencias de bucle que se ejecutarán hasta que la condición de bucle es Falsey . El siguiente código ejecutará las instrucciones de bucle un total de 4 veces.

i = 0 
while i < 4:
    #loop statements
    i = i + 1

Mientras que el bucle de arriba fácilmente se puede traducir en una más elegante for bucle, while los bucles son útiles para comprobar si alguna condición se ha cumplido. El siguiente bucle continuará ejecutándose hasta que myObject esté listo.

myObject = anObject()
while myObject.isNotReady():
    myObject.tryToGetReady()

while bucles también pueden ejecutarse sin una condición usando números (complejos o reales) o True :

import cmath

complex_num = cmath.sqrt(-1)
while complex_num:      # You can also replace complex_num with any number, True or a value of any type
    print(complex_num)   # Prints 1j forever

Si la condición es siempre cierta, el bucle while se ejecutará para siempre (bucle infinito) si no se termina con una instrucción break o return o una excepción.

while True:
    print "Infinite loop"
# Infinite loop
# Infinite loop
# Infinite loop
# ...

La Declaración de Pase

pass es una declaración nulo para cuando una instrucción se requiere por la sintaxis Python (tal como dentro del cuerpo de un for o while bucle), pero se requiere ninguna acción o se desee por el programador. Esto puede ser útil como un marcador de posición para el código que aún no se ha escrito.

for x in range(10):
    pass #we don't want to do anything, or are not ready to do anything here, so we'll pass

En este ejemplo, nada pasará. El bucle for se completará sin error, pero no se ejecutará ningún comando o código. pass nos permite ejecutar nuestro código con éxito sin tener todos los comandos y acciones completamente implementados.

Del mismo modo, pass puede ser utilizado en while bucles, así como en las selecciones y definiciones de función, etc.

while x == y:
    pass

Iterando diferentes partes de una lista con diferentes tamaños de paso

Supongamos que tiene una larga lista de elementos y solo está interesado en todos los demás elementos de la lista. Quizás solo desee examinar los primeros o últimos elementos, o un rango específico de entradas en su lista. Python tiene capacidades integradas de indexación fuertes. Aquí hay algunos ejemplos de cómo lograr estos escenarios.

Aquí hay una lista simple que se utilizará a lo largo de los ejemplos:

lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']

Iteración sobre toda la lista.

Para iterar sobre cada elemento de la lista, se puede usar un bucle for como abajo:

for s in lst:
    print s[:1] # print the first letter

El bucle for asigna s para cada elemento de lst . Esto imprimirá:

a
b
c
d
e

A menudo necesitas tanto el elemento como el índice de ese elemento. La palabra clave enumerate realiza esa tarea.

for idx, s in enumerate(lst):
    print("%s has an index of %d" % (s, idx))

El índice idx comenzará con cero e incrementará para cada iteración, mientras que la s contendrá el elemento que se está procesando. El fragmento anterior se mostrará:

alpha has an index of 0
bravo has an index of 1
charlie has an index of 2
delta has an index of 3
echo has an index of 4

Iterar sobre la sub-lista

Si queremos iterar sobre un rango (recordando que Python usa indexación de base cero), use la palabra clave de range .

for i in range(2,4):
    print("lst at %d contains %s" % (i, lst[i]))

Esto daría como resultado:

lst at 2 contains charlie
lst at 3 contains delta

La lista también puede ser cortada. La siguiente notación de segmento va desde el elemento en el índice 1 hasta el final con un paso de 2. Los dos bucles for dan el mismo resultado.

for s in lst[1::2]:
    print(s)

for i in range(1, len(lst), 2):
    print(lst[i])

Las salidas de fragmento de código anteriores:

bravo
delta

La indexación y el corte es un tema propio.

El "half loop" do-while

A diferencia de otros idiomas, Python no tiene una construcción do-until o do-while (esto permitirá que el código se ejecute una vez antes de que se pruebe la condición). Sin embargo, puede combinar un while True con una break para lograr el mismo propósito.

a = 10
while True:
    a = a-1
    print(a)
    if a<7:
        break
print('Done.')

Esto imprimirá:

9
8
7
6
Done.

Bucle y desembalaje

Si quieres recorrer una lista de tuplas por ejemplo:

collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]

En lugar de hacer algo como esto:

for item in collection:
    i1 = item[0]
    i2 = item[1]
    i3 = item[2]
    # logic

o algo como esto:

for item in collection:
    i1, i2, i3 = item
    # logic

Simplemente puede hacer esto:

for i1, i2, i3 in collection:
    # logic

Esto también funcionará para la mayoría de los tipos de iterables, no solo para tuplas.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow