Tancàvem el mòdul 1, a Del problema a l'algorisme, amb una promesa: que el títol, el responsable i la prioritat d'una tasca deixarien d'estar escrits a mà dins d'un print i passarien a ser informació que el programa gestiona. Aquesta lliçó compleix la promesa. La peça que ho fa possible es diu variable, i és, sense exagerar, el concepte sobre el qual se sosté absolutament tota la resta del curs.

El teu tascafacil.py actual imprimeix text fix. Si la Marta vol registrar una altra tasca, cal obrir l'editor, buscar la línia, canviar el text i desar. Això no és un programa: és un document que s'executa. Un programa de debò desa dades, les consulta, les modifica i calcula amb elles. Per a això necessita llocs on posar aquestes dades i noms amb què referir-s'hi.

En aquesta lliçó aprendràs què és exactament una variable, com es crea amb l'operador d'assignació =, quins noms li pots posar i quins li convé posar, quins són els cinc tipus bàsics de dada en Python (int, float, str, bool i None), com esbrinar el tipus de qualsevol valor amb type(), i què significa que Python tingui tipatge dinàmic. Al final reescriuràs tascafacil.py perquè la tasca del Forn Solé visqui en variables.

Contingut

  1. Del text fix a les dades amb nom
  2. Què és una variable
  3. L'assignació: l'operador =
  4. Reassignació i ordre d'execució
  5. Regles i convencions per als noms
  6. Comentaris amb #
  7. Els tipus bàsics de Python
  8. Inspeccionar el tipus amb type()
  9. Tipatge dinàmic: què significa a la pràctica
  10. Mutable i immutable: una primera intuïció
  11. TascaFàcil: la tasca viu en variables
  12. Errors comuns i consells
  13. Exercicis
  14. Conclusió

  1. Del text fix a les dades amb nom

Recuperem el tascafacil.py amb què vas tancar la lliçó 01-04:

print("Titol:        Logotip Forn Sole")
print("Descripcio:   Tres propostes en blanc i negre, format vectorial")
print("Responsable:  Luis")
print("Prioritat:    alta")
print("Estat:        pendent")

Aquest programa té tres problemes greus, i convé anomenar-los abans d'arreglar-los:

  • La dada està atrapada dins del text. «Luis» no és una dada per al programa: és un grapat de lletres dins d'una frase més llarga. El programa no pot saber qui és el responsable, no el pot comparar amb un altre nom, no el pot comptar.
  • Repetir una dada obliga a repetir-la literalment. Si el responsable aparegués en quatre llocs i la tasca es reassignés a la Nuria, caldria canviar quatre línies. Oblidar-ne una és un error garantit.
  • No hi ha manera de calcular res. Amb text fix no es pot decidir si una tasca és urgent, ni comptar quantes n'hi ha de pendents, ni res que s'hi assembli.

La solució és separar la dada de la seva presentació. La dada es desa amb un nom; després es mostra. Així:

responsable = "Luis"
print(responsable)

Dues línies, i ja és un altre programa. La primera línia desa el text "Luis" sota el nom responsable. La segona mostra el que hi ha desat en aquest nom. Si demà la tasca passa a la Nuria, es canvia una línia i tot allò que faci servir responsable queda actualitzat.

Això és una variable.

  1. Què és una variable

Una variable és un nom que apunta a un valor desat a la memòria de l'ordinador.

Val la pena aturar-se en la paraula apunta, perquè és la clau. Molta gent imagina la variable com una capsa que conté el valor. És una imatge acceptable al començament, però la imatge correcta en Python és una altra: el valor viu en algun lloc de la memòria, i la variable és una etiqueta enganxada a aquest valor. L'etiqueta no conté res; assenyala.

flowchart LR
    subgraph noms["Noms (el que escrius)"]
        A["responsable"]
        B["prioritat"]
        C["dies_estimats"]
    end
    subgraph memoria["Memoria (on viuen els valors)"]
        X["'Luis'"]
        Y["'alta'"]
        Z["3"]
    end
    A --> X
    B --> Y
    C --> Z

D'aquí en surten tres conseqüències pràctiques que t'estalviaran confusions més endavant:

  • Un nom apunta a un sol valor alhora. Si el fas apuntar a un altre, deixa d'apuntar a l'anterior.
  • Diversos noms poden apuntar al mateix valor. No és un cas estrany: passa contínuament.
  • Fer servir el nom equival a fer servir el valor. Quan escrius print(responsable), Python segueix la fletxa, troba "Luis" i hi treballa.

