En el artículo anterior agregamos un nuevo tipo de variables: las listas y vimos como definirlas y como acceder a cada uno de sus elementos a través de un índice. Esta es una manera muy conveniente de almacenar información y resulta sumamente útil para muchas aplicaciones, como lo pudimos comprobar con nuestro programa del código de colores. En esta ocasión profundizaremos un poco mas en las propiedades de las listas y añadiremos algunos métodos.
En el artículo previo escribimos un programa que nos devolvía los códigos de colores que debía tener una resistencia a partir de su valor en ohms. En esta oportunidad vamos a hacer lo opuesto: a partir de las bandas de colores vamos a obtener su valor óhmico. Para ello también vamos a usar una lista, ya que es una manera muy cómoda de almacenar distintos valores relacionados entre sí en una única variable.
Los distintos valores almacenados en una lista pueden ser accedidos a través de su índice, que es un indicador de la posición que ocupa ese valor en la lista, comenzando en cero. Si tenemos la lista con los colores usados en las resistencias, tal como esta:
colores = [“NEGRO”, “MARRÓN”, “ROJO”, “ANARANJADO”, “AMARILLO”, “VERDE”, “AZUL”, “VIOLETA”, “GRIS”, “BLANCO”]
Entonces “NEGRO” está guardado en la primer posición (que tiene como índice 0), y podemos acceder a él de la siguiente forma:
colores [0]
De la misma forma colores [1] contiene “MARRÓN”, colores [2] “ROJO” y así hasta el último índice que es 9.
Una manera simple de recorrer una lista, para por ejemplo imprimir todos los valores almacenados es usando la instrucción for que ya conocemos y que usamos en combinación con range para hacer repeticiones. Si escribimos algo como:
for color in colores:
Estaremos iniciando una repetición en la que la variable “color” va a ir tomando cada uno de los valores que tiene la lista “colores”. Veamos si es cierto:
Volviendo a nuestro proyecto, obtener el color de la banda dado el valor numérico es fácil porque tenemos la lista de colores ordenada y el índice se corresponde precisamente con el valor numérico. Si el primer dígito es 4, en colores [4] tenemos guardado “AMARILLO”, el color que corresponde al 4. Fácil. Pero ahora queremos hacer al revés, es decir, teniendo como dato “AMARILLO”, averiguar a que número corresponde.
Con lo que aprendimos recién del uso del for podemos ensayar una solución: podríamos explorar toda la lista comparando cada elemento con el color que buscamos y guardar el número correspondiente cuando lo encontremos. Probemos:
Analicemos este código: En la línea 1 definimos la lista con todos los colores y en la línea 4 pedimos al usuario que ingrese un color, digamos el de la primera banda.
En la línea 6 inicializamos a cero una variable auxiliar llamada “x”. En la línea 7 preparamos el for para explorar toda la lista: “color” irá tomando cada uno de los diez valores. Luego, en la línea 8 preguntamos si el valor actual de “color” es igual al que ingresó el usuario. Si es así (línea 9) guardamos x en la variable “dig1”, que será la que contenga el valor numérico correspondiente al color. En la línea 10 sumamos 1 a x y volvemos a repetir. De esta manera, para el primer color x vale 0, para el segundo 1 y así sucesivamente, haciendo una correspondencia con los colores.
Funciona, aunque es un poco rebuscado. Habrá otra forma más simple?
Afortunadamente si hay una forma mas simple, empleando esta instrucción:
lista.index (valor)
Donde “lista” es el nombre de la lista y “valor” el elemento cuyo índice queremos hallar.
Definitivamente es mas simple. Pero ¿qué significa el punto entre el nombre de la lista e “index”? Esta es una forma de escribir en Python que no habíamos visto antes. Es que la lista es un “objeto ” e index es un “método” de ese objeto. Ya profundizaremos mas adelante el tema de los objetos y sus métodos.
Usando el método index nuestro programa se simplifica bastante. Una primera versión para obtener los colores de las tes bandas podría ser algo como lo que sigue:
Sólo quedaría pasar la información del primer y segundo dígito y la cantidad de ceros a un valor numérico. En el caso de los dos primeros dígitos podemos resolverlo si los vemos como formando un número. Por ejemplo “12”. En este caso, el primer dígito indica la cantidad de decenas y el segundo, la de unidades. Podemos “armar” el valor numérico entonces de la siguiente forma:
resistencia = (10*dig1 + dig2)
Volviendo al ejemplo, si dig1=1 y dig2=2, tendremos:
resistencia = (10*1) + 2 = 10 + 2 =12
Faltaría agregar la información de la tercer banda, el multiplicador o cantidad de ceros. Veamos algunos casos:
Si la cantidad de ceros es “2”, equivale a multiplicar por 100
Si la cantidad de ceros es “1”, equivale a multiplicar por 10
Si la cantidad der ceros es “0”, equivale a multiplicar por 1
Es decir que el valor multiplicador es una potencia de 10, mas precisamente 10 elevado a la cantidad de ceros, ya que:
10**2 = 100
10**1 = 10
10**0 =1
(El operador “**” se emplea en Python para la potenciación)
Poniendo todo junto, el valor de la resistencia a partir de los datos de las tres bandas será:
resistencia = (10*dig1 + dig2) * 10**ceros
Probemos el código a ver si funciona (Observa que ahora la lista de colores contiene el valor “MARRON” sin acentos)
En este programa hay muchas cosas que pueden salir mal. Por ejemplo, ¿que sucede si ingresamos el texto de uno de los colores en minúsculas? Como la lista contiene textos en mayúsculas, al buscar uno que está en minúsculas no lo encontrará. Lo mismo sucede si escribimos un color inexistente, o si cometemos un error de ortografía. Lo primero, las minúsculas, puede ser subsanado empleando otro método de las listas que pasa todos los caracteres a mayúsculas: lista.upper. Recuerdan que en el artículo anterior vimos que los textos podían tratarse como listas, para acceder a cada una de las letras? Bien, los métodos de las listas pueden aplicarse también a los textos. Con upper podemos pasar todas las letras de un texto a mayúsculas, de la siguiente forma:
Con upper entonces, si el usuario ingresa minúsculas en el texto, estas serán pasadas a mayúsculas asegurándonos así que estén igual que los valores de la lista.
La segunda fuente de error es introducir un color inexistente. En ese caso, el método index devolverá un error deteniendo el programa, algo que no deseamos. En este caso lo único que podemos hacer es evitar el error, por ejemplo, inspeccionando la lista previamente en busca del color ingresado. Esto se puede realizar de la siguiente forma:
Con estas modificaciones, el programa quedaría como sigue:
En el siguiente artículo seguiremos viendo nuevas funciones del lenguaje Python!