bclose

Mas sobre Python for y While

volviendo al for y presentando while

 

For y while en Python

 

 

    • Seguimos viendo mas temas sobre la instrucción for.
    • Jugamos un poco con las strings (Muy poco)
    • Presentamos el bucle While de Python 
 

 

 Material requerido.

Vista mayorRaspberry Pi 3 o equivalente

 

 Mas sobre Python y for.

 

Ya hemos visto varias opciones posibles con for, parece que no hay mucho más que ver, pero el caso es que aún queda alguna munición que disparar.

En la última sesión vimos cómo usar el range en combinación con el for y vimos que podíamos usarlo cómodamente para generar números dentro de un rango de acuerdo a unas ciertas reglas y vimos que podías usar listas de números enteros crecientes o decrecientes e incluso usar un escalón o salto entre dos números consecutivos en el rango, como en:

Range es muy cómodo de usar cuando los números que queremos asignar cumplen una cierta progresión numérica, pero un poco menos útil cuando los números que queremos no siguen ninguna relación y por eso en la sesión anterior usamos la numeración de los pines GPIO en el modo BCM o broadcom, para conseguir 10 GPIO consecutivos que pudiese incluir en la instrucción for range.

Pero tengo que confesaros un secreto. En realidad os engañe un poco (Y me encanta, que queréis que os diga). Os presenté las cosas de ese modo porque es lo que alguien que venga de C++ o Java espera que sea el for, pero Python es mucho más versátil de lo que parece a primera vista, y en esa cláusula hay un pequeño secreto.

Python puede iterar lo que hay en el “for x in range”, al especificar un rango numérico… pero tambien puede recorrer una lista de números sin más, como por ejemplo:

>>> for x in (3,4,6,2,8,14):
     print (2*x) 
6                   
8
12
4
16
28

Fíjate que ni siquiera necesita que los números sean consecutivos. Le basta con que le pasemos lo que en Python se llama un elemento iterable. En este caso una lista, de las que tendremos que hablar largo y tendido en un futuro próximo, pero que consiste simplemente en una colección de números separados por comas entre paréntesis.

Así pues, nuestro programa Blink_2 de la sesión anterior, no necesita que usemos 10 pines consecutivos para que la instrucción for los recorra cómodamente. Podriamos escribirlo de esta otra manera que es completamente equivalente:

import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)

for  x in range ( 16, 26):
    gpio.setup(x, gpio.OUT)

for  x in range ( 16, 26):
    gpio.output(x, True)
    time.sleep(0.15)
    gpio.output(x, False)
    time.sleep(0.15)

Sino que tranquilamente podíamos haber elegido el modo de numeración GPIO externo con

gpio.setmode(gpio.BOARD)

A condición después de pasarle al for la numeración externa de los pinos alegremente, tanto si son consecutivos como si no, con lo que podríamos sustituir las líneas:

gpio.setmode(gpio.BCM)
for  x in range ( 16, 26):

Por estas otras:

gpio.setmode(gpio.BOARD)
for  x in (36, 11, 12, 35, 38, 40, 15, 16, 18, 22 ):

Sin que se note la diferencia (No te fíes de mi pruébalo), Pero claro está, si hago eso en la primera sesión vacío la plazo en un momento y en cambio ahora ya estáis familiarizados con la instrucción for. ¿Qué te parece? ¿A que es elegante?

Para mi gusto, la primera forma que usamos en la última sesión, es mucho más elegante que una enumeración de pines, pero si por cualquier motivo prefieres usar una de las dos formas de referenciar los GPIO tiene una solución tan sencilla como esta.

 

El for y los Strings

 

No hemos entrado con los Strings aun. Pero para los que son nuevos, diremos que un String es una colección de caracteres entrecomillados, o sea un texto como por ejemplo:

A = “Buenos días”

Volveremos mucho más detenidamente sobre los Strings, en un futuro próximo, pero no quería dejar pasar la ocasión de mostraros que otro ejemplo de lista iterable con un for puede ser una lista de Strings, que simplemente es una lista de textos entre comillas, separados por comas:

>>> for x in ("uno","dos","tres","cuatro"):
     print(x)    
uno
dos
tres
cuatro

De nuevo Python da muestras de ser especial, no le importa mucho lo que le pases siempre que contenga elementos que él pueda recorrer. Por eso cuando hacemos una cláusula del tipo de:

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

Lo importante es el in, porque es lo que la instrucción for, va a iterar. El range lo que hace es generar sobre la marcha esa lista de números de acuerdo al patrón que le especificamos.

Pero no creas que solo podemos usar cosas así. For acepta jugar con Strings de un modo muy cómodo, como por ejemplo haciendo lo siguiente:

a = "Buenos dias"
for x in range(len(a)):
     print(a[x])
B
u
e
n
o
s

d
i
a
s

