6 nov 2016

Python 09. Generador de frases (Matrices y funciones)


En este apartado vamos a aprender:
  • A definir funciones
  • Matrices o arrays
  • A gestionar el tiempo con time.sleep(x)
  • Escribir en la misma linea con la orden print('texto',end='')
  • Gestión de bucles con continue
Antes de comenzar con el programa principal vamos a ver un poco como funcionan las matrices y las funciones:

Las matrices:
Los arrays o matrices son listas de elementos a las que ponemos un nombre para poder trabajar con ellas. Vamos a ver un ejemplo con la matriz días
Si tecleamos en la shell de Python lo siguiente:

>>>días=['lunes','martes','miércoles','jueves','viernes']
>>>días
['lunes', 'martes', 'miércoles', 'jueves', 'viernes']
>>>días[0]
'lunes'
>>>días[4]
'viernes'

Cuando definimos una matriz, automáticamente se le asigna a cada item o elemento de la matriz un número de orden o índice (index). Este índice empieza a contar por 0, por lo que el primer elemento de la matriz será matriz[0] y el último siempre será matriz[número de elementos de la matriz - 1]

Se puede operar con los elementos de una matriz como se operaba con las cadenas
>>>días[1]+días[3]
'martesjueves'

Una orden que se puede aplicar a matrices es len que sirve para obtener la longitud (número de elementos) de una matriz

 >>>len(días)
5

Las funciones:
Una función es una parte del código que se define, se guarda y se ejecuta cuando el programador desea. Son como programas dentro de otros programas.
Se suelen emplear cuando el programador va a utilizar un grupo de instrucciones en varias ocasiones durante el programa.
Por ejemplo: En un videojuego se puede definir la función "sumar puntuación" que haría la suma de 10 puntos y emitiría un sonido; y que sería llamada cada vez que el jugador mata una nave enemiga.
Una función se define empleando la sentencia def nombrefunción (algo).
Vamos a hacer un ejemplo para entender como funciona:
#función de ejemplo, para quedar bien
def quitarEdad(añosDeMás):
    añosDeMenos=int(añosDeMás)-10
    return añosDeMenos

print('¿Cuántos años tienes?')
edad=input()

edadNueva=quitarEdad(edad)
print('Pues no aparentas más de '+str(edadNueva))

Definimos la función quitarEdad y la asignamos un atributo que es añosDeMás y que se coloca entre paréntesis.
En la siguiente línea lo que hacemos es realizar una operación que resta 10 a la edad original (añosDemás) y el valor se lo asigna a la variable añosDeMenos.
La línea return índica que debe volver a la línea donde fue llamada y que el valor de salida será añosDeMenos.
Lo que hace esta función es transformar el número que se le ponga en otro 10 años menor.
Para llamar a la función se utiliza la orden edadNueva=quitarEdad(edad)

Introducción del programa de generar frases:
El programa va a generar frases aleatorias a partir de unas matrices de palabras que le indicamos.

Código:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Generador automático de frases
import random
import time
personas=['Juan','Luis','Irene','Kevin','Adriana']
verbos=['ama','odia','no entiende','insulta','sonrie','escucha']
def escogePalabra(palabraLista):
   índice=random.randint(0,len(palabraLista)-1)
   return palabraLista[índice]

otrojuego='sí'
    
while otrojuego=='sí' or otrojuego=='Si' or otrojuego=='Sí' or otrojuego=='si':    
    persona=escogePalabra(personas)
    persona2=escogePalabra(personas)
    verbo=escogePalabra(verbos)
    print('Voy a decirte algo de '+persona)
    time.sleep(1)
    print()
    print(persona+ ' '+verbo+ ' a ', end='')
    time.sleep(2)
    print(persona2)
    time.sleep(2)
    print()
    print('¿Quieres que te diga otra cosa? (Escribe sí o no)')
    otrojuego=input()
print('¡Hasta luego!')   
       
    
       



El programa en el editor de archivos se verá así:


El resultado

Por partes:
Con import importamos dos módulos. El módulo random genera números aleatorios ( ya lo conocemos) y el módulo time sirve para incorporar retardos en los programas.
2. import random
3. import time

