El Bucle FOR-IN
Hay otro tipo de bucle en Python: el bucle for-in, que se puede leer como ((para todo elementode una serie, hacer. . . )).Un bucle for-in presenta el siguiente aspecto:
for variable in serie de valores:
acción
acción
...
acción
La función range (que en inglés significa ((rango))). En principio, range se usa
con dos argumentos: un valor inicial y un valor final (con matices)
Observa que la lista devuelta contiene todos los enteros comprendidos entre los argumentos de la función, incluyendo al primero pero no al último.
La función range devuelve una lista de números enteros. Estudia este ejemplo:
for i in range(1, 6):
print i
Al ejecutar el programa, veremos lo siguiente por pantalla:
1
2
3
4
5
La lista que devuelve range es usada por el bucle for-in como serie de valores a recorrer.
Podemos utilizar la función range con uno, dos o tres argumentos.
♫ Si usamos range con un argumento estaremos especificando únicamente el último valor (más uno) de la serie, pues el primero vale 0 por defecto:
>>> range(5)
[0, 1, 2, 3, 4]
♫Si usamos tres argumentos, el tercero permite especificar un incremento para la serie de valores. Observa en estos ejemplos qué listas de enteros devuelve range:
>>> range(2, 10, 2)
[2, 4, 6, 8]
>>> range(2, 10, 3)
[2, 5, 8]
♫Fíjate en que si pones un incremento negativo (un decremento), la lista va de los valores altos a los bajos. Recuerda que con range el último elemento de la lista no llega a ser el valor final:
>>> range(10, 5, -1)
[10, 9, 8, 7, 6]
>>> range(3, -1, -1)
[3, 2, 1, 0]
Así pues, si el tercer argumento es negativo, la lista finaliza en el valor final más uno (y no menos uno).
♫Finalmente, observa que es equivalente utilizar range con dos argumentos a utilizarla con un valor del incremento igual a 1.
>>> range(2, 5, 1)
[2, 3, 4]
>>> range(2, 5)
[2, 3, 4]
Obi Wan
Puede resultar sorprendente que range(a, b) incluya todos los números enteros comprendidos entre a y b, pero sin incluir b. En realidad la forma ((natural)) o más frecuente de usar range es con un sólo parámetro: range(n) que devuelve una lista con los n primeros números enteros incluyendo al cero (hay razones para que esto sea lo conveniente, ya llegaremos).Como incluye al cero y hay n números, no puede incluir al propio número n. Al extenderse el uso de range a dos argumentos, se ha mantenido la ((compatibilidad)) eliminando el último elemento. Una primera ventaja es que resulta fácil calcular cúantas iteraciones realizará un bucle range(a, b): exactamente b - a. (Si el valor b estuviera incluido, el número de elementos sería b - a + 1.)
Hay que ir con cuidado, pues es fácil equivocarse ((por uno)). De hecho, equivocarse ((por uno)) es tan frecuente al programar (y no sólo con range) que hay una expresión para este tipo de error: un error Obi Wan (Kenobi), que es más o menos como suena en inglés ((off by one)) (pasarse o quedarse corto por uno).
No hay comentarios:
Publicar un comentario