I hi ha una quarta conseqüència, més filosòfica però molt útil: el nom és per a tu, no per a la màquina. A l'ordinador tant li fa que la variable es digui responsable o x7. A qui llegeixi el programa d'aquí a sis mesos —probablement tu— no li serà indiferent en absolut.

  1. L'assignació: l'operador =

Crear una variable en Python és tan senzill com això:

titol = "Logotip Forn Sole"

L'estructura és sempre la mateixa:

nom = valor

El símbol = es diu operador d'assignació, i funciona de dreta a esquerra: primer es calcula el que hi ha a la dreta, i el resultat s'associa al nom de l'esquerra. És important interioritzar aquest ordre des del principi.

Llegeix-lo mentalment com «passa a valer» o «apunta a», mai com «és igual a». I aquí arribem a un punt que confon gairebé tothom quan comença.

Per què = no és la igualtat matemàtica

En matemàtiques, x = 5 és una afirmació: declara un fet que es compleix. En Python, x = 5 és una ordre: fes que el nom x apunti al valor 5.

La diferència es veu amb tota claredat en aquesta línia, perfectament vàlida en Python i impossible en matemàtiques:

comptador = 0
comptador = comptador + 1
print(comptador)   # mostra 1

Matemàticament, comptador = comptador + 1 seria absurd: cap número no és igual a si mateix més un. Com a ordre, és perfectament assenyat:

  1. S'avalua la part dreta, comptador + 1. Python mira quant val comptador ara mateix (0) i hi suma un: el resultat és 1.
  2. Aquest resultat, 1, s'assigna al nom comptador, que deixa d'apuntar al 0 i passa a apuntar a l'1.
Aspecte En matemàtiques En Python
Què és = Una afirmació d'igualtat Una ordre d'assignació
Es llegeix «x és igual a 5» «x passa a valer 5»
x = x + 1 Contradicció, no té solució Instrucció vàlida: incrementa x
Es pot invertir? Sí: 5 = x significa el mateix No: 5 = x és un error de sintaxi

Aquest últim punt és un bon control mental: en Python, a l'esquerra del = hi va sempre un nom; mai un valor. Escriure 5 = x produeix l'error SyntaxError: cannot assign to literal.

Per comparar dos valors i preguntar si són iguals existeix un altre operador, ==, amb dos signes. El veuràs en detall a Operadors i expressions. De moment queda't amb la distinció: un = assigna, dos == comparen.

  1. Reassignació i ordre d'execució

Una variable pot canviar de valor tantes vegades com vulguis. Això s'anomena reassignació, i és d'on ve el nom «variable»: el seu valor varia.

estat = "pendent"
print(estat)      # pendent

estat = "completada"
print(estat)      # completada

Després de la segona assignació, el nom estat deixa d'apuntar a "pendent" i apunta a "completada". El valor antic es perd: no hi ha manera de recuperar-lo si no l'has desat en un altre lloc.

flowchart LR
    A1["estat"] -.->|"abans"| V1["'pendent'"]
    A2["estat"] ==>|"despres"| V2["'completada'"]

D'aquí en surt una regla que governa la lectura de qualsevol programa: les instruccions s'executen en ordre, de dalt a baix, i el valor d'una variable en un punt del programa és el que li va donar l'última assignació anterior a aquest punt.

Comprova-ho amb aquest exemple, que convé traçar mentalment abans de llegir la resposta:

responsable = "Luis"
responsable = "Nuria"
print(responsable)

Mostra Nuria. La primera línia no «es perd» ni «entra en conflicte» amb la segona: s'executa, i després la segona la substitueix. És exactament la mateixa lògica de la prova d'escriptori que vas practicar a la lliçó 01-05, i continua sent la millor eina per entendre un fragment de codi: apunta en una taula el valor de cada variable després de cada línia.

Línia Instrucció responsable després
1 responsable = "Luis" "Luis"
2 responsable = "Nuria" "Nuria"
3 print(responsable) "Nuria" → imprimeix Nuria

Un detall important: una variable ha d'existir abans de fer-se servir. Si intentes mostrar un nom al qual no has assignat res, Python protesta:

print(prioritat)
NameError: name 'prioritat' is not defined

