Començant a programar amb Python
En aquest curs aprendreu a programar per a desenvolupar les tasques d’un administrador de sistemes.
Per què ha d’aprendre a programar un sysadmin o administrador de sistemes? Tradicionalment (i ara també), en algunes empreses s’han diferenciat dos equips humans:
- Equip de desenvolupadors, creen el software de l’aplicació.
- Equip d’administradors, són els responsables de mantenir l’arquitectura i infraestructura de les organitzacions i de què l’aplicació funcioni bé en els servidors.
Actualment ja està apareixent una nova figura:
- Equip DevOps, equip que duen a terme un treball col·laboratiu. Els professionals DevOps incorporen processos, eines i metodologies per equilibrar i donar resposta a les necessitats que van apareixent durant tot el cicle de vida del software, des de la programació i la implementació fins al manteniment i l’actualització. L’objectiu de l’equip DevOps és la unificació i automatització dels processos.
Hi ha una gran demanda de professionals amb perfil DevOps, i per tant tenir coneixements de programació és fonamental per completar la vostra formació.
Motius pels quals usar Python
Python és un llenguatge de programació que va ser creat el 1989 per Guido Van Rossum.
En principi era un intèrpret per a un llenguatge de scripting, és a dir, que permet crear scripts (seqüències d’instruccions per al sistema).
És un llenguatge de programació interpretat i d’alt nivell, que es va idear amb una filosofia per afavorir la llegibilitat.
Té una llicència de codi obert que es diu Python Software Foundation License.
I, és un llenguatge multiparadigma, és a dir, admet diferents tipus de programació. El podem utilitzar per a fer programació imperativa, programació orientada a objectes i inclús programació funcional.
Hi ha diverses raons per a escollir el Python en començar a programar i tot seguit les repassarem.
Llenguatge scripting
Un llenguatge de scripting és un tipus de llenguatge de programació que simplifica el processament de text. Redueix la càrrega per al programador i augmenta la que recau en el processador. Per aquesta raó són molt populars entre els administradors de sistemes.
Programació imperativa
La programació imperativa es considera el paradigma de programació més antic. Segons aquest, un programa és una seqüència clarament definida d’instruccions per a un ordinador.
Perquè és el llenguatge més utilitzat en tot el món
Per fer aquesta afirmació ens basem en dues evidències. La primera, són les consultes que s’han realitzat a StackOverflow en Python. Aquest lloc web és una comunitat de preguntes i respostes per a programadors i aficionats a la programació, de les més prestigioses del món.
Des que va començar Python, el volum de preguntes sobre aquest llenguatge a StackOverflow ha anat creixent sense parar (figura).

