Una funció és simplement un "tros" de codi que podeu utilitzar una vegada i una altra, en lloc d'escriure'l diverses vegades. Les funcions permeten als programadors descompondre un problema en trossos més petits, cadascun dels quals du a terme una tasca determinada. Un cop creada una funció, gairebé ens poden oblidar dels detalls de com funciona, és el que es coneix com a abstracció.
Una vegada definida una funció, pots cridar-la sempre que la necessiti, simplement fent servir el seu nom. A més, per funcionar, la funció probablement requerirà algunes entrades o paràmetres, que es donen a la funció cada vegada que es crida.
Fins ara, ja heu estat utilitzant funcions, com: print() ó input(). Són funcions integrades en el llenguatge, tots els llenguatges de programació en tenen.
La funció print(), que s'utilitza per mostrar missatges a la pantalla, s'utilitza amb el nom de la funció, print, seguit de parèntesis () que contenen els paràmetres que li voleu passar. En aquest cas, la cadena "hello world" és l'únic paràmetre. Les funcions es poden considerar petites màquines que realitzen una tasca específica, on els paràmetres són les entrades de la màquina.
Algunes funcions, com ara print(), es poden cridar sense cap paràmetre. Però cada cop que utilitzem la funció hem d'incloure els parèntesis utilitzats per passar els paràmetres, encara que estiguin buits.
Crear una funció nova és bastant senzill i sempre hauríem de considerar aquesta opció per a qualsevol tasca que vulguem que el nostre programa faci amb regularitat.
Per exemple, imagineu que teniu un programa en el qual sovint haurem d'imprimir el contingut d'una llista línia per línia. El codi per fer-ho podria semblar a aquest:
Això són només tres línies de codi, però si necessiteu imprimir llistes amb regularitat, és molt més pràctic crear una funció. Per crear una funció nova, cal definir-la abans de fer-la servir per primera vegada, normalment a l'inici del programa.
La definició s'estructura de la següent manera:
La paraula clau def diu a Python que s'espera una definició.
Un nom senzill però descriptiu per a la funció.
Una llista de paràmetres separats per comes, envoltats de parèntesis.
A continuació, hi ha dos punts : per indicar un bloc de codi sagnat.
Un bloc de codi sagnat, que conté el cos de la funció.
Un cop definida, la funció es pot cridar utilitzant el seu nom i un parèntesi (buit en aquest cas, ja que la funció no pren paràmetres):
La majoria de les màquines quotidianes ens permeten un cert control sobre què fan: la temperatura d'un forn, la velocitat d'un ventilador o la quantitat d'aigua que hauria d'utilitzar una rentadora. Sense aquests elements controlables, necessitaríem una màquina diferent amb una configuració diferent per a cada treball, per exemple, un forn diferent per a cada temperatura a la qual volem cuinar.
Amb la programació passa una cosa semblant. Tot i que les funcions senzilles permeten a un programador empaquetar codi i reutilitzar-lo, sense elements controlables necessitaríem una funció diferent per a cada escenari, encara que siguin molt similars.
En lloc de reinventar la roda cada vegada, un programador crearà una funció que es pot aplicar a múltiples situacions i adaptar-se a cadascuna, fent servir entrades o paràmetres.
Per exemple, aquí hi ha un parell de funcions molt semblants, ambdues calculen la mitjana de tres nombres:
Aquesta duplicació en programes es pot evitar escrivint una única funció amb paràmetres, que després es poden utilitzar per carregar qualsevol número. Podeu posar els noms que vulgueu als paràmetres, no necessiten relacionar-se amb la resta del programa: només existeixen dins l'abast d'aquesta funció.
Quan programeu, sovint haureu de recuperar dades d'una funció, ja sigui simplement per confirmar que la funció ha fet la seva feina o per obtenir algunes dades que la funció ha calculat. Això es fa mitjançant l'ordre return, que "retorna" les dades al procés que ha cridat la funció.
Per exemple, la funció següent demana a l'usuari que introdueixi alguns números i després retorna tots els números en una llista:
Ara podem emmagatzemar la llista que retorna la funció en una variable i fer-la servir sempre que la necessitem. Ara afegeix un símbol de # davant de l'ordre return i mira què passa, és el que t'esperaves?
També es poden retornar diversos valors d'una funció i emmagatzemar-los en variables separades:
Les variables definides dins d'una funció, com nom, existeixen aïllades d'altres variables i només mentre s'executa la funció. Aquest és el seu abast. Les variables definides al programa principal, més que dins de les funcions, existeixen durant la durada del programa i es diu que són d'abast global. Si voleu que una funció tingui accés a variables fora del seu propi àmbit, la millor pràctica seria afegir-les com a paràmetres a la funció:
Veureu que a vegades s'utilitza el terme mètode en lloc de funció. Hi ha poca diferència entre aquests termes. Un mètode és simplement una funció que pertany o forma part d'una altra estructura anomenada classe. Funciona de la mateixa manera, però s'anomena una mica diferent.
En exemples anteriors, hem fet servir el mètode append(). Totes les llistes tenen la funció associada append(), aquesta funció pertany a la llista i, per tant, es coneix com un dels seus mètodes. No puc fer servir append() de forma aïllada.
Una classe és com una plantilla per crear objectes. És com un tallador de galetes:
Els objectes s’utilitzen per modelar coses amb codi. Un objecte pot representar un element físic, com ara una pantalla; o una unitat digital, com ara un compte bancari o un enemic en un joc d'ordinador. Un objecte té atributs (o trossos de dades) emmagatzemats al seu interior i hi podem utilitzar mètodes per donar-li instruccions.
Tots els programes de Python poden utilitzar un conjunt bàsic de funcions anomenades funcions incorporades (built-in functions), com per exemple les funcions print(), input() i range() que ja coneixeu. Python també inclou un conjunt de mòduls anomenats biblioteca estàndard (standard library). Cada mòdul és un programa Python que conté un grup de funcions relacionades que es poden utilitzar als vostres programes. Per exemple, el mòdul math té funcions relacionades amb les matemàtiques, el mòdul random té funcions relacionades amb números aleatoris, etc.
Un mòdul:
El pots importar al teu programa.
Conté funcions, variables i Classes predefinides.
Facilita i agilitza la programació.
Quan utilitzem qualsevol mòdul, és important saber trobar i llegir la seva documentació. La documentació, és un conjunt d'indicacions per tal d'utilitzar correctament el mòdul, hi sol haver:
La llista de funcions i Classes incloses en el mòdul.
Indica com utilitzar cada funció (quins paràmetres s'han de passar, què retorna, etc.).
Exemples d'utilització.
Quan en una funció un paràmetre està entre claudàtors [ ] significa que aquest paràmetre és opcional. P.ex: a la documentació de la funció incorporada round() ens diu:
Obre el teu editor, escriu i executa el següent codi:
Proporciona el resultat que t'esperaves? Entens la diferència?
També ens podem trobar que un paràmetre d'una funció tingui un valor assignat per defecte. En aquest cas, si no assignem un altre valor al paràmetre, la funció utilitzarà el que té assignat per defecte. P.ex: en la funció incorporada enumerate(), diu:
Escriu i executa el següent codi:
Abans de poder utilitzar les funcions d'un mòdul l'heu d'importar. Una declaració d'importació consisteix en:
La paraula clau import
El nom del mòdul
Opcionalment, pots posar més noms de mòduls separats per comes.
Un cop importat el mòdul, pots fer ús de les fantàstiques funcions que el mòdul t'ofereix. Per saber quines funcions t'ofereix cada mòdul has de mirar a la seva documentació. P.ex. aquesta és la documentació del mòdul random: https://docs.python.org/3/library/random.html
On veiem, per exemple, que amb la funció randint(a, b) obtindrem un nombre enter aleatori entre els valors d'a i b que li diguem. Prova aquest exemple:
Com que randint() està dins del mòdul random, hem d'escriure el nom del mòdul abans del nom de la funció per tal que l'intèrpret sàpiga que ha de buscar la funció a dins del mòdul en qüestió.
En comptes d'importar tot el mòdul, també podem importar una sola funció o Classe, amb les instruccions from i import. En aquest cas, no caldrà fer referència al mòdul cada cop que la vulguem utilitzar:
Molts desenvolupadors han escrit els seus propis mòduls, ampliant les capacitats de Python més enllà del que proporciona la biblioteca estàndard.
La forma segura on buscar i instal·lar mòduls de tercers és utilitzar l'eina pip de Python.