Llegeix-ho amb calma: «el nom prioritat no està definit». Gairebé sempre significa una de dues coses: o t'has oblidat la línia d'assignació, o l'has escrita després de fer-la servir, o hi ha una errada al nom (prioritat davant de prioitat). Els missatges d'error de Python són informatius; agafa'ls estima com més aviat millor.

  1. Regles i convencions per als noms

Aquí hi ha dos nivells, i no convé barrejar-los: les regles, que si incompleixes el programa no arrenca, i les convencions, que si incompleixes el programa funciona però delaten un principiant.

Regles obligatòries

Regla Vàlid No vàlid
Només lletres, dígits i guió baix titol_2 titol-2, titol 2
No pot començar per un dígit tasca1 1tasca
Distingeix majúscules de minúscules Titol i titol són dues variables diferents —
No pot ser una paraula reservada entrada if, for, class, None

Les paraules reservades són les que Python fa servir per a la seva pròpia sintaxi. N'hi ha unes 35: False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, for, from, global, if, import, in, is, lambda, not, or, pass, raise, return, try, while, with, yield... No cal memoritzar-les: qualsevol editor decent les acoloreix de manera diferent, i aquest canvi de color és el senyal que aquest nom està prohibit.

Tècnicament Python 3 accepta accents i ces trencades en els noms (adreça = "Carrer Nou 3" funciona). No els facis servir. Compliquen l'escriptura, es trenquen en teclats diferents i cap projecte professional no els empra.

Convencions d'estil

Les convencions de Python estan recollides en un document anomenat PEP 8, que és la referència d'estil del llenguatge. Aquestes són les tres que necessites ara:

1. snake_case: minúscules i guions baixos. Les paraules se separen amb _, tot en minúscula.

dies_estimats = 3            # correcte en Python
diesEstimats = 3             # estil de Java o JavaScript, no de Python
DiesEstimats = 3             # en Python aixo es reserva per a classes (modul 7)

2. Noms amb significat. El millor nom és el que fa innecessari el comentari que l'explica.

Malament Regular Bé
x dies dies_estimats
t text titol_tasca
p prio prioritat
a, b, c dada1, dada2 responsable, estat

Un bon criteri: si has de pujar a mirar l'assignació per recordar què desa una variable, el nom és dolent. I no tinguis por dels noms llargs: tasques_pendents_de_luis és millor que tpl. S'escriu una vegada i es llegeix cent.

3. Constants en MAJÚSCULES. Quan un valor no ha de canviar durant l'execució —una taxa, un límit, un text fix—, s'anomena en majúscules amb guions baixos:

NOM_ESTUDI = "Estudi Alba"
MAX_TASQUES_PER_PERSONA = 10

Compte amb un matís que sorprèn els que vénen d'altres llenguatges: Python no impedeix canviar una constant. NOM_ESTUDI = "una altra cosa" funcionaria sense protestar. Les majúscules són una convenció, un avís als humans que llegeixen el codi: «això no es toca». La disciplina la posa el programador, no el llenguatge.

  1. Comentaris amb #

Un comentari és text que Python ignora completament en executar. Serveix per explicar alguna cosa a la persona que llegeixi el codi.

S'escriuen amb el coixinet #. Tot el que va des de # fins al final de la línia s'ignora:

# Dades de la tasca que la Marta acaba d'encarregar al Luis
titol = "Logotip Forn Sole"
prioritat = "alta"        # alta / mitjana / baixa

Hi ha dues maneres de fer-los servir, totes dues visibles a dalt: en una línia pròpia, per explicar el bloc que ve a sota, i al final d'una línia de codi, per aclarir aquest detall concret. En aquest segon cas, PEP 8 demana deixar almenys dos espais abans del #.

Un avís sobre el bon ús, sense estendre'ns perquè la documentació té la seva pròpia lliçó a Documentació i comentaris: un comentari ha d'explicar per què, no què. Això no aporta res:

prioritat = "alta"        # assigna alta a prioritat

Això sí:

prioritat = "alta"        # el client reparteix fullets la setmana que ve

Els comentaris també serveixen per desactivar temporalment una línia mentre proves alguna cosa, sense esborrar-la. A la majoria d'editors, Ctrl + / comenta i descomenta la línia on hi ha el cursor.

  1. Els tipus bàsics de Python

Tot valor en Python pertany a un tipus de dada. El tipus determina què es pot fer amb aquest valor: dos números es poden restar, dos textos no; un text es pot posar en majúscules, un número no.

