Keywords: easytut

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:`. `lista`es 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.

Siguiente: Expresiones Booleanas Arriba: Tutor de Python para No-programadores Anterior: Listas Contenido
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com