Capítol 9 — Funcions
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:

Fixa't que la funció s'ha escrit primer i s'ha cridat després. Python llegeix el fitxer de dalt a baix: si intentes cridar una funció abans de definir-la, obtindràs un error.

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.

return vs print: la diferència clau

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ó:

La instrucció return acaba la funció immediatament. Qualsevol codi que posis després d'un return no s'executarà mai:

Funcions amb diversos paràmetres

Una funció pot tenir tants paràmetres com necessitis, separats per comes. L'ordre importa: 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:

Tampoc no cal que els paràmetres tinguin el mateix nom que les variables que uses quan crides la funció. El valor es copia al paràmetre en el moment de la crida:

Per ara, la regla pràctica és senzilla: passa sempre les dades que necessita una funció com a paràmetres, i obté els resultats amb return. Evita llegir variables de fora de la funció directament.

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

Escriu 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.