Aquests són els cinc tipus bàsics amb què treballaràs en aquest mòdul:

Tipus Nom complet Per a què serveix Exemples literals
int Enter Quantitats sense decimals 3, 0, -7, 1250
float Decimal (coma flotant) Quantitats amb decimals 3.5, 0.0, -2.75, 19.99
str Cadena de text (string) Text de qualsevol longitud "Luis", 'alta', ""
bool Booleà Vertader o fals True, False
None Nul (tipus NoneType) Absència de valor None

Anem-hi un per un, perquè cadascun té el seu detall.

int: números enters

S'escriuen sense cometes i sense decimals. Poden ser negatius i no tenen límit pràctic de mida en Python.

dies_estimats = 3
tasques_completades = 12
diferencia = -2

No facis servir separadors de milers amb punt ni amb coma: 1.250 no és mil dos-cents cinquanta, és el decimal 1,25. Si necessites llegibilitat, Python permet el guió baix: 1_250_000 és un enter vàlid i es llegeix millor.

float: números amb decimals

Porten punt decimal, no coma. Aquest és l'error número u de qui programa en català:

hores_dedicades = 7.5      # correcte
hores_dedicades = 7,5      # NO es un decimal: Python enten una altra cosa

Un avís que t'estalviarà desconcert més endavant: els float són aproximacions. L'ordinador emmagatzema els decimals en binari i alguns números no tenen representació exacta:

print(0.1 + 0.2)      # mostra 0.30000000000000004

No és una fallada de Python: passa en gairebé tots els llenguatges. Per al que fem aquí és irrellevant, però recorda-ho si algun dia programes càlculs amb diners.

str: cadenes de text

Van entre cometes, simples o dobles indistintament, sempre que obris i tanquis amb les mateixes:

responsable = "Luis"
prioritat = 'alta'

Un text pot contenir espais, números i símbols. I compte amb això, perquè és font de confusió constant:

edat_text = "3"       # aixo es un str: el caracter tres
edat_numero = 3       # aixo es un int: la quantitat tres

Semblen el mateix i no ho són. Amb 3 es pot fer aritmètica; amb "3" no. Aquesta distinció serà el cor de la lliçó Conversió de tipus i validació.

També existeix la cadena buida, "": un text sense cap caràcter. No és el mateix que None ni que un espai " ".

bool: vertader o fals

Només té dos valors possibles, i s'escriuen amb la primera lletra en majúscula: True i False. Ni true, ni TRUE, ni Vertader.

completada = False
es_urgent = True

Els booleans són la base de totes les decisions que prendrà el programa a partir del mòdul 3. Desar l'estat d'una tasca com a completada = False és molt més útil que com a estat = "pendent", perquè un booleà es pot avaluar directament.

None: absència de valor

None representa que no hi ha valor. És un tipus amb un únic valor possible, i s'escriu també amb majúscula inicial.

data_lliurament = None      # encara no s'ha acordat amb el client

És diferent de 0, de "" i de False. 0 és una quantitat, "" és un text sense caràcters, False és una resposta negativa; None significa «aquí no hi ha res encara». A TascaFàcil el farem servir, per exemple, per a una data de lliurament que encara no s'ha fixat: no és una data buida, és que no hi ha data.

  1. Inspeccionar el tipus amb type()

Python porta una eina per preguntar de quin tipus és un valor: la funció type().

titol = "Logotip Forn Sole"
dies_estimats = 3
hores_dedicades = 7.5
completada = False
data_lliurament = None

print(type(titol))
print(type(dies_estimats))
print(type(hores_dedicades))
print(type(completada))
print(type(data_lliurament))

Sortida:

<class 'str'>
<class 'int'>
<class 'float'>
<class 'bool'>
<class 'NoneType'>

La paraula class és el vocabulari intern de Python (els tipus són classes, cosa que prendrà sentit al mòdul 7); de moment fixa't només en el nom entre cometes.

type() és la teva millor aliada quan alguna cosa no funciona com esperes. Compara aquests dos casos, aparentment idèntics:

dies_a = 3
dies_b = "3"

print(type(dies_a))    # <class 'int'>
print(type(dies_b))    # <class 'str'>

