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 uns parèntesis (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.