Buscar (Don't Edit)

lunes, 25 de febrero de 2013

Aprendiendo a Programar con Python IV: Ciclos y Listas

Aquí estamos de nuevo con una nueva parte de esta serie de tutoriales "Aprendiendo a Programar con Python", y ya vamos por la IV parte. Como prometí en el tutorial anterior, esta vez le pisamos un poquito al acelerador y nos meteremos de lleno en los ciclos for y while, y los tipos lista, aunque de entrada vamos a abarcar unas cuantas operaciones básicas con cadenas que se me habían escapado pero que considero necesaria su revisión para poder abarcar los demás temas.

Más Operaciones con Cadenas

Comparación

Los operadores de igualdad o desigualdad pueden ser aplicados a cadenas:
Podemos comparar dos cadenas por orden alfabético:

La capitalización también importa, las letras mayúsculas son menores que las letras minúsculas:

También podemos hacer ciertas comparaciones entre distintos caracteres:

Podemos comparar caracteres con números por igualdad:



Subcadenas

El operador in revisa si una cadena aparece dentro de otra cadena.


Longitud de cadenas: función len

La función pre-construida len retorna el número de caracteres en una cadena:


Indexación

Un índice es una posición dentro de una cadena. Los índices se cuentan positivamente empezando desde el lado izquierdo hacia la derecha con el primer caracter con índice 0, el segundo con índice 1, y así sucesivamente. Los índices se cuentan negativamente desde el lado derecho con  el último caracter con índice -1, el penúltimo -2, y así sucesivamente. Por ejemplo:

El primer caracter de la cadena se encuentra en el índice 0. Podemos navegar a través de las cadenas mediante los índices:

Cortando cadenas

Podemos extraer más de un caracter de una cadena aplicando un 'corte'. Un 'corte' se realiza proporcionando un índice inicial y uno final de una cadena; el resultado es una subcadena que contiene los caracteres contenidos en los índices proporcionados sin incluir el índice final. Por ejemplo:

Generalmente, el final de una cadena es representado con su longitud:

Si omitimos el índice final, Python considera la longitud de la cadena (len(c)) por default:

De manera similar si omitimos el índice inicial, Python tomará por default el índice 0:

Los índices negativos también pueden ser usados para realizar cortes: 

Modificando cadenas

Los cortes y la indexación son operaciones que no modifican las cadenas sobre las que actúan. Al querer realizar esto, Python nos arroja un error de tipo TypeError:

Imaginemos que queremos cambiar la cadena c para que sea 'moztroPythondev'. Para eso hacemos lo siguiente:

Métodos y Cadenas

Métodos
Un método es una función dentro de un objeto. La forma general para llamar un método es:
objeto.metodo(argumentos)

Métodos de cadena
Consideremos la siguiente cadena:

Para averiguar que métodos hay para cadenas, usamos la función dir:

En algunos de los métodos cadena, lo que retorna es una nueva cadena sin cambiar la original. Por ejemplo podemos obtener una versión en mayúsculas de nuestra cadena con el método upper, pero esto no cambiará nuestra variable cadena:
   
Para obtener información sobre lo que realiza cada método de nuestro objeto, hacemos lo siguiente:

Ciclos
En programación, los ciclos son instrucciones que ejecutan un cuerpo de instrucciones un número determinado de veces.
Ciclo for

La forma general de un ciclo for sobre un objeto es:
for variable in objeto:
cuerpo de instrucciones
La variable se refiere a cada elemento en turno dentro del objeto, el ciclo for ejecuta el cuerpo de instrucciones una vez por cada variable existente dentro del objeto Por ejemplo:


Contadores numéricos
Consideremos el siguiente código, donde la variable n_vocales es un contador:

En la función anterior, el ciclo ejecuta las instrucciones sobre cada caracter dentro de la cadena, y cuando el caracter en turno es una vocal, la condición evalúa a True y la variable n_vocales se incrementa en 1.
La variable n_vocales es un contador ya que acumula información. Su valor inicial era 0 y al final de la función su valor es equivalente al número de vocales dentro de cadena.

Contadores de cadena

Veamos otro ejemplo de contadores, pero ahora utilizando cadenas:
La variable vocales en un principio hace referencia a una cadena vacía, pero al finalizar la función acumula las vocales contenidas en cadena.

Ciclo while
La forma general de un ciclo while es:
while condicion:
instrucciones
Veamos el siguiente ejemplo
La condición numero < 10, es evaluada, y retorna un True (debido a que el valor inicial de numero es igual a 0) y se ejecutan las instrucciones. La condición del ciclo es revisada nuevamente (ahora el valor de numero se ha incrementado en 1) y nuevamente retorna True, y las instrucciones se ejecutan de nuevo. Esto continúa hasta que la condición retorna un False, es decir, cuando numero equivale a 10. En el ejemplo anterior hay 10 iteraciones, es decir, las instrucciones del ciclo se ejecutan 10 veces.


Tipo list

En programación frecuentemente se trabaja con colecciones de datos. Una de las maneras para almacenar esas colecciones son las listas.
La forma general de una lista es:
[dato1, dato2, ..., datoN]
Por ejemplo a continuación tenemos una lista con 3 elementos:
lista = [10, 60, 30]

Operaciones con listas

Al igual que las cadenas, las listas pueden ser indexadas:
 

También podemos realizar cortes en listas, de la misma forma que con las cadenas:
      

El operador in puede ser utilizado para saber si se encuentra un elemento en la lista.
   

Varias de las funciones pre-construidas de Python pueden ser aplicadas a las listas, por ejemplo:
  • len(lista): retorna la longitud de la lista.
  • min(lista): retorna el elemento mas pequeño de la lista.
  • max(lista): retorna el elemento mas grande de la lista.
  • sum(lista): retorna la suma de elementos de la lista (para elementos numéricos).


Tipo de elementos en listas

Las listas pueden ser de cualquier tipo, por ejemplo de cadenas:


Las listas también pueden contener mas de un solo tipo. Por ejemplo, para representar un domicilio:

Ciclos for sobre listas

De manera similar a como realizamos iteraciones sobre los caracteres de una cadena, es posible hacerlo sobre los elementos de una lista:

Modificando listas


Las listas pueden ser modificadas. Veamos algunos ejemplos: 

Función range
A veces es útil poder generar un rango de números, para esas veces donde necesitamos indizar una serie de elementos por mencionar algo. La función range de Python hace exactamente eso. Cuando llamamos a la función range con un simple argumento int se produce un rango de números que empiezan desde 0 hasta el argumento como tope, pero sin incluir ese argumento. La sintaxis es la siguiente:
La función range se utiliza frecuentemente con un ciclo for.

En los siguientes ejemplo vemos el uso de la función range con 2 y 3 argumentos. En el primer ejemplo pasamos 2 argumentos y Python interpreta que le estamos indicando el principio y final del rango sobre el cual queremos iterar. Para el segundo ejemplo, tenemos un tercer argumento que indica el incremento que tendrá nuestro rango después de cada iteración. 
Ejercicios: Número mayor y número menor
Para todos los que hemos estudiado programación, en nuestros inicios nos ha tocado realizar este tipo de programas en lo que, dentro de una serie de números, teníamos que determinar que número tenía el valor mas grande o cuál el más pequeño. Veamos la siguiente función:
Probamos la función en el Shell:
Ciertamente esto es correcto y resuelve el problema, pero únicamente para una serie de 2 números. En casos reales, nunca tendremos un rango estático de valores a comparar, y si en lugar de 2 fueran 3, o 8, o miles de números. Obviamente no haremos miles de condicionales para comparar. ¡Para eso tenemos ciclos y listas! Veamos otra manera de resolverlo.
Para hacer este ejercicio mas dinámico, definiremos una función que nos permita crear una lista con rango y números aleatorios, de la cual obtendremos los valores mayor y menor.
La función para crear la lista aleatoria es la siguiente:
Para generar números aleatorios, tendremos que importar el módulo random. Éste módulo genera valores aleatorios entre un rango determinado de valores, por lo que tendremos que indicar entre que límites se encontrarán los valores de nuestra lista.  Nuestra función recibe 3 parámetros:
  • elementos, es el número de elementos que contendrá nuestra lista
  • rango_inf, es el límite inferior, es decir, el número menor que puede ser generado dentro de nuestra serie de valores.
  • rango_sup, es el límite superior, es decir, el número mayor que puede ser generado dentro de nuestra serie de valores.
Lo primero que haremos será crear una lista vacía donde guardaremos nuestros valores aleatorios y un índice para indicar la posición en que se irán guardando los elementos, como nuestra lista aún esta vacía el índice es 0.
A continuación creamos un ciclo while que irá iterando los índices de la lista hasta llegar al tope elementos (el número de elementos totales en la lista). Dentro del cuerpo de nuestro ciclo creamos un valor entero aleatorio mediante el la función randint del módulo random, aquí tendremos que pasarle los argumentos de rango_inf y rango_sup, para que genere un valor aleatorio entre ese rango y lo guarde en la variable item(item = random.randint(rango_inf, rango_sup)). Posteriormente añadiremos nuestro item con valor aleatorio a nuestra lista mediante la función insert que recibe 2 parámetros: la posición del índice actual donde se insertará el valor y el valor generado (lista.insert(i, item)). A continuación incrementamos nuestro índice para continuar con la iteración (i += 1).
Por último lo único que tenemos que hacer es retornar nuestra lista con valores aleatorios return listaVeamos como funciona esto en el Shell:
La primera instrucción nos devuelve una lista de 10 elementos entre 1 y 100. La segunda crea una lista de 50 elementos entre 1 y 1000, y la guarda en la variable mi_lista.
Ya que tenemos nuestra función generadora de listas aleatorias, vayamos con las funciones para obtener los valores mayor y menor.
Ambas funciones trabajan de manera similar, reciben una lista de números y guardan el primer valor de esa lista en una variable que servirá para comparar el resto de elementos de la lista. A través de un ciclo for se iteran los valores de la lista y la condicional if compara si el valor es mayor o menor que la variable, si esto es cierto se reemplaza el valor y al final del ciclo se retorna. Veamos esto en el Shell:
Como pueden observar esto es mucho más funcional que nuestra función anterior para obtener los valores mayor y menor dentro de un conjunto de números.
Listas anidadas
Como ya mencionamos anteriormente, las listas pueden contener elementos de más de un tipo, incluyendo listas. A esto es lo que llamamos listas anidadas. Veamos un ejemplo:
Para poder acceder a los elementos anidados, primero tenemos que seleccionar la sublista, y después tratar el resultado como una lista normal.
Otra manera de acceder a los subelementos es a través de un índice y un subíndice.

Ciclos anidados
Los cuerpos de los ciclos pueden contener cualquier tipo de instrucción, incluyendo otros ciclos. A ésto se le conoce como ciclos anidados. 
En el ejemplo de arriba primero iteramos sobre la lista de calificaciones para acceder a las sublistas, para después iterar sobre los elementos de esas sublistas. En la primera iteración, obtenemos la primer sublista que sería ['Cálculo', 80], ahora en el segundo ciclo iteramos sobre esta sublista para acceder a los elementos 'Cálculo' y 80 mandándolos a imprimir. Por cierto, la etiqueta end es para evitar el salto de línea después de cada print y no nos quede algo como lo siguiente:
Eso será todo por ahora, creo que esta vez extendí el tutorial un poco más de lo acostumbrado, pero fue para acelerar un poco el paso y entrar de una vez por todas en los ciclos. Para el siguiente tutorial abarcaré archivos y quien sabe, quizás empecemos a ver algo de Orientación a Objetos. 
Nos vemos, suerte y hasta la próxima.

No hay comentarios.:

Publicar un comentario