En imprimir-los per separat, tots dos mostren 3 per pantalla. Però un és un número i l'altre és text, i es comporten de manera radicalment diferent. Quan un programa faci alguna cosa inexplicable amb una dada, el primer és imprimir-ne el type(). Aquest reflex t'estalviarà hores.

Una precisió de vocabulari, per parlar amb propietat: type() és una funció, i els parèntesis són la manera de «cridar-la» passant-li un valor. Ja n'has fet servir una altra, print(). Com funcionen per dins i com crear les teves és l'assumpte del mòdul 4.

  1. Tipatge dinàmic: què significa a la pràctica

A la lliçó 01-03 vam veure que Python té tipatge dinàmic. Ara podem veure què significa això amb codi al davant.

En un llenguatge de tipatge estàtic com Java o C, en crear una variable en declares el tipus i aquest tipus queda fixat per sempre:

String responsable = "Luis";     // Java: responsable sera SEMPRE text
responsable = 5;                 // error: no compila

En Python no es declara res. El tipus el determina el valor assignat, i canvia si assignes un altre valor d'un altre tipus:

dada = "Luis"
print(type(dada))    # <class 'str'>

dada = 5
print(type(dada))    # <class 'int'>

dada = True
print(type(dada))    # <class 'bool'>

Python no protesta en cap moment. Insistim en el matís important: el tipus pertany al valor, no al nom. La variable és una etiqueta, i una etiqueta es pot enganxar avui a un text i demà a un número.

Aspecte Tipatge estàtic (Java, C) Tipatge dinàmic (Python)
Es declara el tipus? Sí, obligatori No
Pot canviar el tipus? No Sí
Quan es detecta un error de tipus? En compilar, abans d'executar En executar, quan s'arriba a la línia
Avantatge Més seguretat, errors primerencs Més rapidesa i flexibilitat en escriure

I aquí un consell que no és opcional: que Python et deixi canviar el tipus d'una variable no significa que ho hagis de fer. Una variable anomenada dies_estimats que unes vegades desa 3 i altres "tres" és una font inesgotable d'errors. La disciplina professional és clara: un nom, un propòsit, un tipus. Si necessites una altra cosa, crea una altra variable.

  1. Mutable i immutable: una primera intuïció

Hi ha una distinció que convé sembrar ja, encara que el seu abast complet arribi amb les llistes del mòdul 5.

Alguns valors en Python són immutables: un cop creats, no es poden modificar. Els números i les cadenes de text ho són. Quan sembla que els modifiques, en realitat estàs creant un valor nou i reapuntant l'etiqueta.

Mira aquest exemple:

prioritat = "alta"
prioritat = "mitjana"

És temptador pensar que el text "alta" s'ha transformat en "mitjana". No és així. El que ha passat és que s'ha creat un valor nou, "mitjana", i l'etiqueta prioritat ha deixat d'assenyalar el primer per assenyalar el segon. El text "alta" no ha canviat; simplement ja no el mira ningú.

flowchart LR
    P["prioritat"] -.->|"ja no apunta"| A["'alta'<br/>(segueix existint,<br/>sense canviar)"]
    P ==>|"ara apunta"| M["'mitjana'<br/>(valor nou)"]

Es pot comprovar amb id(), una funció que retorna un identificador únic del valor en memòria. Si el valor fos el mateix modificat, l'identificador es mantindria; si és un valor nou, canvia:

prioritat = "alta"
print(id(prioritat))     # p. ex. 140234...816

prioritat = "mitjana"
print(id(prioritat))     # un numero DIFERENT: es un altre valor