Utilizamos 2 matrices. En este caso tenemos las matrices personas y verbos.
4. personas=['Juan','Luis','Irene','Kevin','Adriana']
5. verbos=['ama','odia','no entiende','insulta','sonrie','escucha']

Creamos una función que se llama escogePalabra y que servirá para elegir una de las palabras de la lista.
En la línea 7 generamos un número que esté entre 0 y el número de palabras de la lista menos 1. Esto es porque, como ya hemos visto, las palabras de las matrices empiezan por 0 y el último elemento es un número menor que la cantidad de elementos.
En la línea 8 le decimos a la función que envíe un valor de retorno a la línea que ha llamado a la función de un valor de elemento [índice] de la matriz palabralista.

6. def escogePalabra(palabraLista):
7.    índice=random.randint(0,len(palabraLista)-1)
8.    return palabraLista[índice]

En la línea 10 declaramos una variable que se llama otrojuego y le asignamos inicialmente el valor de 'sí'
10. otrojuego='sí'

En la línea 12 abrimos un bucle con la orden while que se mantendrá mientras la variable otrojuego='sí', también vale si se pone Si, Sí o si.
12. while otrojuego=='sí' otrojuego=='Si' or otrojuego=='Sí' or otrojuego=='si':

En la líneas 13,14 y 15 llamamos a la función que hemos definido, escogePalabra, Le asignamos un atributo que es personas en la 13 y 14 y verbos en la 15. En cada una de estas líneas la función se pone a funcionar. Se puede decir que el programa trae la función a donde la hemos llamado para que se ejecute y continúa en el mismo sitio con el valor de retorno que ha generado (persona, persona2 y verbo).
13.     persona=escogePalabra(personas)
14.     persona2=escogePalabra(personas)
15.     verbo=escogePalabra(verbos)

En la línea 16 imprimimos una línea de información. En ella se escribe el nombre de la primera persona que se ha generado aleatoriamente.
La línea 17 se genera una espera con la orden time.sleep(1). Esto se hace con el módulo time que importamos al principio y permanece en espera el tiempo en segundos que se ponga dentro del paréntesis)
La orden print() introduce una línea en blanco como resultado. Deja espacio entre la anterior línea y la siguiente.
16.     print('Voy a decirte algo de '+persona)
17.     time.sleep(1)
18.     print()

Las siguientes líneas van introduciendo la frase aleatoria con retardos de 2 segundos para darle emoción.
Hay que observar la linea 19 donde introducimos un nuevo atributo end='' que lo que hace es que la siguiente cosa que se imprima se haga en la misma línea y no en la línea siguiente como es habitual.
Como se ve la frase es del estilo de: persona+verbo+' a '+persona2
19.     print(persona+ ' '+verbo+ ' a ', end='')
20.     time.sleep(2)
21.     print(persona2)
22.     time.sleep(2)
23.     print()


En la línea 24 se le pregunta al jugador si quiere que el ordenador le diga otra frase
Lo que el usuario diga se mete en la variable otrojuego.
Si dice que sí se aplica se cumple la condición del bucle y por tanto continua repitiendo el bucle.

Si dice que no se acabara el bucle y continua a la orden siguiente. También continuará si el usuario se equivoca al teclear e introduce algo que no sea sí.

24.     print('¿Quieres que te diga otra cosa? (Escribe sí o no)')
25.     otrojuego=input()

Finalmente el ordenador se despide
26. print('¡Hasta luego!') 

Ejercicios:
  1. Cambia los valores de los personas y verbos de las matrices del programa.
  2. Pon las órdenes necesarias para evitar que persona y persona2 sean la misma,
  3. Dibuja el flujograma del programa. Utiliza por ejemplo el programa Draw de Libreoffice. Tienes una explicación de los flujogramas aquí
  4. Diseña un programa que permita pasar de dolares a euros y viceversa utilizando funciones.
    • Debe preguntar si quieres pasar de euros a dolares o de dolares a euros.
    • El resultado debe tener 2 decimales (orden round(número, decimales))
    • Ten cuidado con los números y las cadenas. Recuerda la orden str(número)
    • Después de hacer el cálculo nos debe decir que si queremos hacer otro.
    • Aquí ves el resultado que tiene que dar:



0 comentarios:

Twitter Facebook Tuenti LinkedIn gmail Favorites More