Ej. 35 : Tomando decisiones con funciones…

Ya he aprendido a hacer la sentencia if, funciones y listas. Ahora ha llegado el momento de mezclarlas. Voy a escribir el siguiente código e intentaré averiguar qué hace.

Ej. 35 - Programa 1Ej. 35 - Programa 2Ej. 35 - Programa 3

Ejecutando, y eligiendo opciones, me sale lo siguiente:

Ej. 35 - Terminal 1 opción

Obviamente, éste programa es tremendamente interesante para darle millones de vueltas.

Lo retomaré en un par de post para:

  1. Dibujar un mapa del juego y ver si he entendido el recorrido.
  2. Escribir comentarios en el programa
  3. Darle vueltas al juego, para ampliarlo o simplificarlo.

PREGUNTAS

P: ¿Qué hace while True:?

R: Crea un bucle infinito.

P: ¿Qué hace exit(0)?

R: En muchos sistemas operativos un programa puede abortar la ejecución con exit(0), indicando con el número pasado por parámetro si hubo un error o no. Si ejecutas exit(1), se aborta con el error, pero si se hace con exit(0), se terminará correctamente. El motivo por el que es al revés de la lógica booleana normal (con 0==False), es que así se puede usar diferentes números para indicar diferentes errores. Puedes terminar el programa con exit(100) para errores con resultados diferentes que con exit(2) o exit(1).

Ej. 25 : Practicando+…

Sigo practicando con variables y funciones.

Éste ejercicio debería de resultarme sencillo para modificarlo, analizarlo y comprenderlo…

Sin embargo, será un poco diferente. No lo ejecutaré. En vez de eso, lo importaré a Python y ejecutaré las funciones yo misma (DIY).

Ej. 25 Editor

En primer lugar tengo que ejecutar el código como hago normalmente con pyton ex25.py para encontrar cualquier error que haya podido cometer.

Una vez encontrados y solucionados todos los errores, continúo.

Ej. 21 : Devolviendo valores con funciones…

He estado utilizando el carácter = para asignar valores a las variables, como números o cadenas. Ahora voy a ver cómo utilizar = y una nueva palabra de Python, return, para asignar a las variables un valor de una función.

Habrá una cosa a la que prestar mucha atención, pero antes de nada escribo el programa.

Ej. 21 ProgramaComo se ve, estoy haciendo mis propias funciones matemáticas para sumar, restar, multiplicar y dividir. Lo importante es fijarse en la última línea donde escribo return a + b . Ésto hace lo siguiente:

  1. La función es llamada con dos parámetros: a y b.
  2. Muestro en pantalla lo que hace la función, en éste caso sumando.
  3. Luego le digo a Python que devuelva la suma de a + b.
  4. Python suma los dos números. Entonces la función termina. Cualquier línea de código que llame a ésta función podrá asignar el resultado de la suma a + b a una variable.

La penúltima línea me encanta. Es una función dentro de otra función, dentro de otra…o más formalmente:

Estoy tomando el valor devuelto de una función y usándolo como el parámetro o argumento de otra función. Lo hago de manera encadenada, así creo una especie de fórmula usando la funciones. Se ve muy raro, pero si se ejecuto el código, se ve el resultado….

Ej.21 TerminalALGUNAS PREGUNTAS

P: ¿Por qué Python muestra la fórmula o las funciones «hacia atrás»?

R: En realidad no es hacia atrás, es «de dentro hacia fuera». Si se analiza la función como fórmulas separadas y se llama a las funciones, se ve como funciona.

P: ¿Cómo puedo usar raw_input() para introducir mis propios valores?

R: ¿Recuerdas int(raw_input())? El problema es que con eso no podemos tomar valores en punto flotante, así que usamos float (raw_input()).

ALGO+…

Por curiosidad, voy a ver que dice pydoc de return en el terminal…

Ej. 21 Pydoc - Return

Bueno y breve…

x2 B

Ej. 20 : Trabajando con funciones y ficheros…

Las funciones y los ficheros pueden trabajar juntos para hacer cosas útiles como ésta:

Ej.20 - Programa Ej.20 - Terminal

Éste ejercicicio me ha gustado mucho.

Es interesante ver cómo podemos insertar contenido del fichero txt con frases del programa.

Al principio no entendía mucho porque lo estaba mirando sin la ejecución y estaba pensando sólo en abstracto, olvidándome de que va incorporando las líneas del texto. De eso va el ejercicio, de cruzar ambos ficheros.

ALGUNAS PREGUNTAS

P: ¿Qué es f en print_all y otras funciones?

R: La f es una variable como las usadas en el Ejercicio 18, aunque en éste caso es un archivo. En Python, un fichero es como un reproductor de DVD. Tiene una «cabeza lectora» para poder ir leyendo y saltando a diferentes posiciones del fichero. Cada vez que hago f.seek(0)  estoy moviéndome al inicio del fichero. Cada vez que hago f.readline(), estoy leyendo una línea del fichero y moviendo la cabeza lectora a la derecha de \n, que es el final de ésa línea (salto de línea). Lo seguiré explicando cuando avance.

