Python 08: Funcións e Listas

Aprenderás

- Definición de Funcións

- Listas ou arrays

- Xestión de tempo time.sleep(x)

- print('oQueSexa',end='')

- Xestión de bucles continue

Introducción:

Neste exercicio imos facer un xenerador aleatorio de frases, que nos falará de animais escollendo as súas palabras ao chou dunhas listas que nos lle imos proporcionar.

O Código do programa:

1. # Xerador automático de frases

2. import random

3. import time

4. nomes=['cans','gatos','leóns','osos','arroaces']

5. adxectivos=['fieis','áxiles','feroces','gordos','simpáticos']

6. def escollePalabra(palabraLista):

7. indice=random.randint(0,len(palabraLista)-1)

8. return palabraLista[indice]

9.

10. xogaOutra='si'

11.

12. print('Ola, que tal, como te chamas?')

13. meuNome=input()

14.

15. while xogaOutra=='si':

16. nome=escollePalabra(nomes)

17. adxectivo=escollePalabra(adxectivos)

18. print(meuNome+', non che gustan os '+nome+'?')

19. time.sleep(1)

20. print()

21. print('Son tan... ', end='')

22. time.sleep(2)

23. print(adxectivo+'!!')

24. time.sleep(2)

25. print()

26. print('Queres que che diga outra cousa? (si ou non)')

27. xogaOutra=input()

28. if xogaOutra=='si':

29. continue

30. if xogaOutra=='non':

31. break

32.

33. print('Até logo, '+meuNome+'!')

O resultado:

O programa preguntarános polo nome, para despois facer frases nas que combinará o nome dun animal dos incluídos na matriz ou array nomes cun adxectivo dos incluidos na lista adxectivos. Logo demandará que lle digamos se queremos xogar outra ou non, no primeiro caso voltará facer outra frase e no segundo (ou se nos confundimos ao teclear) se despedirá de nós.

Por partes:

Nas liñas 1-3 comentamos o programa e importamos dous módulos, a random xa o coñeces, e hai un novo que se chama time. Logo veremos para que nos vale, aínda que supoño que xa o imaxinas máis ou menos.

1. # Xerador automático de frases

2. import random

3. import time

Nas liñas 4 e 5 introducimos un concepto novo, son as matrices, arrays ou lists, que son listas de datos ás que lles damos un nome, de xeito que podemos operar con elas.

Definimos a matriz nomes, que inclúe nomes de animais, e a matriz adxectivos, que inclúe unha lista de adxectivos.

4. nomes=['cans','gatos','leóns','osos','arroaces']

5. adxectivos=['fieis','áxiles','feroces','gordos','simpáticos']

Un pouco máis sobre matrices:

Antes de continuar co programa imos entrar na shell e teclear un pouco para profundizar un pouco nas matrices ou arrays.

Proba con isto:

>>>dias=['luns','martes','mércores','xoves','venres']

>>>dias

['luns', 'martes', 'mércores', 'xoves', 'venres']

>>>dias[0]

'luns'

>>>dias[4]

'venres'

Cando definimos unha matriz, automáticamente se lle asigna a cada item, ou elemento da matriz, un número de orde ou índice (index). Este índice comeza a contar polo cero, polo cal o primeiro elemento da matriz será o matriz[0] e o último sempre será matriz[(número de elementos da matriz)-1].

Tamén podemos operar cos items da matriz, do mesmo xeito que operabamos con cadeas:

>>>dias[1]+dias[3]

'martesxoves'

Se introducimos un índice demasiado grande a shell darános un index error:

>>>dias[6]

Traceback (most recent call last):

File "<pyshell#4>", line 1, in <module>

dias[6]

IndexError: list index out of range

Outro método moi interesante que se lle pode aplicar ás matrices é len, que sirve para obter a lonxitude (número de elementos) dunha matriz, logo o usamos no programa. Proba na shell:

>>>len(dias)

5

As liñas 6-8 definen unha función, algo que imos explicar cun pouco de atención:

