Capítol 9

Funcions

Les funcions són trossos de codi amb nom: les escrius una vegada i les fas servir tantes vegades com vulguis.

Per què fer servir funcions?

Imagina que has de saludar diverses persones en el teu programa. Sense funcions, hauràs de repetir les mateixes línies una vegada per cada persona:

Repetir codi és un problema: si vols canviar el missatge, has de modificar-lo en tres llocs. Les funcions solucionen això seguint el principi DRY (Don't Repeat Yourself: no et repeteixis). Escrius la lògica una vegada i la crides tantes vegades com calgui.

Definir una funció: def

Una funció es defineix amb la paraula clau def, seguida del nom de la funció, uns parèntesis i dos punts. El codi de dins va indentat, igual que en un if o un while:

Prova a modificar el missatge de la funció i observa com canvia en totes tres crides alhora:

Paràmetres: fer funcions flexibles

Els paràmetres són variables especials que reben valors quan crides la funció. Es declaren dins dels parèntesis del def.
Gràcies a ells, la mateixa funció pot treballar amb dades diferents cada vegada:

Quan crides saluda("Anna"), el valor "Anna" s'assigna al paràmetre nom dins de la funció. A la propera crida, nom valdrà "Bernat", i així successivament. Cada crida és independent.

Una diferència molt important: return comparat amb print

Aquesta és la distinció més important de tot el capítol. Una funció pot imprimir un resultat o retornar-lo. Sembla el mateix, però no ho és.

Una funció que fa print() mostra el resultat a la pantalla, però el valor desapareix: no el pots guardar ni usar en cap càlcul posterior:

Una funció amb return envia el valor de tornada al lloc on s'ha cridat. Pots guardar-lo en una variable, usar-lo en una expressió, o passar-lo a una altra funció:

És important explicar que la instrucció return finalitza la funció immediatament. Això vol dir que qualsevol codi que posis a continuació d'un return no s'executarà mai, és a dir, no té cap sentit posar-lo.

Funcions amb diversos paràmetres

Una funció pot tenir tants paràmetres com necessitis, separats per comes.
Això sí, és molt important l'ordre: el primer valor que passes va al primer paràmetre, el segon al segon, i així successivament:

Les funcions es poden cridar des de dins d'altres funcions. Quan ho fas, el programa entra a la funció interior, n'obté el resultat, i el fa servir en la funció exterior:

Variables locals: el que passa dins, queda dins

Les variables que declares dins d'una funció s'anomenen variables locals. Existeixen únicament mentre la funció s'executa i desapareixen quan la funció acaba. No les pots veure des de fora:

No és necessari que un paràmetre tinguin exactament el mateix nom que la variable corresponent, quan crides la funció. Es pot veure en l'exemple següent.

Errors típics

1. Usar print en comptes de return — la funció mostra el valor però no el retorna, de manera que guardar el resultat en una variable dona None:

2. Cridar la funció abans de definir-la — Python llegeix el codi de dalt a baix, de manera que si crides una funció que encara no ha estat definida, obtindràs un NameError:

3. Oblidar els parèntesis en cridar la funció — sense () no estàs cridant la funció sinó referint-t'hi com a objecte. No s'executa res i el resultat no és el que esperes:

Exercici

Has d'escriure una funció es_primer(n) que retorni True si n és un nombre primer, i False en cas contrari.
Un nombre és primer si és més gran que 1 i no és divisible per cap nombre entre 2 i n-1.

Per exemple:
es_primer(2)True
es_primer(7)True
es_primer(10)False
es_primer(1)False.

Pista: fes servir un bucle for amb range(2, n) i l'operador %, per comprovar si n és divisible per algun nombre.
Si trobes un divisor, retorna False immediatament. Si el bucle acaba sense trobar-ne cap, retorna True.

Resum

  • Una funció es defineix amb def nom(): i es crida escrivint nom(). El codi de dins s'executa cada vegada que la crides.
  • Els paràmetres es declaren dins els parèntesis del def i permeten passar dades a la funció en cada crida.
  • return valor envia el resultat de tornada i acaba la funció. Sense return, la funció retorna None.
  • La diferència entre print i return és crucial: print mostra un valor a la pantalla; return el torna al codi que ha cridat la funció perquè el pugui usar.
  • Les variables declarades dins d'una funció són locals: existeixen únicament mentre la funció s'executa i no es poden veure des de fora.
  • Les funcions fan el codi més curt, més llegible i més fàcil de corregir: si has de canviar una lògica que uses en molts llocs, ho fas en un sol lloc.