Ej. 32 : Aprendiendo con bucles y listas…

Ahora puedo hacer programas mucho más interesantes.

Sin embargo, los programas también necesitan hacer cosas de manera repetitiva y muy rápida.

En éste ejercicio voy a utilizar un bucle para generar e imprimir varias listas.

Antes de usar un bucle for, necesitamos una forma de almacenar en algún lugar los resultados del bucle. La mejor manera es hacerlo es una lista. Una lista es exactamente lo que dice su nombre, un contenedor de cosas que están organizadas en orden. No es complicado. Sólo hay que aprender una sintaxis nueva. Ésta es la forma de crear una lista:

hairs = [‘brown’, ‘blond’, ‘red’]

eyes = [‘brown’, ‘blue’, ‘green’]

weights =[1, 2, 3, 4]

Lo que hago es empezar la lista con el corchete izquierdo para abrir la lista. Luego escribo cada uno de los elementos que deseo que contenga la lista. Igual que hacía con los parámetros de las funciones. Por último, termino y cierro con corchete derecho. Python toma ésta lista y todo su contenido, y lo asigna a una variable.

Creo algunas listas usando bucles y las muestro en pantalla:


Ej. 32 - Editor Ej. 32 - Terminal

NOTA: A muchos cerebros les han enseñado que el mundo es plano. En el ejercicio anterior, tenía sentencias del tipo if dentro de otro if. Para algunos, «anidar» unas cosas dentro de otras puede dar lugar a confusión. En programación ésto está por todos lados. Encontraré funciones que llaman a otras funciones que tienen sentencias if y listas con listas dentro de listas. Ante problemas, sugiero papel y lápiz, para un análisis manual.

PREGUNTAS

P: ¿Cómo se hace una lista de dos dimensiones?

R: De una forma similar a ésta: [[1, 2, 3], [4, 5, 6]].

P: ¿Es lo mismo una lista que un array?

R: Interesante. Depende del lenguaje y la implementación. Estrictamente, las listas son muy diferentes a los arrays debido a la forma de implementación. En Ruby, las listas se denominan arrays. En Python, nos referimos a ellas como listas. Por ahora las llamamos listas, ya que Python las llama así.

P: ¿Cómo puede un bucle for usar una variable que no había sido definida antes?

R: La variable queda definida en el bucle y toma un valor en cada iteración.

P: Mmmmm. ¿Y qué es una iteración?

R: De momento, voy a remitirme a las palabras de Wikipedia…

En programación, Iteración es la repetición de un proceso dentro de un programa de computadora. Puede usarse tanto como un término genérico (como sinónimo de repetición) así como para describir una forma específica de repetición con un estado mutable (el ejercicio es el segundo caso).

Cuando se usa en el primer sentido, la recursividad es un ejemplo de iteración, pero que usa su propia notación (notación recursiva), que no es el caso de iteración.

Sin embargo, cuando se usa en el segundo sentido (caso más restringido), como vemos en el ejercicio, la iteración describe el estilo de programación usado en lenguajes de programación imperativa. Esto está en contraposición de la recursividad, la cual tiene un enfoque más declarativo.

He aquí un ejemplo de iteración basándose en asignación destructiva, en pseudocódigo imperativo:

 var i=0, a := 0        // inicializo a antes de comenzar la iteración
 for i from 1 to 3 {  // ciclo 3 veces
     a = a + i       // incremento a con el valor actual de i
     print a              // se imprime el número 6
     }

En este fragmento de programa, el valor de la variable i cambia a medida que la ejecución del programa progresa, tomando los valores 1, 2 y 3. Este cambio de valor —o estado mutable— es característico de una iteración.

Es un tema que da para mucho. Lo retomaré.

P: ¿Qué hace la función range exactamente?

R: Vamos a preguntar a pydoc:

Pydoc - range

P: ¿Por qué for i in range (1, 3): sólo tiene dos iteraciones en lugar de tres?

R: La función range () va del primer al último número, pero no incluye el último. Así que se detiene en dos, no en tres. Es la forma más común de funcionamiento de éste tipo de bucles.

