Skip to content

Temps mort #1 ​

Enhorabona! Ja hem arribat al final de la primera part del curs. Us mereixeu un descans!!!

En aquesta lliçó es presenta un primer tema que té a veure amb l'ús de l'ordinador. En particular, es remet a informació sobre ergonomia que qualsevol professional de les tecnologies de la informació i la comunicació hauria de conèixer per tal de treballar davant de l'ordinador de forma segura sense posar la seva salut en perill. A continuació, es presenten dos elements de Python que permeten compactar el codi: els operadors d'assignació augmentats i l'expressió condicional. Finalment, es presenta un tercer element que permet simplificar les crides a les funcions: els paràmetres amb valor per defecte. No és necessari fer-los servir, però tothom els usa i, per tant, com a mínim, cal comprendre'ls.

Ergonomia ​

A la meva primera classe de piano, el meu professor em va ensenyar com seure a la banqueta i regular la seva alçada. Els músics saben que tenir una postura correcta és extremadament important a l'hora de tocar un instrument, ja que no només millora la interpretació, sinó que evita que l'estrès i els danys posturals esgotin el cos i el cervell.

Igualment, l'ús continuat de l'ordinador o els hàbits inadequats de treball amb l'ordinador poden tenir efectes detrimentals a la salut, en especial fatiga visual i trastorns musculoesquelètics. Eviteu aquests problemes de salut a curt i llarg termini, adoptant mesures de seguretat que millorin l'ergonomia del vostre lloc d'estudi o de treball i manteniu posicions de treball adequades.

La web de Prevenció de Riscos Laborals de la UPC us ofereix recomanacions específiques:

Aquests són uns altres enllaços recomanats:

Sisplau llegiu aquests enllaços i seguiu les seves consignes. Algun dia ho agraireu.

Alguns errors que veig freqüentment entre els meus estudiants són els següents:

  • Seure incorrectament davant de l'ordinador.
  • Mantenir l'esquena torçada davant del portàtil.
  • Utilitzar una lletra massa petita a la pantalla.
  • No fer pauses regulars (o fer-ne massa!).