Para los que hayáis programado en C++, como los que venís de Arduino, lo de arriba tiene mucho sentido porque veis la variable a como una String que recorremos hasta su longitud final.

 
  • len(a) es una funcion Python que devuelve el numero de caracteres que hay en la variable en cuestión. 

Sin embargo Python puede descolocaros un poco con algo como esto, que es exactamente igual que lo anterior:

a = "Buenos dias"
for x in range(len(a)):
     print(x)
B
u
e
n
o
s

d
i
a
s

Python entiende que una String es un elemento iterable, y por ello va recorriendo sus caracteres constituyentes en orden y sin cortarse un pelo.

Este modo de aceptar listas (y otras cosas iterables) es algo que le da a Python una potencia sorprendente que es muy útil en muchas ocasiones.

 

El bucle while

 

La instrucción for, efectúa un bloque de instrucciones, que siguen a los dos puntos, un número definido de veces.  Pero a veces, no sabemos muy bien cuantas veces debemos ejecutar el bloque de instrucciones porque queremos que salga cuándo se cumpla una condición dada.

Por ejemplo, podemos hacer un programa que nos pida un número y lo eleve al cuadrado. Podemos repetir esto hasta que se cumpla una condición de salida, por ejemplo que el número que le damos sea 0.

El programa repetirá el bucle pidiéndonos números que el elevará al cuadrado alegremente y sin ningún sentido hasta que le demos el número 0, en cuyo caso entenderá que queremos librarnos ya de semejante sandez.

Afortunadamente todos los lenguajes de programación disponen de una instrucción como esta y en el 90% de los casos se llama While. Podríamos usarla para empezar escribiendo un programa muy sencillo como este:

# Calculo de los cuadrados con condición de salida

while(True):
    a = input("Dáme un numero: ")
    a= int(a)
    print("El cuadrado de ",a," es: ", a*a)
print("-----------")

En primer lugar, fíjate que hemos usado el símbolo “#” para indicar que lo que sigue es un comentario hasta el cambio de línea.

 
  • Recuerda que es muy buena política escribir comentarios en tus programas, porque si vuelves a ellos al cabo de 3 meses no recordaras nada de lo que hoy te parece evidente.
  • Hazte un favor y comenta profusamente tus programas. Me lo agradecerás

La siguiente línea:

while(True):

Indica que repitamos lo que vienen el bloque de instrucciones a continuación ad infinitum, es decir que para salir de aquí tenemos que romper la ejecución del programa. Luego veremos cómo.

La idea es que la instrucción while evalúa a true o false la condición que le pasamos entre paréntesis. Si es true, ejecuta el bloque. Si es falsa, simplemente termina la ejecución del bucle.

Como en todas las instrucciones que afectan a bloques de múltiples instrucciones, al final de la línea hay un símbolo “:” para indicarlo. No incluirlo sería un error fulminante.

Por ultimo lo que recogemos con input es siempre un String de texto, y tenemos que convertirlo a numero si queremos operar con él, para eso es int(a)

Por último, este programa continuará aburriéndote a base de pedirte números para elevarlos al cuadrado y tú te vas a cansar mucho antes que él. Pero no hay modo de terminar este programa si no es rompiéndolo, porque no especificamos ninguna condición de salida.

Por eso vamos a tener que terminar el programa por las malas con [CTRL]+D o [CTRL]+C, algo que podéis usar si en el futuro os encontráis en una situación como esta.

Dáme un numero:
Traceback (most recent call last):
File “C:/Python35/cuadrado.py”, line 5, in <module>
a = input(“Dáme un numero: “)
File “C:\Python35\lib\idlelib\PyShell.py”, line 1386, in readline
line = self._line_buffer or self.shell.readline()
KeyboardInterrupt

¿Y cómo podemos modificar el programa para que haya una salida un poco más elegante? Basta con especificar por ejemplo que cuando a tenga el valor 0, termine. Podríamos escribir algo como esto:

 

# Calculo de los cuadrados con condición de salida
a= 1

while(a > 0):
    a = input("Dáme un numero: ")
    a= int(a)
    print("El cuadrado de ",a," es: ", a*a)
print("-----------")

Hacemos que a tenga un valor inicial de 1, para que se cumpla la primera vez la condición de que se ejecuta el bucle y todo sigue si ritmo hasta que demos el valor 0:

Dáme un numero: 7
El cuadrado de  7  es:  49
Dáme un numero: 3
El cuadrado de  3  es:  9
Dáme un numero: 0
El cuadrado de  0  es:  0
-----------

Es un poco feo que nos calcule el cuadrado de 0 también, pero por ahora, lo ignoraremos convenientemente, hasta que veamos mas instrucciones que nos ayudarán a evitarlo.

 

 

Resumen de la sesión

 

 

    • Vimos un poco mas detalle las posibilidades de la instruccion for.
    • Jugamos muy inicialmente con for aplicado a listas y strings para ver sus posibilidades
    • Presentamos la instruccion for.
    • Hicimos algunos pequeños programas con While y recordando la instruccion Input.