P: ¿Qué hace elements.append () ?

R: Simplemente añade algo al final de la lista. Abre la línea de comandos de Python y prueba ejemplos con cada lista que crees. Así se ve mejor.

PENDIENTE

  1. Buscar info en la documentación de Python sobre las listas. ¿Qué otras operaciones se pueden usar para añadir elementos a las listas?
  2. Profundizar sobre iteración y recursividad.

Ej. 18 : Nombrando funciones…

Bueno.

Pues ya he llegado a la mayoría de edad.

Los 17 han sido complicados, pero es lo que tiene madurar.

Pero la cosa ahora sí empieza a ponerse interesante.

Aunque lo que más me gusta de la economía son las matemáticas (como concepto teórico y como herramienta), voy a empezar desde el principio. De la manera más simple que se puede utilizar ahora…

Las funciones hacen 3 (gran número) cosas:

  1. Nombran fragmentos de código de igual manera que las variables nombran cadenas y números.
  2. Toman argumentos de igual manera que sus programas toman argv.
  3. Usando el punto 1 y 2, nos permiten crear nuestros propios «miniprogramas» o «pequeños comandos».

En Python puedo crear una función mediate el uso de la palabra def. Voy a crear cuatro funciones diferentes que funcionan como sus programas y luego motraré cómo está relacionada cada una.

Ej.18 Programa

Lo ejecuto…

Ej.18 Ejecutado

Ya veo cómo trabaja una función en Python. Uso las funciones de la misma forma que uso exists, open y otros métodos. De hecho, esos métodos o comandos son sólo funciones!!!??? Si. Ésto significa que puedo crear mis propios métodos y usarlos también en mis programas. Mmmmmm

ALGUNAS PREGUNTAS

P: ¿Qué está permitido como nombre de función?

R: Lo mismo que para nombres de variables. Cualquier cosa que no empiece con un número y contenga letras, números y guiones bajos. En el ejemplo, print_two se podía haber llamado Piruleta, pero preferiblemente nombres cortos que indiquen lo que hace la función.

P: ¿Qué hace * en *args?

R: Le indica a Python que tome todos los argumentos para la función y los ponga en args como una lista. Es como argv, que ya he usado, pero para funciones.

COMENTANDO MÁS

El programa más comentado

Ej.18 Programa +comentado

Ej. 17 : Haciendo más ficheros (y cometiendo errores)…

Ahora voy a hacer un par de cosas más con ficheros. Voy a escribir un programa Python para copiar un fichero a otro. Será muy corto, aunque me dará una idea de lo que puedo llegar a hacer con ficheros…

Ej. 17 - Código con errores

Qué bonito, ¿verdad? Pues estoy atascadísima. Soy humana. Ya iba yo muy confiada. Hay 1 error fatal y no consigo verlooo…

He ido corrigiendo algunos y eran detalles tontos que en 2 segundos cambiaba al ejecutar, guardaba el código cambiado (ésto es una totería supina, pero hay que estar a todo, y se me ha pasado alguna que otra vez, dándome el mismo error a pesar del cambio, HAY QUE GUARDAR en el editor por cada nuevo cambio).

He aquí mi cadena de errores (casi todos tontunas), que he ido solventado con dignidad hasta llegar al punto muerto en el que me encuentro.

Ej.17 - Errores en cadenaPor lo que leo el error ya me ha pasado antes y no está en el programa, sino a la hora de ejecutar…

¿No debería escribir algo así como … phython  ex17.py  test.txt ?

En realidad quiero escribir test17.txt para no borrar el test del ejercicio, pero eso es ménos importante…

…..

Le voy a dar una vuelta y luego retomo…

😦

SOLUCIÓN

Bien. Me han echado un cable. Pero lo justo para tener que seguir peleando, un poco más, ¿eh?.

Thanks!!!

Al igual que con otros programas, debería ejecutar con dos parámetros o argumentos: el fichero desde el que copiar y el fichero al que copiar. Estaba aquí la cuestión. Creo que leyendo ésto bien, se entiende, necesito 2 archivos txt, no sólo uno.

