next up previous contents
Siguiente: Expresiones Booleanas Arriba: Tutor de Python para No-programadores Anterior: Listas   Contenido

Rizos For

Y aquí está en nuevo ejercicio de escritura para este capítulo:
unoadiez = range(1,11)
for cuenta in unoadiez:
print cuenta
y la siempre presente salida:
1
2
3
4
5
6
7
8
9
10
La salida es muy familiar, pero el código es muy diferente. El primer renglón usa la función range. La función range usa dos argumentos del siguiente modo: range(comienzo,final). comienzo es el primer número producido.  final es uno más que el último número.  Observe que este programa puede ser más corto:
for cuenta in range(1,11):
print cuenta
Estos son algunos ejemplos para mostrar lo que sucede con el comando range:
>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(-32, -20)
[-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21]
>>> range(5,21)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> range(21,5)
[]
El siguiente renglón for cuenta in unoadiez: usa la estructura de control for.  Una estructura de control for tiene la siguiente apariencia for variable in lista:. listaes recorrida empezando con el primer elemento hasta el final.  A medida que for recorre cada elemento de una lista, pone cada uno dentro de variable.  Esto permite que  variable  sea usada cada vez que el rizo for da una vuelta.  He aquí otro ejemplo (este no tiene que escribirlo) como demostración:
demolista = ['vida',42, 'el universo', 6,'y',7,'todas las cosas']
for articulo in demolista:
print "El articulo actualmente es:",
print articulo
La salida es:
El articulo actualmente es: vida
El articulo actualmente es: 42
El articulo actualmente es: el universo
El articulo actualmente es: 6
El articulo actualmente es: y
El articulo actualmente es: 7
El articulo actualmente es: todas las cosas
Observe cómo el rizo for recorre la lista y sucesivamente hace que cada elemento sea el valor de articulo.  (Vea cómo, si no desea que print empiece otro renglón, añada una coma al final del enunciado(p. ej., si desea imprimir algo en el mismo renglón). )  Entonces, ¿para qué sirve for? (uf)  El primer uso es para recorrer todos los elementos de una lista y hacer algo con ellos . Veamos un modo rápido para sumar todos los elementos:
lista = [2,4,6,8]
suma = 0
for num in lista:
suma = suma + num
print "La suma es: ",suma
y la salida es simplemente:
La suma es:  20
O pudiera escribir un programa para descubrir si hay duplicados en una lista, tal como el siguiente programa:
lista = [4, 5, 7, 8, 9, 1,0,7,10]
lista.sort()
prev = lista[0]
del lista[0]
for cosa in lista:
if prev == cosa:
print "Encontre un duplicado de ",prev
prev = cosa
y para que vean que sí funciona:
Encontre un duplicado de 7
Muy bien, entonces, ¿cómo funciona?  Le presento una versión especial para depuración para explicar mejor (no necesita escribir esto):
l = [4, 5, 7, 8, 9, 1,0,7,10]
print "l = [4, 5, 7, 8, 9, 1,0,7,10]","\tl:",l
l.sort()
print "l.sort()","\tl:",l
prev = l[0]
print "prev = l[0]","\tprev:",prev
del l[0]
print "del l[0]","\tl:",l
for elemento in l:
if prev == elemento:
print "Encontre un duplicado de ",prev
print "si prev == elemento:","\tprev:",prev,"\telemento:",elemento
prev = elemento
print "prev = elemento","\t\tprev:",prev,"\telemento:",elemento
y la salida es:
l = [4, 5, 7, 8, 9, 1,0,7,10]   l: [4, 5, 7, 8, 9, 1, 0, 7, 10]
#sort() reduce el numero de comparaciones,
#porque asi los duplicados seran elementos consecutivos
l.sort() l: [0, 1, 4, 5, 7, 7, 8, 9, 10]
prev = l[0] prev: 0
del l[0] l: [1, 4, 5, 7, 7, 8, 9, 10]
si prev == elemento: prev: 0 elemento: 1
prev = elemento prev: 1 elemento: 1
si prev == elemento: prev: 1 elemento: 4
prev = elemento prev: 4 elemento: 4
si prev == elemento: prev: 4 elemento: 5
prev = elemento prev: 5 elemento: 5
si prev == elemento: prev: 5 elemento: 7
prev = elemento prev: 7 elemento: 7
Duplicate of 7 Found
si prev == elemento: prev: 7 elemento: 7
prev = elemento prev: 7 elemento: 7
si prev == elemento: prev: 7 elemento: 8
prev = elemento prev: 8 elemento: 8
si prev == elemento: prev: 8 elemento: 9
prev = elemento prev: 9 elemento: 9
si prev == elemento: prev: 9 elemento: 10
prev = elemento prev: 10 elemento: 10
La razón por la cual puse tantos enunciados print en el código es para que usted pueda ver lo que sucede a cada paso. (Por cierto, si alguna vez no puede descubrir porqué un programa no funciona, intente poniendo muchos enunciados print para que pueda ver lo que está sucediendo).  Primero el programa empieza con una aburrida lista.   Luego el programa ordena la lista, esto es para que los duplicados sean consecutivos. El programa luego declara la variable (para el valor) prev(io).  Luego, el primer elemento de la lista es borrado para no pensar incorrectamente que es un duplicado.  Luego entramos en el rizo for.  Cada elemento de la lista es comparado contra el valor previo.  Si es igual, hemos encontrado un duplicado.  Cambiamos entonces el valor de prev de modo que a la siguiente vuelta del rizo, el valor de prev sea el elemento previo al actual.  Como era de esperarse, encontramos un duplicado para 7. (Vea cómo \t es usado para imprimir un "tab".)

El otro modo de usar rizos for es para hacer algo un cierto número de veces.  Aquí está el código para imprimir los primeros 11 números de la serie de Fibonacci:

a = 1
b = 1
for c in range(1,10):
print a,
n = a + b
a = b
b = n
y la sorprendente salida:
1 1 2 3 5 8 13 21 34
Todo lo que uno pueda hacer con rizos for lo puede uno hacer con rizos while pero los rizos for proporcionan un modo muy fácil de recorrer todos los elementos de una lista o hacer algo un cierto número de veces.


next up previous contents
Siguiente: Expresiones Booleanas Arriba: Tutor de Python para No-programadores Anterior: Listas   Contenido
Josh Cogliati jjc@honors.montana.edu
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com