(Els números concrets varien en cada execució i en cada ordinador; l'únic rellevant és que són diferents.)

I ara la conseqüència pràctica, que sí que importa des d'avui:

responsable_original = "Luis"
responsable_copia = responsable_original

responsable_original = "Nuria"

print(responsable_original)   # Nuria
print(responsable_copia)      # Luis

responsable_copia continua valent "Luis". La segona línia el va fer apuntar al mateix valor que responsable_original, però la tercera línia va reapuntar només responsable_original; l'altra etiqueta es va quedar on era. Amb valors immutables això funciona sempre de manera intuïtiva: reassignar una variable mai no afecta les altres.

Concepte Significat Tipus que has vist
Immutable El valor no es pot modificar; reassignar en crea un de nou int, float, str, bool, None
Mutable El valor sí que es pot modificar «al seu lloc» Llistes i diccionaris (mòdul 5)

Tots els tipus d'aquesta lliçó són immutables, així que de moment vius al món fàcil. Guarda la idea: quan arribis a les llistes, on la còpia no es comporta així, sabràs exactament què està canviant i per què.

  1. TascaFàcil: la tasca viu en variables

Anem al que havíem promès. Reescrivim tascafacil.py perquè les cinc dades de la tasca —les cinc que vam definir al requisit R1 de la lliçó 01-01— deixin d'estar escrites dins dels print i passin a ser variables.

Obre el teu tascafacil.py i substitueix-ne el contingut per això:

# tascafacil.py - Estudi Alba
# Versio 0.2: les dades de la tasca viuen en variables

# --- Dades fixes del programa (constants per convencio) ---
NOM_APP = "TascaFacil"
VERSIO = "0.2"
ESTUDI = "Estudi Alba"

# --- Dades de la tasca ---
titol = "Logotip Forn Sole"
descripcio = "Tres propostes en blanc i negre, format vectorial"
responsable = "Luis"
prioritat = "alta"          # alta / mitjana / baixa
completada = False          # boolea: True quan estigui acabada
dies_estimats = 3           # enter
hores_dedicades = 7.5       # decimal
data_lliurament = None      # encara sense acordar amb el client

# --- Sortida per pantalla ---
print("=== TASCAFACIL - Estudi Alba ===")
print("")
print("Titol:")
print(titol)
print("Descripcio:")
print(descripcio)
print("Responsable:")
print(responsable)
print("Prioritat:")
print(prioritat)
print("Completada:")
print(completada)
print("Dies estimats:")
print(dies_estimats)
print("Hores dedicades:")
print(hores_dedicades)
print("Data de lliurament:")
print(data_lliurament)

Executa'l amb python tascafacil.py. Veuràs la fitxa, ara en dues línies per dada.

Repassem les decisions que s'han pres en aquest codi, perquè cap no és casual:

  • NOM_APP, VERSIO i ESTUDI van en majúscules perquè són constants: no canvien durant l'execució del programa.
  • completada és un bool, no el text "pendent". És una elecció deliberada: un booleà representa millor un sí/no i es podrà avaluar directament quan arribin els condicionals. Fixa't a més en el nom: completada es llegeix com una afirmació que és vertadera o falsa, que és just com s'ha de llegir un booleà.
  • dies_estimats és un int i hores_dedicades un float. Els dies es compten enters; les hores admeten mitges.
  • data_lliurament és None, no "". No és una data buida: és que encara no hi ha data. La diferència és semàntica i és important.
  • Els comentaris expliquen el que el nom no pot dir: els valors admesos a prioritat, o el perquè del None.

Ara la millora de debò. Canvia aquestes dues línies:

responsable = "Nuria"
prioritat = "mitjana"

Desa, executa i comprova que la fitxa reflecteix els canvis. Has modificat dues línies de dades i no n'has tocat ni una de les que mostren la informació. A la versió anterior hauries hagut d'editar el text dins dels print. Aquesta separació entre dades i presentació és una de les idees més rendibles de tot l'ofici.

El que encara grinyola

Siguem honestos amb les limitacions d'aquesta versió, que són el guió de les tres lliçons següents:

Limitació actual Es resol a
Cada dada ocupa dues línies i la fitxa és lletja; no es pot barrejar text i variable en un sol print Entrada i sortida de dades
No es pot calcular res: ni si la tasca és urgent, ni quant queda Operadors i expressions
Les dades continuen escrites al codi: per a una altra tasca cal editar el fitxer Entrada i sortida de dades
Res no impedeix escriure prioritat = "urgentissima" Conversió de tipus i validació

Quatre problemes, quatre lliçons. Anem-hi per ordre.

Errors Comuns i Consells

Confondre = amb ==. Un assigna, dos comparen. Escriure prioritat = "alta" quan volies preguntar si la prioritat és alta no dóna error: canvia el valor de la variable silenciosament. És dels errors més difícils de detectar precisament perquè no protesta.

Fer servir una variable abans d'assignar-la. NameError: name 'x' is not defined significa sempre el mateix: aquest nom encara no existeix en aquest punt del programa. Comprova que l'assignació està escrita, que està abans i que no hi ha cap errada al nom.

Errada al nom en reutilitzar-lo. responsable i responsble són dues variables diferents per a Python. La segona donarà NameError, o pitjor: si per casualitat també existeix, el teu programa farà servir la dada equivocada. Deixa que l'autocompletat de l'editor escrigui els noms per tu.

Oblidar les cometes en un text. responsable = Luis (sense cometes) fa que Python busqui una variable anomenada Luis i falli amb NameError. Si és text, va entre cometes. Sempre.

Escriure decimals amb coma. preu = 19,99 no és un decimal. Python interpreta la coma com a separador i crea alguna cosa que no és un número. En Python els decimals porten punt.

Escriure true o false en minúscula. En Python són True i False, amb majúscula inicial. NameError: name 'true' is not defined és l'avís.

Posar un número entre cometes sense voler. dies = "3" és text, no un número. Sembla igual en imprimir-lo i es comporta de manera completament diferent. Davant del dubte, type().

Noms d'una sola lletra. Una x et semblarà claríssima mentre l'escrius i un jeroglífic tres dies després. L'única excepció tolerada són els comptadors de bucle, que veuràs al mòdul 3.

Fer servir paraules reservades com a noms. Si l'editor acoloreix el teu nom de variable igual que acoloreix if o for, canvia'l.

Consell: prova al REPL. Abans d'escriure alguna cosa al fitxer, prova-la a l'intèrpret interactiu (python a seques al terminal, com vas veure a 01-04). Assigna, imprimeix, consulta el type(). És la manera més ràpida de convertir un dubte en una certesa.

Consell: anomena primer, programa després. Quan ataquis un problema nou, escriu primer la llista de dades que hi intervenen i posa'ls nom. La meitat del disseny d'un programa és decidir quines variables existeixen.

Exercicis

Exercici 1: Detectar i corregir errors

El programa següent conté sis errors. Troba'ls, explica cadascun i escriu-ne la versió corregida.

1titol = "Cartell fira del llibre"
responsable = Nuria
prioritat = 'alta"
hores = 4,5
completada = false
print(titol, responsable, prioritat, hores, completada, estat)

Exercici 2: Tipus i traçat

a) Indica el tipus de cada valor sense executar res:

Valor Tipus
"Marta" ?
12 ?
12.0 ?
"12" ?
True ?
None ?
"" ?
"True" ?

b) Traça aquest programa en una taula (una fila per línia, una columna per variable) i digues què imprimeix:

tasques_totals = 8
tasques_fetes = 3
tasques_totals = 10
pendents = tasques_totals
tasques_fetes = 5
print(pendents)
print(tasques_fetes)

Exercici 3: Fitxa de tasca de la Nuria

Escriu un fitxer fitxa_nuria.py que desi en variables ben anomenades les dades d'aquesta tasca d'Estudi Alba i les mostri per pantalla:

  • Títol: Cartell per a la fira del llibre
  • Descripció: Format A2, dues versions de color
  • Responsable: Nuria
  • Prioritat: mitjana
  • Encara no està completada
  • S'estimen 2 dies de feina
  • Porta dedicades 3,5 hores
  • La data de lliurament encara no està acordada
  • El client d'aquesta tasca encara no consta

Requisits: fes servir el tipus més adequat per a cada dada (no tot str), anomena les variables en snake_case i amb significat, inclou una constant en majúscules amb el nom de l'estudi i afegeix almenys dos comentaris que aportin informació real. Acaba el programa imprimint el type() de tres variables de tipus diferents.

Solucions

Solució 1.

Els sis errors:

Núm. Línia Error Per què
1 1titol = ... Nom que comença per dígit Regla de Python: els noms no poden començar per número
2 responsable = Nuria Text sense cometes Python busca una variable Nuria i no la troba → NameError
3 prioritat = 'alta" Cometes desaparellades S'obre amb simple i es tanca amb doble → SyntaxError
4 hores = 4,5 Decimal amb coma En Python el separador decimal és el punt
5 completada = false Booleà en minúscula En Python és False, amb majúscula inicial
6 print(... estat) Variable inexistent estat no s'ha assignat mai → NameError

Versió corregida:

titol = "Cartell fira del llibre"
responsable = "Nuria"
prioritat = "alta"
hores = 4.5
completada = False
estat = "pendent"             # faltava definir-la abans de fer-la servir

print(titol)
print(responsable)
print(prioritat)
print(hores)
print(completada)
print(estat)

Nota: el print original passava diversos valors separats per comes. És vàlid en Python i s'estudia a Entrada i sortida de dades; aquí ho hem separat en diversos print per no avançar matèria.