As Funcións:

Unha función é unha parte do código que se define, se garde e se executa cando o programador o desexa. Poderíase dicir que son como programas dentro de programas maiores.

Empréganse, sobre todo, cando queremos que o programa execute un grupo de instruccións en varias ocasións dentro do programa.

Lembra que xa empregaches funcións, como por exemplo print() e input(), que son funcións que executan certas ordes que veñen predefinidas en Python.

P.ex. - se estamos nun videoxogo, poderemos querer que, cada vez que o xogador colla unha cereixa, se lle sumen 10 puntos e se emita un sonido. As liñas dedicadas a facer iso se poderían gardar nunha función independente que fose chamada en cada ocasión necesaria.

Unha función defínese empregando a sentenza def nomeFunción(algo). Abre unha nova fiestra e imos executar un pequeno programiña para que entendas ben como funcionan.

1. #función de exemplo, para quedar ben

2. def quitaIdade(anosDeMais):

3. anosDeMenos=int(anosDeMais)-10

4. return anosDeMenos

5.

6. print('Cantos anos tes?')

7. idade=input()

8.

9. idadeNova=quitaIdade(idade)

10.print('Pois non aparentas máis de '+str(idadeNova))

Na liña 2, cando definimos a función quitaIdade tamén lle dicimos que lle imos pasar un atributo (o valor que vai entre parénteses) e que lle ten que asignaro o nome anosDeMais. Na liña 3 realizamos a operación de quitar dez anos de encima, e na liña 4, coa sentenza return, lle dicimos que volte á liña onde foi chamada (aínda non o foi) e que lle pase o valor de anosDeMenos.

As liñas 6 e 7 xa entendes de sobra o que fan.

Na liña 9 chamamos á función, dicimos que a idadeNova vai ser o resultado de aplicar a función quitaIdade sobre o valor da variable idade que introduciu o xogador ou xogadora. Este resultado, chamado valor de retorno, ven definido pola sentenza return da liña 4. Ao executarse esta liña, e non antes, é cando a función que antes definimos é usada, até o de agora só estaba almacenada á espera de que se quixera facer uso dela.

Seguro que xa ves o que fai a liña 10 por ti mesma/o, non si?

Supoño que estarás pensando que isto de definir unha función é un pouco liarse para nada, xa que seguro que se che ocorre que poderías conseguir o mesmo resultado sen definir funcións. É certo, pero... imaxina que tiveras que restar a idade 100 ou 200 veces o longo do programa... non cres que entón si che aforraría moito tempo e traballo ter predefinida esa función? Se non o ves claro, confía en min, cando fagas os próximos apartados o verás.

Voltemos ao noso programa, estabamos nas liñas 6-8

6. def escollePalabra(palabraLista):

7. indice=random.randint(0,len(palabraLista)-1)

8. return palabraLista[indice]

Neste caso, a función escollePalabra asignará a variable palabraLista ao valor que se lle pase.

Na liña 7 declaramos unha variable indice que será un número ao chou entre o 0 e (lonxitude da matriz palabraLista-1).

Na liña 8 lle dicimos a función que ten que envíar un valor de retorno á liña onde foi chamada que, neste caso, será o valor do elemento [indice] da matriz palabraLista.

Na liña 10 declaramos a variable xogaOutra e lle asignamos o valor 'si'.

10. xogaOutra='si'

As liñas 12 e 13, como xa sabes, unha presentación e introdución de nome.

12. print('Ola, que tal, como te chamas?')

13. meuNome=input()

Na liña 15 abrimos un bucle mentres xogaOutra='si'

15. while xogaOutra=='si':

Nas liñas 16 e 17 chamamos á función que antes definíramos, escollePalabra, e lle pasaremos un atributo, ou valor co que ten que traballar esa función, que na liña 16 será a matriz nomes e na liña 17 a matriz adxectivos. En cada unha destas liñas é cando a función se pon a funcionar, digamos que o programa "trae" a función até onde a chamamos, a executa, e continua no mesmo sitio co valor de retorno que a función devolve. Na liña 16 creamos unha variable nome que almacenará este valor de retorno, e na 17 facemos o mesmo cunha variable adxectivo.