I en relació als descansos i als estudis, us recomano el llibre Learning How to Learn de Barbara Oakley (també n'hi ha un curs online).

Operadors d'assignació augmentats ​

Quan vegades no hem escrit ja la línia següent?

python
i = i + 1

Doncs Python ofereix una drecera per dir el mateix:

python
i += 1

La instrucció i += 1 vol dir a la variable i se li assigna el valor que tenia abans més una unitat. Per tant, i += 1 i i = i + 1 són perfectament equivalents.

Igualment, la instrucció x *= 2 vol dir a la variable x se li assigna el doble del valor que tenia abans. Per tant, x *= 2 i x = x * 2 són perfectament equivalents.

De la mateixa manera, tenim equivalències per a tots els operadors aritmètics:

Operador d'assignació augmentatAssignació corresponent
i += ei = i + e
i -= ei = i - e
i *= ei = i * e
i /= ei = i / e
i %= ei = i % e
i **= ei = i ** e

Per ara, aquests nous operadors d'assignació augmentats poden semblar inútils o redundants, però aviat començarem a escriure increments com aquest amb variables més complicades que la i i llavors guanyaran interès per dues raons:

  • El codi serà una mica més curt i menys repetitiu.

  • La part de l'esquerra només serà avaluada una vegada.

A partir d'ara us animo a usar aquests operadors, perquè veureu que tothom els fa servir.

Expressió condicional ​

L'expressió condicional permet avaluar un o una altre valor en funció d'una condició booleana.

Mireu, enlloc d'escriure una instrucció condicional com

python
if n % 2 == 0:
    paritat = 'parell'
else:
    paritat = 'senar'

es pot escriure

python
paritat = 'parell' if n % 2 == 0 else 'senar'

L'expressió condicional té tres parts: la part de l'esquerra de l'if, la part entre el if i el else i la part darrera de l'else. En aquest cas, l'else és obligatori. Aquesta expressió avalua primer la part del mig, que ha de ser un booleà. Si és certa, llavors avalua i retorna la primera; sinó, avalua i retorna la tercera. Per anar bé, el tipus de la primera i tercera expressions han de ser el mateix.

Les expressions condicionals haurien de servir per fer més clar el codi. L'ús raonable de parèntesis pot ajudar. Si no ho fan, potser millor no usar-les.

Exemple: la seqüència de Collatz ​

Considerem la operació següent sobre un nombre natural no nul:

  • Si el nombre és parell, el dividim per dos.
  • Si el nombre és senar, el tripliquem i li afegim una unitat.

Ara podem formar una seqüència d'enters aplicant aquesta operació repetidament, començant en qualsevol nombre natural i prenent el resultat de cada pas com a origen del pas següent. Per exemple, començant per 5 tenim la seqüència 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 → ... Es creu, però mai s'ha demostrat, que per a qualsevol nombre de partida, aquesta seqüència sempre arriba a 1.

Considerem ara que volem escriure aquesta seqüència començant a partir d'un natural n no nul fins que arribi a 1. Amb l'expressió condicional ho podríem fer així:

python
n = read(int)
while n != 1:
    print(n)
    n = n // 2 if n % 2 == 0 else 3 * n + 1
print(n)

L'expressió condicional n // 2 if n % 2 == 0 else 3 * n + 1 retorna doncs el següent nombre de la seqüència.

Paràmetres amb valor per defecte ​

Fins ara, sempre que hem cridat una funció hem donat un valor per a cada un dels seus paràmetres. Però no sempre cal fer-ho! Mireu, per exemple, aquestes dues crides a la funció int:

python
int('101')      # 101
int('101', 2)   # 5

La primera interpreta el text en base 10 i la segona, en base 2. La funció int té un segon paràmetre, la base, que si no es dóna val 10. Això és un paràmetre amb valor per defecte.

Nosaltres també podem definir funcions amb paràmetres d'aquest tipus. N'hi ha prou amb escriure el valor per defecte darrera del nom del paràmetre, amb un =:

python
def potencia(x: int, n: int = 2) -> float:
    return x ** n

Ara podem fer

python
potencia(5)       # 25 = 5 ** 2, perquè n val 2
potencia(5, 3)    # 125 = 5 ** 3, perquè n val 3

Si en la crida no es dóna un valor per a n, llavors n val 2. Si es dóna, es fa servir aquest valor.

També podem indicar el nom del paràmetre a la crida. Aleshores l'ordre ja no importa:

python
potencia(n=3, x=5)   # 125
potencia(5, n=3)     # 125

Els paràmetres amb valor per defecte han d'anar sempre després dels que no en tenen. Per això, def potencia(x: int, n: int = 2) és correcte, però def potencia(x: int = 2, n: int) dóna un error de sintaxi.

Aquí en teniu un altre exemple, amb una acció per saludar a una persona amb un salutació per defecte:

python
def saluda(nom: str, salutacio: str = "Hola") -> None:
    print(f"{salutacio}, {nom}!")

saluda("Anna")            # Hola, Anna!
saluda("Anna", "Bon dia") # Bon dia, Anna!
saluda("Anna", salutacio="Adéu")  # per nom

Això pot ser útil per aquets motius:

  • Les crides més habituals queden més curtes, i només cal detallar els paràmetres quan voleu alguna cosa diferent de l'habitual.

  • Podeu afegir un paràmetre nou a una funció que ja existeix sense trencar el codi que ja la utilitzava, ja que les crides antigues continuen sent vàlides.

  • En llegir la capçalera de la funció, ja se sap quin és el comportament estàndard.

Una advertència: el valor per defecte s'avalua una sola vegada, quan es defineix la funció, i no cada cop que se la crida. Amb nombres, textos i booleans això no dóna cap problema. Però més endavant, quan treballem amb llistes i altres tipus mutables, aquest detall tindrà conseqüències sorprenents i haurem de tornar-hi. De moment, tingueu-ho present: com a valors per defecte, useu només tipus simples.

Com amb els altres elements d'aquesta lliçó, no és imprescindible fer-los servir, però de seguida els trobareu a tot arreu. Fixeu-vos-hi i els anireu reconeixent.

Jordi Petit
Lliçons.jutge.org
© Universitat Politècnica de Catalunya, 2026

lliçons.jutge.org