La segona evidència ens la dona la xarxa social LinkedIn, on podem consultar les ofertes de feina per a programadors (figura). Les dades extretes d’aquesta xarxa social ens mostren que els programadors de Python són els més demandats.
Perquè té una sintaxi neta i és codi llegible
Tot programador o aficionat a la programació ha de saber que el primer pas imprescindible per a iniciar l’aprenentatge en un nou llenguatge de programació és escriure i executar el programa “Hello, world”. És un programa bàsic en el qual l’únic que se li demana al processador és que mostri el missatge anterior (“hola, món”). A continuació veurem el codi font del programa en 3 llenguatges.
“Hello, world” en c:
#include <stdio.h>
int main(void) {
printf("Hello, world.\n");
return 0;
}
“Hello, world” en Python3:
print("Hello, world.")
Finalment, hi ha llenguatges rars i extravegants com el cas del del CHICKEN. Tot seguit podeu veure com és el programa “Hello, world” amb aquest codi:
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
Revisant aquests exemples de codi, podeu veure clarament que Python és el més clar pel que fa a la sintaxi i la llegibilitat.
Perquè és de codi obert
La Python Software Foundation License (PSFL), és compatible amb la llicència GNU General Public License (GPL). Permet modificacions del codi font, així com la creació de treballs derivats, sense requerir que ni les modificacions ni els treballs derivats hagin de ser al seu torn de codi obert.
Perquè és versàtil
La gran quantitat de llibreries que suporta Python permet programar tant jocs, com aplicacions científiques, apps per a mòbil, aplicacions web, projectes de Big Data, desenvolupament d’AI…
Perquè Python és un llenguatge multiplataforma
Tradicionalment, les principals eines eren:
- Llenguatges de scripts per Linux, per exemple, Bash.
- PowerShell per Windows.
Això vol dir que els administradors havien d’utilitzar un llenguatge de scripting o un altre segons la plataforma on havien d’executar els seus programes.
Python permet fer programes portables que funcionen indistintament sobre qualsevol plataforma (tant pot ser Linux, Windows, Mac, Android…). És a dir, es pot usar el mateix programa independentment del sistema operatiu sobre el qual s’executi.
Perquè ofereix millores i facilitats en algunes tasques
Moltes de les tasques que ha de fer un administrador es poden programar més fàcilment a Python. Algunes són:
- L’administració de fitxers.
- El tractament de les expressions regulars. Les expressions regulars (en anglès regexp) són patrons que es fan servir per trobar una determinada combinació de caràcters en una cadena de text. Són molt útils per als professionals especialistes en sistemes.
- El treball pel que fa al Sistema Operatiu (SO), oferint mòduls i llibreries especialitzats:
- Mòdul os per accedir a funcions del SO.
- Mòdul shutil per fitxers.
- Mòdul subprocess que permet executar funcions en el SO.
- Crear scripts parametritzats. Un script és una seqüència de comandes (o un “programa curt”). El Python permet introduir les dades com a paràmetre des de la línia d’ordres i fer programes com a administradors. En aquests les dades solen arribar com a sortida d’altres comandes i ens permet oblidar-nos dels programes que interactuen amb l’usuari.
Perquè permet fer programació estructurada
L’objectiu d’aquest curs és assolir els fonaments de la programació estructurada. No es tracta d’un curs de Python, sinó que aquest serà l’instrument (com ja hem dit, el millor) per aprendre a programar.
S’intentarà donar una visió àmplia dels conceptes, de manera que el “canvi de llenguatge” no hauria de ser un gran problema si se’n vol aprendre un altre més endavant. S’utilitzaran algunes de les facilitats de Python, però sempre des d’un punt de vista generalista i que sigui compatible amb la funcionalitat dels altres grans llenguatges de programació.
Aprendreu a crear programes aplicant els algorismes “naturals”. L’objectiu principal del curs és saber traduir el que fem “a mà”, no buscar algoritmes brillants ni idees felices per millorar l’eficiència.
Els programes que fareu fugiran de la interactivitat amb l’usuari. Les dades per la línia d’ordres s’introduiran tal com fan els administradors de sistemes.
Es diferenciarà clarament el control d’errors, del programa en si. En el cas que les dades no siguin vàlides, s’avortarà el programa.
Ho veureu amb més claredat a mesura que feu els primers programes.
Conceptes bàsics de programació
A mida que entreu dins del món de la programació us anireu trobant amb termes nous: algorisme, programa, programador, usuaris, compilació… i d’altres no tan nous com instrucció, dades d’entrada… en tots els casos us ajudarà molt tenir un concepte clar de a què es refereixen quan els utilitzem durant el curs. A continació us els presentem.
Ús estructurat del llenguatge
L’ús de partícules no estructurades (break, continue o exit que ara és normal que no coneixeu) es limitarà al control d’errors.
Algorisme vs. programa
Un algorisme indica el mètode de resolució d’un problema en un nombre finit de passos. Per exemple, els passos per a fer una crema de verdures o com ordenar tres nombres de petit a gran.
Un programa és l’expressió d’un algorisme en un llenguatge que l’ordinador entén. És una seqüència d’instruccions que fa que la Unitat Central de Processament (CPU), considerada el “cervell” de l’ordinador, executi un càlcul per obtenir un resultat. Un conjunt de programes enllaçats convenientment s’anomena una aplicació informàtica
Aquestes instruccions són expressions formades per combinacions de paraules, dades i símbols que, obeint la sintaxi pròpia del llenguatge, són utilitzades per indicar una acció determinada i senzilla, que la màquina ha de ser capaç d’interpretar.
Així doncs, la programació és la seqüència de passos que ha d’especificar un/a programador/a per construir un programa.
Programador/a vs. usuari
Un programador/a és aquella persona que s’encarrega de codificar programes, mentre que un usuari és la persona que fa servir una aplicació informàtica amb la intenció d’aconseguir un resultat final.
Processador vs. programa
S’anomena processador a tota entitat capaç d’executar un algorisme. En el cas dels programes, el processador serà un ordinador. Per exemple, en el cas d’un programa que suma dos números, l’ordinador serà el que executarà el programa i realitzarà els càlculs. Quan partim d’un l’algoritme per a fer una crema de verdures amb un robot de cuina, el processador, que rebrà les instruccions i farà el que se li indiqui, serà el robot de cuina.
Un programa compta d’un conjunt d’instruccions i de dades. Les instruccions indicaran al processador què ha de fer i les dades poden ser els valors inicials que posem en el programa o bé els que ens retorna. Per exemple, si el programa ordena tres nombres, les dades d’entrada serien els tres nombres.
Les dades consisteixen en tota la informació que un ordinador utilitza.
Altres conceptes
L’execució és el procés mitjançant el qual un ordinador efectua les instruccions d’un programa. Seria l’equivalent a un cuiner seguint els passos d’una recepta.
Cada execució necessita unes dades d’entrada i ens dona un resultat. Si continuem amb l’exemple del cuiner, les dades serien els ingredients necessaris i el plat que aconseguim al final, seria el resultat. Si es modifiquen els ingredients (pastanaga en comptes de carabassó), el plat final canvia. Per tant, si es modifiquen les dades d’entrada, el resultat obtingut és diferent.
El tipus d’una dada és una característica que la identifica i la “iguala” a altres semblants. En una recepta de crema de verdures, per exemple, podem substituir carabassó per pastanaga, però no carabassó per oli, ja que tant el carabassó com la pastanaga serien de tipus verdura, mentre que l’oli no.
Un operador és una acció que es pot fer entre (o amb) dades d’un mateix tipus. Per exemple, a la recepta de la crema de verdures, les diferents verdures es poden tallar. Indica una acció que s’aplica sobre aquella dada.
Característiques desitjables dels algorismes
Un algorisme, per definició, ha de ser finit; això vol dir que ha d’acabar en un nombre determinat de passos. A més, sempre que sigui possible, ha de tenir les següents característiques:
- Ha de ser llegible. Els humans han de ser capaços d’interpretar els passos que el processador està executant. Com més li facilitem la feina a l’humà que ho hagi d’interpretar (que en moltes ocasions serem nosaltres mateixos), millor serà l’algorisme.
- Ha de ser portable. Ha de poder funcionar en diverses plataformes. Per exemple, ha de funcionar sobre equips diferents.
- Ha de ser modificable. És a dir, si tenim un programa que calcula l’IVA dels productes, ha de ser fàcil de modificar el valor d’aquest IVA.
- Ha de ser escalable. Hem de poder augmentar les prestacions del programa a poc a poc. Per exemple, si tenim un problema que calcula l’IVA dels productes, hauríem de poder ampliar-lo perquè calculi diferents tipus d’IVA.
- Ha de ser eficient. Com més eficient sigui un algorisme millor. Però en aquest curs l’eficiència no serà l’objectiu principal.
- Ha de ser estructurat. Perquè fa servir estructures de selecció i de repetició.
- Ha de ser modular. Per tant, si separem els passos en mòduls o funcions, els podrem reutilitzar.
Tipus de programació
Hi ha diferents maneres de programar, algunes d’aquestes són les següents:
- Programació estructurada: utilitza només seqüències, instruccions condicionals i instruccions repetitives. Dona ordres a fer una darrera l’altre.
- Programació modular: el programa es dissenya per parts, que anomenem mòduls.
- Programació orientada a objectes: paradigma de la programació que usa “objectes” (estructures amb atributs i mètodes) i les seves interaccions per dissenyar programes.
- Programació concurrent: útil quan hem de realitzar diverses accions a la vegada.
- Programació funcional: basada en l’ús de funcions matemàtiques.
- Programació lògica: basada en expressions lògiques.
En aquest curs, utilitzarem únicament la programació estructurada.
Codificació
Durant creació d’una aplicació informàtica, la fase de codificació consisteix a traduir l’algorisme a un llenguatge especial que pugui entendre l’ordinador. Per fer això farem servir els llenguatges de programació.
Segons el nivell de complexitat de la instrucció que donem al processador, podem classificar els llenguatges en diversos tipus:
- Els llenguatges de baix nivell són els que requereixen poca o gens d’abstracció per part de l’ordinador. És a dir, són instruccions que el processador directament “entén”. Són principalment el llenguatge màquina i l’assemblador.
- Els llenguatges d’alt nivell, d’altra banda, requereixen més abstracció per part de l’ordinador. És a dir, el processador les ha de traduir internament en instruccions més petites abans de poder-les “entendre”. Aquests llenguatges són, però més fàcils d’utilitzar i entendre pels humans. Són llenguatges d’alt nivell el Python, Java o C.
El programa font o codi font és el resultat de la codificació d’un algorisme a llenguatge d’alt nivell. Sol ser un fitxer que conté totes les instruccions, en seqüències, comparacions i iteracions (o cicles).
Interpretació vs. compilació
Els llenguatges d’alt nivell poden ser interpretats o bé compilats. El llenguatge Python és interpretat. Això vol dir que a partir del codi font, cada instrucció es tradueix (perquè el processador l’entengui) i s’executa. Altres exemples d’aquest tipus de llenguatge són el Javascript, Bash, PHP…
Altres llenguatges de programacions són compilats. Aquests passen un procés de compilació al codi font i generen un programa en un format que el processador ja pot executar. No es fa l’execució pas a pas, sinó que es genera primer l’arxiu amb totes les instruccions que el processador executarà de cop. Alguns llenguatges que funcionen així són el C, el Fortran, el Pascal, el Java…
Per això, per programar en Python fareu servir un entorn de programació interpretat que tradueix el codi font a codi màquina i l’executa, instrucció per instrucció.
Pels llenguatges compilats es fan servir un entorn de programació compilat, que tradueix tot el codi font a llenguatge màquina i permet obtenir un nou programa anomenat programa objecte. A continuació, es fa servir un programa muntador que és un programa que genera un programa executable a partir del o dels programes objectes.
Ús de dades i operadors aritmètics a l'entorn interpretat
Tot seguit, us guiarem en la resolució d’un repte per començar a conèixer i fer servir els tipus de dades enters i nombres decimals, anomenats en Python floats. A través d’aquesta activitat, explorareu les característiques d’aquests tipus de dades i la seva aplicació en operacions aritmètiques bàsiques.
S’utilitzarà l’intèrpret interactiu de Python per provar diferents operacions amb nombres enters i floats i observar els resultats que s’aconsegueixen.
L’intèrpret interactiu de Python no és més que un entorn on podem “dialogar” amb el processador. Si li introduïu una instrucció, us contestarà sempre que sigui capaç d’entendre el llenguatge.
El repte serà fer servir l’intèrpret interactiu com si fos una calculadora. Amb això aprendreu a fer servir les dades numèriques i els operadors aritmètics, vells coneguts de les classes de matemàtiques.
Pas 1: engegar l'intèrpret interactiu
Obriu una terminal i engegueu l’intèrpret interactiu de Python. Per a aconseguir-ho, cal escriure el següent a la pantalla de la terminal:
python3
Acabeu d’entrar en el mode interactiu de l’intèrpret de Python. Ara podreu escriure les instruccions per a l’intèrpret i ell us “contestarà”. Si voleu retornar a la línia d’ordres, cal prémer Ctrl-d o exit()
(proveu què passa si escriviu exit.
Com instal·lar Python en Linux i en Windows
En totes les distribucions de Linux, el Python ja ve instal·lat per defecte.Si, així i tot, teniu algun problema, en aquesta adreça podeu consultar com instal·lar-lo:
Indicacions per instal·lar Python a Linux: opensource.com/article/20/4/install-python-linux
Indicacions per instal·lar Python a Windows: bit.ly/40hypOD
Pas 2: Els operadors binaris +, -, *, /
Un operador binari és aquell que opera entre dues dades. Per exemple, l’operador +. Amb un operador binari escrivim cada dada a un costat de l’operador, com en el cas de 3 + 5.
Experimenteu comprovant que l’intèrpret sap calcular. Per començar, podeu donar-li instruccions com si fos una calculadora (aquest tipus d’instruccions són un llenguatge que l’intèrpret de Python entén). Per exemple:
2 + 8
Feu a continuació diverses proves amb els operadors aritmètics que coneixeu (+,-,*, /). Els 4 operadors són binaris. Per exemple:
L’ús d’espais en blanc entre els nombres i els operadors no és obligatori. Però és molt recomanable, ja que augmenten la llegibilitat. L’increment de llegibilitat augmenta la qualitat d’un programa.
1 + 7 8 - 2 3 * 2 9 / 3
Finalment, anticipeu i comproveu el tipus de dada que resultant en els següents exemples:
4 + 7 5 / 2 3.5 - 2 4.5 * 8 / 2 / 2
Resultats que heu d’haver obtingut:
- 11
- 2.5
- 1.5
- 9.0
Pas 3: tipus enter i tipus float
En Python, hi ha dos tipus de dades numèriques: int i float.
Intuïtivament, una dada de tipus int la podem associar al concepte de nombre enter, i una de tipus float al de nombre amb decimals (o nombre real) que ja tenim de les matemàtiques.
Els nombres enters són nombres sense part decimal, mentre que els nombres reals (o floats per python) són nombres amb part decimal. Per exemple, 1 és un nombre enter o int, mentre que 1.0 és un nombre real o float.
Els nombres de tipus int i float es poden utilitzar en operacions aritmètiques bàsiques com suma (+), resta (-), multiplicació (×) i divisió (/).
Fixeu-vos que en els resultats dels exemples anteriors, es poden observar dues dades de tipus diferent: en algun cas obtenim el valor 11 i en un altre el valor 9.0.
La dada “11” ens remet a pensar en un nombre enter i és una dada de tipus int.
Per contra, quan obtenim “9.0”, hem de pensar que tot i que el valor és el 9, la dada que representa correspon a un nombre amb decimals. És una dada de tipus float. Experimenteu amb diversos nombres i operadors i comproveu el següent.
Si sumeu dos nombres enters quin tipus de dada obteniu? Per exemple:
>>> 3 + 7 10
Com que és 10 i no 10.0 podeu comprovar que és una dada entera
Si resteu un nombre int d’un float, quin tipus de dada obteniu? Per exemple:
>>> 8.0 - 19 -11.0
Serà un float, perquè un dels nombres és float.
Si multipliqueu dos nombres int quin tipus de dada en resulta? Per exemple:
>>> 5 * 7 35
És una dada entera (és a dir, de tipus int).
Si dividiu dos dades de tipus int, de quin tipus és la dada resultant? Per exemple:
>>> 4 / 2 2.0
És una dada float, tot i que la divisió sigui exacta.
Per sort, tot quadra amb el que sabem de matemàtiques.
En el món de la informàtica els conceptes int (enter en anglès) i float no coincideixen exactament amb els matemàtics de nombre enter i nombre real. Però són molt semblants, i la idea intuïtiva que tenim s’ajusta bastant.
Els int i els float ocupen quantitats de memòria diferents i pel que fa als bits s’expressen també de manera diferent.
Cal entendre que és impossible traslladar la noció que un nombre real pot tenir infinits decimals a un ordinador, com li passa al nombre pi, per exemple. Per molta precisió que hi hagi, en algun moment haurem de limitar la quantitat de xifres i s’haurà de tallar o arrodonir la representació del nombre.
En matemàtiques el nombre 2 com a enter i el 2 com a nombre real és el mateix. En canvi, en l’àmbit de l’ordinador el 2 i el 2.0 no són exactament iguals, ja que les dades són de tipus diferent (la primera és entera i la segona float). No hi ha cap problema, però, en operar entre dades enteres i float.
Float en informàtica i nombre real en matemàtiques
Per veure que els conceptes de nombre float i nombre real no són el mateix, observeu què passa si a l’intèrpret interactiu escriviu el nombre 1.9, i aneu afegint un 9 més després de l’últim decimal diverses vegades.
1.9 1.99 1.999 1.9999Segons l’ordinador, arriba un moment en el qual el nombre 1.999… passa a valer 2.0. En les matemàtiques això passa quan tenim infinits decimals. A l’ordinador passa molt abans
Pas 4. Els operadors unaris - i +
Un operador unari és aquell que actua sobre una sola dada. Per exemple, l’operador - (entès com a canvi de signe), com en el cas -33.
Els mateixos símbols que es fan servir per a la suma i la resta s’utilitzen també per als operadors unaris del canvi de signe i la unitat. Sembla molt complicat, però tots entenem els conceptes -3 o +4.5. En el primer cas s’efectua un canvi de signe i el segon d’identitat (no es produeix cap canvi en la dada).
En el cas dels operadors unaris s’ha d’escriure l’operador seguit de la dada, sense deixar un espai en blanc enmig. Com en els casos +3 o -34.
Aquests operadors es poden combinar entre ells sense problemes (igual com ho fem en matemàtiques).
Comprova que el resultat de cada una d’aquestes instruccions és el que esperaves.
--5 +-+-+-32
Veureu que els resultats seran:
>>> --5 5 >>> +-+-+-32 -32
Per entendre el resultat només cal recordar la regla matemàtica que ens han repetit des de petits: menys per més, és menys i menys per menys, és més.
Pas 5: L’operador **
L’operador ** és el que matemàticament coneixem com a operador de l’exponenciació.
2 ** 3 seria la manera en Python d’escriure 2^3.
Comproveu els resultats de les següents operacions:
2**2 2**3 2**4 3**3
Veureu que els resultats seran:
>>> 2**2 4 >>> 2**3 8 >>> 2**4 16 >>> 3**3 27
Pas 6: els operadors // i %
Existeixen uns operadors aritmètics més que no se solen estudiar a l’escola. Tots dos són binaris (operen sobre dues dades) i estan definits sobre dades de tipus enter.
- Divisió entera (
//). Tot i que permet operar sobre dades float, només té sentit (matemàtic) si l’utilitzem sobre enters. Sempre produeix un nombre enter. - Mòdul (
%). Ens retorna el residu de la divisió entera entre dos operands. Tal com passa amb la divisió entera, també permet operar amb dades float, però només tindrà sentit si l’utilitzem entre dades enteres.
Operadors binaris // i %
En aquests exemples podeu veure quins resultats us dona utilitzar la divisió entera o el mòdul.
6 // 2és3. Si dividim 6 entre 2, el resultat enter dona 3. I sobren 0 unitats.6 // 4és1. Si dividim 6 entre 4, el resultat enter dona 1 (podem fer un conjunt de 4). I sobren dues unitats.
En el cas del mòdul, hem de recordar que ens retorna el residu de la divisió entera:
6 % 2és0. El residu són les unitats que sobren de fer la divisió entera, o divisió a mà. En aquest cas, com que la divisió és exacta ens dona 0.6 % 4és2. Si fem la divisió entera, el resultat és 1 i sobren 2 unitats.
Divisió euclidiana (ampliació)
La definició d’aquests operadors es fa conforme a la definició matemàtica de la divisió euclidiana: a dos nombres naturals a (dividend) i b (divisor), amb b no nul, la divisió euclidiana els associa un únic quocient q i un únic residu r, tots dos naturals, que verifiquen:
Aquests operadors són molt importants en la informàtica, ja que ens permetran fer programes relacionats amb cicles (sobre setmanes, minuts i segons…).
El quocient és el resultat de l’operador // si l’utilitzem entre el dividend i el divisor.
a // b→q(“→” vol dir “dona com a resultat”. En aquest cas, el quocient)
El residu és el resultat de l’operador % si l’utilitzem entre el dividend i el divisor.
a % b→r(dona com a resultat el residu)
És a dir, l’operador // ens proporciona el resultat de la divisió entera del primer nombre entre el segon (el resultat sense decimals, per entendre’ns).
Divisió entera
14 // 4 és 3. Ja que, 14 entre 4 serien 3 i escaig, és a dir que el resultat de la divisió entera és 3.
L’operador % ens proporciona el residu de la divisió entera del primer nombre entre el segon (és a dir, “el que sobra”).
Mòdul
14 % 4 és 2. Si fem grups de 4 en “sobren” 2 que no podem repartir.
Calculeu mentalment aquestes operacions i comproveu amb l’intèrpret interactiu que el resultat és el correcte
12 // 3 12 % 3 34567 % 5 13 // 3 13 % 3 34567 % 10 45 // 6 45 % 6 7 % 34567
Els resultats que n’obtindreu són:
És el mateix 4 / 2 que 4 // 2?
Si ho comproveu a l’intèrpret interactiu, obtindreu aquests resultats:
4 / 2 dona 2.0
4 // 2 dona 2
La divisió decimal (/) entre dos nombres enters sempre dona una dada de tipus float, tot i que sigui exacta (per això mostra 2.0).
En canvi, la divisió entera ( // ) entre dos nombres enters sempre dona un altre nombre enter.
>>> 12 // 3 4 >>> 12 % 3 0 >>> 34567 % 5 2 >>> 13 // 3 4 >>> 13 % 3 1 >>> 34567 % 10 7 >>> 45 // 6 7 >>> 45 % 6 3 >>> 7 % 34567 7
Divisió entera i mòdul sobre nombres enters negatius (ampliació)
Els exemples que hem posat fins ara són amb nombres enters i positius. I és el que cal que entengueu.
Si els nombres són enters però negatius (o algun d’ells ho és), passen coses que no acaben de coincidir amb el nostre sentit comú.
Observeu què passa en els següents exemples:
- Exemple 1:
>>> 0 - 5 // 2 -2
És diferent de:
>>> - 5 // 2 -3
- Exemple 2:
>>> 0 - 5 % 2 -1
És diferent de:
>>> - 5 % 2 1
- Exemple 3:
>>> 0 - 5 // -2 3
És diferent de:
>>> - 5 // -2 2
Només cal que recordeu que amb nombres negatius el comportament pot ser estrany. I que si mai ho heu de fer, utilitzeu l’intèrpret interactiu per verificar el resultat.
Divisió entera i mòdul amb negatius en diferents llenguatges de programació (ampliació)
Cal dir que la qüestió de la divisió entera i el mòdul no s’ha resolt igual en els diferents llenguatges de programació, el que indica que és un concepte gens intuïtiu.
En el llenguatge C, per exemple, -1 // 5 dona 0. En Python dona -1. El problema és que quan estenem el concepte de divisió entera sobre els nombres enters (és a dir, quan incloem els negatius) hem de considerar que el quocient i el residu han de ser enters i s’ha de complir la condició:
És a dir, que el valor absolut del residu ha de ser menor que el del divisor. En aquest cas no es pot garantir la unicitat del quocient i el residu i és degut a això que pot haver-hi dues interpretacions diferents:
- Si agafem el -5 com a dividend i el 2 com a divisor obtenim: -5 = 2 · (-3) + 1 . Segons això, -5 D 2 és -3 ; i -5 % 2 és 1.
- Si agafem el 5 com a dividend i el -2 com a divisor obtenim: -5 = 2 · (-2) - 1. En aquest cas, -5 D 2 és -2; i -5 % 2 és -1.
El llenguatge Python ha optat per la primera i el C per la segona.
Quan utilitzem l’operador - entre dos enters (és a dir, quan utilitzem l’operador - binari), en realitat estem canviant el signe del resultat de l’operació, realitzada entre els nombres naturals. Per això els resultats són diferents.
De tota aquesta explicació, l’únic que cal que recordeu és que si utilitzeu la divisió entera i el mòdul amb nombres negatius, cal que verifiqueu el resultat amb l’intèrpret interactiu, ja que no és gens intuïtiu.
Aquests operadors us podrien servir per resoldre els següents problemes: Quants minuts sencers són 234 segons? Quants segons sobren?
>>> 234 // 60 3 >>> 234 % 60 54
234 segons són 3 minuts sencers, perquè si dividim en blocs de 60 (divisió sencera entre 60) ens dona 3. I sobren 54 segons, perquè el residu de la divisió de 234 entre 60 són 54.
D’aquí a 733 dies, quantes setmanes i dies hauran passat? Com es pot calcular amb l’intèrpret interactiu?
>>> 733 // 7 104 >>> 733 % 7 5
D’aquí a 733 dies hauran passat 104 setmanes senceres i 5 dies.
Pas 7: prioritat dels operadors aritmètics
Què passa quan trobeu diversos operadors en la mateixa operació? Quins heu de començar resolent?
- L’operador amb més prioritat és l’exponenciació
**. - En segon lloc, els operadors unaris identitat i canvi de signe (
+,-unaris). - Després venen els relacionats amb multiplicar i dividir, que també inclouen els de la divisió entera i el mòdul (
*,/,//,%). - Finalment, els operadors binaris de sumar i restar (
+,-):
En cas que hi hagi més d’una operació amb la mateixa prioritat es resolen d’esquerra a dreta. Amb una excepció, l’operador de potenciació que opera de dreta a esquerra.
Exemple de resolució d'esquerra a dreta
149 % 10 % 7
En aquest cas, el resultat és 2, ja que hem fet les operacions d’esquerra a dreta: per començar hem fet 149 % 10, que dona 9, i després hem fet 9 % 7 que ens dona 2. Tots els operadors aritmètics excepte l’exponenciació operen d’esquerra a dreta
Exemple de resolució de dreta a esquerra amb potències.
4 **2 ** 3
Si l’exponenciació operés d’esquerra a dreta, el resultat hauria de ser 4 elevat a 2 que és 16, i 16 elevat a 3 que ens donaria 4096.
En canvi, l’intèrpret interactiu diu que el resultat és 65535.
L’operador de potenciació és l’únic que opera de dreta a esquerra. Això vol dir que en l’operació anterior hem de començar per la dreta i fer 2 3. D’aquí ve el que ens dona 8 i després fer 4 865535.
Efectueu les següents operacions mentalment i comproveu que enteneu l’ordre de les prioritats dels operadors aritmètics:
2 + 24 % 5
El resultat és 6. Primer cal fer el mòdul (24 % 5) i després la suma amb el resultant (2 més el 4 resultant).
3 - 2 * 4 ** 2
Dona -29. Cal començar per la potència ( 4 ** 2). El resultat (16) s’ha de multiplicar per 2 (2 * 16) i finalment fer la resta (3 menys el resultat que és 32).
7 - 30 % 7 * 7
El mòdul i la multiplicació tenen la mateixa prioritat. De manera que operarem d’esquerra a dreta: primer el mòdul (30 % 7) que resulta 2, seguit de la multiplicació (el resultat, 2 * 7) i, finalment, la resta (7 - el resultat, 14). El resultat final és -7.
4 - 5 % 3 // 2 * 2
El resultat és 2. Tenen prioritat les operacions que no són la resta, i cal fer-les d’esquerra a dreta. Primer el mòdul (5 % 3) que resulta en 2. A continuació, la divisió sencera de 2 entre 2, que ens dona 1. Seguidament, la multiplicació (1 * 2) que resulta en 2. Finalment, la resta (4 - el resultat anterior, 2).
3345 % 10 // 2
Dona 2. Totes tenen la mateixa prioritat. Cal començar pel mòdul (3345 % 10) que dona 5, i fer la divisió entera (5 entre 2).
100 ** 1 / 2
El resultat és 50.0. Té prioritat la potència, 100 elevat a 1 és 100 i fem la divisió entre 2. El resultat és un float perquè és la divisió decimal.
5 / 2 * 2
El resultat és 5.0. Si fem la divisió decimal d’un nombre i el multipliquem pel mateix, tenim el del principi.
5 // 2 * 2
El resultat és 4. Els operadors tenen la mateixa prioritat i cal començar pel de l’esquerra (5 entre 2) dona 4 que es multiplica per 2. En aquest cas tenim un nombre enter.
Pas 8: modificar la prioritat de les operacions amb parèntesis
Tal com, passa amb les matemàtiques, els parèntesis els utilitzem quan volem alterar la prioritat de les operacions. Quan hi ha un parèntesi cal començar resolent el que trobem en el seu interior. Una vegada trobat el resultat del parèntesi, prosseguirem aplicant la prioritat de les operacions aritmètiques.
Comproveu que les regles matemàtiques sobre la prioritat de les operacions són vàlides, fent els càlculs a mà i comprovant el resultat amb l’intèrpret interactiu.
Prioritat dels parèntesis
10 ** 2 * 2
El resultat és 200. Té prioritat la potència i després es multiplica.
10 ** (2 * 2)
El resultat és 10000. El parèntesi altera la prioritat i hem de multiplicar abans d’elevar.
5 / / 2 * 2
Dona 4. Tenen la mateixa prioritat i hem de començar d’esquerra a dreta. Primer 5 // 2 i el resultat, 2 * 4.
5 // (2 * 2)
El resultat és 1. Cal resoldre primer el parèntesi i posteriorment fer la divisió entera.
1 + 2 * 3 % 5
El resultat és 2. La suma és l’últim que hem de fer. Per tant, primer multiplicació (2 * 3) dona 6. Seguidament aquest 6 % 5 i dona 1. Finalment 1 + 1 i obtenim el 2.
(1 + 2) * 3 % 5
El resultat és 4. El parèntesi ens fa començar per la suma. Obtindríem (1 + 2) que seria 3. Seguidament, aquest 3 * 3, dona 9. Finalment, aquest 9 % 5, que dona 4.
Pas 9: Errors
Qualsevol llenguatge té unes normes de sintaxi, i per comunicar-vos amb el processador de Python heu de seguir les seves. En cas contrari, el processador envia un missatge per anunciar que no us entén, o per queixar-se si li demaneu instruccions que no pot fer o que no estan permeses. Tot seguit veurem els casos que estudiarem.
Errors de sintaxi
Són els més comuns quan comencem. Si el processador no us entén (perquè no utilitzeu bé el seu llenguatge), es queixa. Vegem-ne alguns exemples comuns:
>>> 2 +
File "<stdin>", line 1
2 +
^
SyntaxError: invalid syntax
Avisa que no es respecta el llenguatge del processador: l’operador + és un operador unari o binari, però sempre necessita una dada a la dreta.
>>> 6 +* 3
File "<stdin>", line 1
6 +* 3
^
SyntaxError: invalid syntax
Aquest cas és exactament el mateix: s’utilitzen dos operadors seguits. El + es pot considerar binari o unari, però el * és binari i necessita una dada a la dreta i una altra a l’esquerra.
>>> 3 4 + 5
File "<stdin>", line 1
3 4 + 5
^
SyntaxError: invalid syntax
En aquest cas hi ha un espai en blanc entre dues dades. Un espai en blanc no és un operador binari, i entre dades sempre hi ha d’haver operadors.
>>> 2 +- 3 -1
Per què no es produeix un error? Perquè el + i el - també es poden interpretar com a operadors unaris. Es calcula quan és +-3 (que és -3) i finalment (per la prioritat de les operacions), es calcula 2 - 3.
Altres errors: dividir per zero
>>> 6 / 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero
Matemàticament, no es pot fer la divisió d’un nombre entre zero (perquè no existeix cap nombre que si el multipliquem per zero, ens doni 6, per exemple). Els ordinadors tampoc poden fer-ho.
Parèntesis no tancats
>>> 2 * (3 + ...
Si el processador detecta que heu obert un parèntesi i que en arribar a final de la línia (és a dir, en el moment en què premem la tecla intro) no l’heu tancat, interpreta que encara no s’ha acabat d’escriure la instrucció. És a dir, és com si descartés l’intro que heu escrit, i els tres punts són una invitació a acabar la línia.
En el moment que tanqueu el parèntesi i premeu el retorn de línia, ja us entendrà i contestarà.
>>> 2 * (3 + ... 1) 8
Aspectes fonamentals
El processador de Python us permet interactuar amb ell. Aprendreu a utilitzar-lo “preguntant-li” les instruccions una a una, i més endavant englobarem totes les instruccions en un programa.
A l’eina que ens permet interactuar amb el processador fent servir python l’anomenem intèrpret interactiu.
Convé no oblidar que és una eina molt útil quan no teniu clara la resposta a una instrucció. Així la podeu comprovar abans d’incloure-la al programa
Per tal de poder formular adequadament les instruccions a donar a l’intèrpret interaciu, és important conèixer quines dades i operadors es poden fer servir, i què ens indiquen els missatges d’error que de vegades us retornarà.
Hi ha dades de tipus int i de tipus float, que corresponen, aproximadament, als conjunts matemàtics d’enters i reals.
Operadors aritmètics: tipus resultants segons les dades
Els operadors aritmètics operen entre dades numèriques (enters i float). La dada resultant és un enter o un float segons les normes aritmètiques de les matemàtiques:
- Si operem dos nombres enters amb qualsevol dels operadors binaris
+,-,*,//,%el resultat és un enter. - Si operem dues dades numèriques (qualsevol combinació d’enters i float) amb l’operador divisió decimal
/, el resultat sempre és un float (comprova el cas4 / 2). - Si utilitzem una (com a mínim) de les dues dades float en fer una operació amb els operadors binaris
+,-,*,/el resultat és un float. - No té sentit utilitzar els operadors
//i%si les dues dades no són enteres.
Prioritat dels operadors aritmètics
La prioritat dels operadors aritmètics és la mateixa que en les matemàtiques. Com que la definició de la divisió entera (//) i el mòdul (%) provenen de la divisió, la prioritat serà la mateixa que la de la multiplicació i la divisió amb decimals.
La prioritat dels operadors aritmètics es defineix en la taula següent:
| Operació | Operador | Paritat | Associativitat | Precedència |
|---|---|---|---|---|
| Potenciació | E | Binari | Per la dreta | 1 |
| Identitat | + | Unari | 2 | |
| Canvi de signe | - | Unari | 2 | |
| Multiplicació | * | Binari | Per l’esquerra | 3 |
| Divisió | / | Binari | Per l’esquerra | 3 |
| Divisió entera | D | Binari | Per l’esquerra | 3 |
| Mòdul | % | Binari | Per l’esquerra | 3 |
| Suma | + | Binari | Per l’esquerra | 4 |
| Resta | - | Binari | Per l’esquerra | 4 |
En cas de tenir diversos operadors de la mateixa precedència, s’associen tal com indica la taula (sempre es comença per l’esquerra excepte en les potències).
Parèntesis
Per modificar la prioritat de les operacions sempre podeu fer ús dels parèntesis, tal com passa en les matemàtiques.
Interpretació dels missatges d'error del processador
Si no seguim les normes del llenguatge o si efectuem alguna operació no permesa, el processador es queixa i us envia un missatge d’error.
Els errors més comuns en començar són els errors de sintaxi. Quan el processador us informa d’algun d’aquests errors és perquè no hem seguit les normes: els operadors o les dades no estan ben posats, es tanca un parèntesi abans que s’hagi obert, hi ha un espai en blanc entre dades o qualsevol altra errada.