P: ¿Por qué hay líneas en blanco en el fichero?

R: Buena pregunta. Yo también me la hice al principio. Como hice en el ejercicio 10 y el ejercicio 16, la función readline() devuelve el \n que hay al final de cada línea. Ésto significa que estamos mostrando en pantalla éste carácter (salto de línea), además del \n propio de print. Para que no ocurra hay que añadir el carácter , (coma) al final de print, así no motrará en pantalla su propio \n.

P: Mmmm. Entonces, ¿por qué seek(0) no establece el valor de current_line a cero?

R: En primer lugar, seek(0) es una función que trabaja a nivel de bytes, no líneas. Así que con eso saltamos al byte 0 (el primer byte) del fichero. En segundo lugar, current_line es sólo una variable y no está conectada de ninguna forma con el fichero. Hay que incrementar el valor manualmente.

P: Pero entonces, ¿cómo sabe readline() dónde está cada línea?

R: Dentro de readline() hay un cógigo que escanea cada byte del fichero hasta encontrar el carácter /n, entonces para de leer y devuelve lo que ha encontrado hasta ahí. El fichero f es responsable de mantener la posición actual en el fichero después de cada llamada a readline().

P: ¿Qué es +=?

R: Es un tipo de contracción de los operadores. Por ejemplo, decir que x += y es decir lo mismo que x = x + y.

En éste caso podríamos escribir: current_line += 1  que sería lo mismo que decir current_line = current_line + 1

Con todo lo anterior, ahora si, comento el código.

Ej.20 - Programa comentado

Ej. 19 : Relacionando (o no) funciones y variables…

Voy a reforzar un concepto relativamente importante: las variables en las funciones no están conectadas al resto de las variables del resto del programa.

Un ejemplo:

Ej. 19 Programa

Éste código muestra todas las formas diferentes de pasar valores a la función cheese_and_crackers. Podemos pasar números, ecuaciones matemáticas, y combinar ecuaciones matemáticas con variables.

En cierto modo, los argumentos de una función son algo así como el carácter = cuando creamos una variable. De hecho, si puedo usar = con algo, normalmente puedo pasarlo a una función como un argumento.

Ejecuto el programa y …  Ej.19 Terminal

A ver si lo he entendido…

Voy comparando el programa con lo que ejecuta en el terminal, y si coincide con lo que creía yo que deberia de salir en pantalla antes de ejecutarlo.

Para empezar me llama la atención que empiece a ejecutar a partir de la línea 8 del código del programa y luego vuelva atrás, pero lo entiendo. Al fin y al cabo está dando valores a la función cheese_and_crackers que de la línea 1 a la 5 está definida, pero sin valores específicos.

En el resto de párrafos se repite lo mismo, pero cambiando los valores y mostrando las 4 frases del principio, pero con los valores cambiados y las modificaciones añadidas que se van proponiendo.

En fin. Si. En principio sigue siendo bastante intuitivo.

Lo comento más…

Ej. 19 Programa COMENTADO

ALGUNAS PREGUNTAS

P: ¿Y si quiero preguntar al usuario por el número de cheese y crackers?

R: Sólo necesito usar int para convertir lo que se obtiene de raw_input().

P: ¿Creando las variables en las líneas 13 y 14 cambian las variables en la función?

R: No. Éstas variables están separadas y «viven» fuera de la función. Son pasadas por parámetro a la función y se crea una versión temporal sólo para ejecutarla. Cuando la función termina, éstas variables temporales dessaparecen y todo sigue funcionando como antes. Más adelante me quedará más claro.

P: ¿Es malo tener variables «globales» (como en la línea 13 y 14) con el mismo nombre que las variables de la función?

R: Si. Porque desde ese momento no podré estar segura de cuál estaré  hablando…pero a veces es necesario usar el mismo nombre o podría hacerlo sin querer. Un lío vamos. Así que en la medida de lo posible, debo evitarlo.

P: ¿Las líneas 12-19 sobrescriben la función cheese_and_crackers?

R: Para nada. Estoy llamándola. Básicamente es un salto temporal a la primera línea de la función, a continuación, después de la última línea de la función regresa. No estoy remplazando la función con cualquier cosa.

P: Mmmm. OK. Me he hecho la una pregunta parecida comentando el programa. Es lo de las variables globales de la pregunta anterior. Le daré otra vuelta.

P: ¿Hay un límite de número de argumentos que puede tener una función?

R: Interesante pregunta. Depende de la versión de Python y el el ordenador que tenga, pero ese límite es bastante generoso. Lo que pasa es que el límite PRÁCTICO es de 5 argumentos aproximadamente, a partir de aquí la función se vuelve «incómoda».

P: ¿Se puede llamar a una función desde dentro de otra función?

R: Si. Haré un juego que haga ésto más adelante.

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