Python Language
Bucles
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.