O resultado de combinar estas liñas coa función escollePalabra e a matriz nomes ou adxectivos será que nome e adxectivo tomarán ao chou, cada vez que se executen estas liñas os valores:

nome= 'cans' ou 'gatos' ou 'leóns' ou 'osos' ou 'arroaces'.

adxectivo='fieis'ou'áxiles' ou 'feroces' ou 'gordos' ou 'simpáticos'

16. nome=escollePalabra(nomes)

17. adxectivo=escollePalabra(adxectivos)

Na liña 18 empregamos print para imprimir o nome do xogador, ', non che gustan os' e o valor actual da variable nome, que, lembra a liña 16, ven de aplicar a función escollePalabra á matriz nomes, co cal a frase sairá impresa cun nome ao chou de entre os que están incluídos na matriz nomes.

18. print(meuNome+', non che gustan os '+nome+'?')

Ao principio do programa importamos o módulo time, agora executamos a función time.sleep(x) onde x e o tempo en segundos que queremos que o programa espere para pasar á seguinte liña.

19. time.sleep(1)

A liña 20 é un print(), que produce que se imprima unha liña en branco, deixando espazo entre a anterior liña e a seguinte.

A liña 21 é un print normal, mais introducimos un novo atributo dentro dos parénteses, que é ,end='' , que sirve para que, no canto de facer un salto de liña ao rematar o print, simplemente deixe un espazo e o seguinte print apareza a continuación de 'Son tan...'.

Na liña 23 imprímese o valor de adxectivo que, como xa se explicou na liña 18 e anteriores, será o resultado de aplicar a función escollePalabra á matriz adxectivos, co cal imprimiremos un adxectivo ao chou de entre os que están incluídos na matriz adxectivos.

As liñas 24-26 imprimen e xestionan o tempo dacordo co explicado anteriormente.

20. print()

21. print('Son tan... ', end='')

22. time.sleep(2)

23. print(adxectivo+'!!')

24. time.sleep(2)

25. print()

26. print('Queres que che diga outra cousa? (si ou non)')

As liñas 27-31 recollen a resposta da xogadora/or á pregunta de se queren xogar outra vez, comparan o seu valor con 'si' ou 'non' e reaccionan en consecuencia. Lembra que na liña 15 se definiu un bucle, o que contén o núcleo do xogo, que se executará continuamente mentres xogaOutra='si'. Aquí introducimos a sentenza continue, que lle indica ao programa que, de cumplirse a condición establecida, debe voltar ao inicio do bucle while.

27. xogaOutra=input()

28. if xogaOutra=='si':

29. continue

30. if xogaOutra=='non':

31. break

A liña 33 imprime a despedida cando saímos do bucle, ben sexa porque tecleamos 'non' como por non ter introducido 'si'

33. print('Até logo, '+meuNome+'!')

Isto é todo respecto a este programa, agora te recomendaría encarecidamente que fixeras os exercicios propostos, para que poidas afianzar os conceptos das definicións, que van ser moi importantes de agora en adiante.

Exercicios:

- Escribe comentarios en cada bloque do programa explicando que fan.

- Debuxa o fluxograma do programa.

- Cambia os valores incluidos nas matrices nome e adxectivos.

- Introduce as instruccións precisas para que se imprima unha terceira palabra de entre os valores dunha terceira matriz. (P.ex. - Os arroaces son tan... simpáticos e tan veloces/astutos/intelixentes/...)

- Empregando definición de funcións, fai un programa que sirva para introducir un valor en días e que che devolva o valor en segundos.

- Serías capaz de introducir as instruccións precisas para que, de contestar algo diferente de 'si' ou 'non' á pregunta "Xogas Outra?" o programa non che deixe avanzar e volte preguntar.

- Propón algún programa baseado no que tes aprendido até o de agora.