Solució 2.

a) Tipus:

Valor Tipus Observació
"Marta" str Entre cometes → text
12 int Sense decimals ni cometes
12.0 float El punt el converteix en decimal encara que valgui dotze
"12" str Entre cometes: és el text «12», no el número
True bool Majúscula inicial
None NoneType Absència de valor
"" str Cadena buida: continua sent un text
"True" str Amb cometes és text, no un booleà

Les tres files interessants són 12 davant de 12.0, 12 davant de "12" i True davant de "True": semblen el mateix a la pantalla i no ho són.

b) Traçat:

Línia Instrucció tasques_totals tasques_fetes pendents
1 tasques_totals = 8 8 — —
2 tasques_fetes = 3 8 3 —
3 tasques_totals = 10 10 3 —
4 pendents = tasques_totals 10 3 10
5 tasques_fetes = 5 10 5 10

Imprimeix 10 i després 5.

La clau és a la línia 4: pendents rep el valor que tasques_totals tenia en aquell instant (10, perquè la línia 3 ja l'havia canviat). No queda «enllaçada» a tasques_totals: si després aquesta variable canviés, pendents continuaria valent 10. Una assignació copia el valor del moment, no estableix una relació permanent.

Solució 3.

# fitxa_nuria.py - Estudi Alba
# Fitxa d'una tasca assignada a la Nuria

ESTUDI = "Estudi Alba"        # constant: no canvia durant l'execucio

titol = "Cartell per a la fira del llibre"
descripcio = "Format A2, dues versions de color"
responsable = "Nuria"
prioritat = "mitjana"         # alta / mitjana / baixa
completada = False            # passara a True quan es lliuri
dies_estimats = 2
hores_dedicades = 3.5
data_lliurament = None        # pendent de confirmar amb l'organitzacio
client = None                 # l'encarrec va arribar per l'associacio, sense client assignat

print("=== FITXA DE TASCA ===")
print(ESTUDI)
print("")
print(titol)
print(descripcio)
print(responsable)
print(prioritat)
print(completada)
print(dies_estimats)
print(hores_dedicades)
print(data_lliurament)
print(client)
print("")
print("--- Tipus ---")
print(type(titol))             # <class 'str'>
print(type(dies_estimats))     # <class 'int'>
print(type(completada))        # <class 'bool'>

Justificació dels tipus escollits:

  • titol, descripcio, responsable i prioritat són textos: str.
  • completada és un sí/no: bool. És preferible a desar el text "pendent".
  • dies_estimats és una quantitat entera: int.
  • hores_dedicades admet mitges hores: float, amb punt decimal.
  • data_lliurament i client no tenen valor encara: None, no "".

I la comprovació final imprimeix <class 'str'>, <class 'int'> i <class 'bool'>.

Conclusió

Has fet el pas que converteix un text executable en un programa. Ara saps que una variable és un nom que apunta a un valor en memòria; que el = no afirma una igualtat sinó que ordena una assignació, avaluant sempre primer la part dreta; i que reassignar una variable simplement mou l'etiqueta a un altre valor, sense afectar les altres variables que apuntessin a l'anterior.

Coneixes les regles dels noms (lletres, dígits i guió baix; sense començar per número; sense paraules reservades) i, més important, les convencions que separen el professional de l'aficionat: snake_case, noms amb significat i constants en MAJÚSCULES. Domines els cinc tipus bàsics —int, float, str, bool i None—, saps inspeccionar-los amb type() quan alguna cosa no quadra, entens què implica el tipatge dinàmic de Python i per què convé no abusar-ne, i tens una primera intuïció de la immutabilitat que et serà molt útil quan arribin les llistes.

I tascafacil.py ja és a la seva versió 0.2: les cinc dades de la tasca del logotip del Forn Solé viuen en variables, i canviar el responsable és qüestió d'editar una línia de dades, no el codi que les mostra.

Però de moment el programa només desa informació; no hi fa res. No sap dir si la tasca és urgent, ni quant falta per al lliurament, ni quin percentatge de l'encàrrec porta fet el Luis. Per a això calen expressions: combinar variables i valors mitjançant operadors per produir resultats nous. És exactament el tema de la lliçó següent, Operadors i expressions, on les teves variables deixaran d'estar quietes i començaran a calcular.

© Copyright 2026. Tots els drets reservats