Lo he hecho en dos pasos:

  1. Había que mostrar el contenido del fichero de «María y su corderito». 🙂 Ese que hice en el ejercicio anterior…el test.txt desde el que copiar. Lo ejecuto en Poweshell con el comando type.. muestra el contenido del fichero…
  2. Y una vez hecho eso, entonces lo ejecuto junto con un new_file que es al que voy a copiar.

That´s all!!

Bueno, había algún detallito en el código solucionados sobre la marcha. Lo importante creo que es ir entendiendo lo que hago, dentro de lo posible.

Insisto en que volveré sobre mis pasos después para completar comentarios y demás. De momento quiero ir avanzando con ritmo.

Éste es el PROGRAMA CORRECTO.

Ej. 17 - Código solucionado

Sigo haciendo intentos de ejecución… Ej.17 - Errores en cadena...y SOLUCIÓN BISLO IMPORTANTE, LO QUE HAY QUE EJECUTAR, DONDE HE DUDADO… Ej.17 - SOLUCIÓN GRANDE

+PREGUNTAS

P: ¿Qué hace el comando(método) exists que he importado?

R: Devuelve True si existe el fichero cuyo nombre en formato string pasamos por parámetro. Devuelve False si no existe.

P: ¿Qué hace import?

R: Es una forma de obtener código libre que han escrito otros programadores, así no tienes que volver a escribirlo.

P: ¿Qué hace type en la línea de comandos?

R: Muestra el contenido de un fichero

P: ¿Qué hace la función len()?

R: Calcula el tamaño o longitud de la cadena pasada por parámetro y lo devuelve como un número.

P: ¿Qué significa el error «Syntax: EOL while scanning string literal.»?

R: Que olvidé poner correctamente el final de una cadena con comillas.

+EJ PARA AMPLIAR…

Para amliar me proponen que haga un programa que pase 4 ficheros como arg, mezclarlos, y generaruna mezcla de los tres primeros.

Ej. Python merge.py  f1 f2 f3 f4

donde f4 = f1 + f2 + F3

Y con ésto y un bizcocho…voy a por el 18…

Ej. 16 : Leyendo y escribiendo ficheros…

En el ejercicio anterior vi todos los métodos (comandos/funciones) para trabajar con ficheros. Ésta es una tabla de métodos importantes…

MÉTODO ¿QUÉ HACE? ABREV
Close Cierra el achivo.
Read Lee el contenido del fichero. Puede asignar el resultado a una variable. r
Readline Lee sólo una línea del fichero de texto.
Truncate Vacía el fichero. ¡¡Cuidado!!
Write (cosas) Escribe cosas en el fichero. Requiere como parámetro la cadena a escribir en el fichero. w
Append Añade a

Voy a usarlos para crear un sencillo editor de texto: Ej. 16 Editor Más adelante volveré sobre ésto. Y ejecuto el programa: Ej. 16 Terminal con notas Y ahora viene lo mejor: En la carpeta mystuff «aparece» (como por arte de magia) el fichero que acabo de crear… Ej. 16 Archivo creado ALGUNAS PREGUNTAS

P: ¿Qué significa «w»?

R: Sólo es una cadena con un carácter que se utiliza para indicar el modo de apertura del fichero. Si usa «w», está diciendo «abrir éste fichero en modo escritura (write), de ahí el carácter «w». Ver la tabla del principio: «r» para leer (read), «a» para añadir (append) …

P: ¿Cuáles son los modificadores de los modos apertura de ficheros que podemos usar?

R: El más importante es el modificador +, así puedo escribir ‘w+’, ‘r+’, y ‘a+’. Ésto abrirá el fichero en ambos modos, lectura y escritura, y dependiendo del carácter usado, en una u otra posición del fichero.

P: Escribiendo simplemente open(filename), ¿el fichero lo abre en modo ‘r‘(lectura)?

R: Si. Éste es el modo por defecto de la función open().

P:¿Por qué tengo que pasar ‘w’ como un parámetro extra a open?

R: Es más seguro indicar explícitamente a open que quiero escribir un fichero…pero…mmmm…dudo

P: ¿Es necesario trucate() con el parámetro ‘w’?

R: Ir al EJ.5…

+PRÁCTICAS

  1. Escribir un código similar al último ejercicio que use read y argv para leer el archivo que he creado.
  2. En vez de hacer tantas repeticiones, podría usar cadenas con formato y secuencias de escape para mostrar line1, line2 y line3 con sólo un comando target.write() en lugar de seis.

Ej. 15 : Leyendo ficheros…

Voy a escribir dos archivos.

Uno de ellos es ex15.py, el cual ejecutaré.

El otro es ex15_sample.txt, que no es un programa, obviamente por la extensión, es un archivo de texto plano que leeré desde el programa. Es el siguiente:

Ej.15 Texto

Lo que quiero hacer es «abrir» el archivo en mi programa y mostrarlo en pantalla. Uso argv y raw_input para cargar otros ficheros más tarde y preguntar al usuario el nombre del fichero que quiere abrir.Ej.15 CódigoY como no podía ser de otra manera open es el comando favorito para abrir un archivo. Nos lo dice el pydoc, así, en poca palabras…

Pydoc open

En la línea 9 del código llamamos a una función en txt.

Lo que se obtiene de open es un fichero con el que se pueden usar comandos. Y ahora atención:

Los comandos se los paso al fichero usando el punto, el nombre del comando y los parámetros. Al igual que con open y raw_input. La diferencia es que cuando escribo txt.read() estoy diciendo: «Hey txt, ejecuta el comando read sin parámetros».

El resto del fichero es más de lo mismo, así que ejecuto…
Ej.15 Terminal Bien. ahora tengo que darle vueltas a ésto.

Por cierto, donde digo comandos, son también funciones o métodos. 

PREGUNTAS

P: ¿txt = open(filename) devuelve el contenido del fichero?

R: No. En realidad crea algo que se llama un «objeto fichero». Es como un reproductor de DVD. Puede moverse por ellos y «leerlos», pero el fichero no es el contenido.

P: No puedo escribir el códogo en mi Terminal de PowerShell como en la práctica 7. ¿Qué hago?

R: Antes de nada, en la línea de comandos sólo tienes que ecribir python y pulsar la tecla Enter. ahora estás en Python, como has hecho otras veces. Entonces puedes ecribir el código y Python lo ejecutará en pequeñas piezas. Para salir ecribe quit () y pulsa Enter.

P: ¿Qué significa from sys import argv?

R: Por ahora sólo diré que sys es un paquete y ésta frase sólo obtiene la característica argv del paquete. Aprenderé más sobre ésto más tarde.

Ej. 10 : Repasando…

En el Ej. 9 vi algunas cosas nuevas como dos formas para hacer una cadena en varias líneas. En la primera forma escribí el carácter \n  (barra invertida y n) entre el nombre de los meses. Lo que estos dos caracteres hacen es un salto de línea en el lugar de la cadena de caracteres donde están.

Hay muchas secuencias de escape. Hago un ejercicio y lo explico.

Ej10 Editor

Aquí se observa cómo el uso de triple comillas «»» que encapsula el texto en rojo de arriba, permite poner tantas líneas de textos como se quiera, ya que hace que funcione como una cadena de caracteres o string.

Ej10 Terminal

SECUENCIAS de ESCAPE

Ésta es la lista de todas las secuencias de escape que soporta Python.

Secuencia de Escape En pantalla… O lo que es lo mismo…
\\ \ Una única barra invertida
\’ Escape de comilla simple en una cadena
\” Escape de comilla doble en una cadena
\a BELL ASCII bell
\b BS ASCII retroceso
\f FF ASCII avance de página
\n LF ASCII linefeed o salto de línea
\N{name} Sólo Unicode Carácter name en la base de datos Unicode
\r CR ASCII retorno de carro
\t TAB ASCII tabulación horizontal
\uxxxx Sólo Unicode Carácter con 16-bits hexadecimal y valor xxxx
\Uxxxxxxxx Sólo Unicode Carácter con 32-bits hexadecimal y valor xxxxxxxx
\v \v ASCII tabulación vertical (VT)
\ooo oo Carácter con valor octal
\xhh hh Carácter con valor hexadecimal

Poco a poco iré haciendo ejemplos de todo y volveré sobre ésta tabla.

P: Relacionado con la práctica 3. ¿Qué significa «combinar» escapes y formatos?

R: Cada uno de éstos ejercicios se puede combinar con otros para resolver problemas. Partiendo de lo que sabes sobre cadenas con formato, puedes escribir un código nuevo que use las cadenas y, además, use las secuencias de escape que hemos visto en éste ejercicio.

P: Cuando uso %r ninguna secuencia de escape funciona.

R: El formato %r muestra en bruto los datos que escribí, lo que incluye las secuencias de escape tal cual. Use en su lugar %s. Recuerda siempre que %r es para depurar y %s para mostrar en pantalla.

P: Cuando esscribo // o / no funciona.

R: Ésto se debe a que usas la barra / en lugar de la barra invertida \. Son caracteres diferentes y hacen cosas diferentes.

Ej. 8 : Mostrando en pantalla (parte III) …

De nuevo, escribo código directamente:

Ej.8 EditorEj.8 Terminal

ALGUNAS PREGUNTAS

P: ¿Por qué «one» está entre comillas y True y False no?

R: True y False son palabras clave que representan el concepto de verdadero y falso. Si añadiera comillas a True o False, pasarían a ser cadenas de caracteres, y no funcionarían correctamente. Más adelante haré más ejemplos…

P: Si escribo comillas dobles (» «), ¿por qué las cambia a comillas simples (‘ ‘) al ejecutar el código?

R: Python funciona por eficiencia, no por estética, no siempre coincidentes. Y si usa %r todavía más, ya que como he comentado antes, se encarga de depurar (formatear) el código.

Lo de «formateador» me suena fatal, pero bueno, es una traducción relativa…

Y la pregunta que me llevo haciendo los 8 ejercicios:

P: ¿PUEDO USAR IDLE PARA EJECUTAR ÉSTO?

R: Noooo (NO DEBO). Hay que aprender a usar la línea de comando. Es fundamental para aprender a programar.

Mmmmmm

Aguien se puede preguntar…

P: ¿Pero que es IDLE?

R: El Entorno de Desarrollo de Python. Aprovecho y hago una pequeña referencia al glosario de la documentación oficial que tengo pinchando aquí. Que dice así:

IDLE = An Integrated Development Environment for Python. IDLE is a basic editor and interpreter environment which ships with the standard distribution of Python.

Pues eso. Lo localizamos entre todo lo que nos intalamos de Python. Usando la herramienta «Buscar» en Windows.

Ej. 5 : Mostrando variables en pantalla (parte I)…

En éste ejercicio voy a usar variables dentro de una cadena de caracteres. en programación, una cadena (de c) es un texto escrito entre comillas dobles (» «). En inglés es STRING.

Empiezo escribiendo el código:

Ex. 5 - Paso 1

Y al ejecutar, obtengo lo siguiente…Ex. 5 - Paso 2 corregido

ALGUNAS PREGUNTAS

P: ¿Podría crear una variable de la forma 1 = ‘Paloma Cue’ ?

R: No. El 1 no es un nombre válido de variable. Las variables deben comenzar con UNA LETRA.  a1 = Paloma sí funcionaría.

P: ¿Qué son %s, %r y %d ?

R: Son CARÁCTERES DE FORMATO. Es importante. Le dicen a Python que tome una variable que esté situada a la derecha y poga su valor en lugar de %s.

ALGO +DE INFO…

Me voy a la documetación oficial y encuentro ésto tan apropiado…

Caracteres de formato - doc oficial Caracteres de formato 2 - doc oficial

Justo lo que responde a mis preguntas, pero le iré dando vueltas según lo vaya usando.