Fins ara, totes les dades dels teus programes estaven escrites dins del mateix codi. En aquesta lliçó els teus scripts començaran a conversar amb l'usuari: aprendràs a demanar dades amb input() (i a conviure amb el fet que sempre retorna text), a controlar la sortida de print() amb els seus paràmetres sep i end, i a donar format professional als resultats amb f-strings (alineació, amplades, decimals). Tot culmina en el primer programa realment interactiu de Papyrus: la fitxa d'alta d'un llibre. L'entrada i sortida és la cara visible de qualsevol programa; dominar-la fa que els teus scripts passin de "exercicis" a "eines".

Contingut

  1. Llegir dades de l'usuari: input()
  2. input() sempre retorna str: conversió de l'entrada
  3. print() a fons: els paràmetres sep i end
  4. Formatatge avançat amb f-strings: decimals, amplades i alineació
  5. Projecte: fitxa interactiva d'un llibre per a Papyrus

Llegir dades de l'usuari: input()

La funció input() atura el programa, mostra un missatge (el prompt) i espera que l'usuari escrigui alguna cosa i premi Retorn. El que s'ha escrit es retorna com a resultat, i l'habitual és desar-ho en una variable:

nom = input("Com et dius? ")
print(f"Benvingut a Papyrus, {nom}")

Execució (el que escriu l'usuari va després del prompt):

Com et dius? Lluis
Benvingut a Papyrus, Lluis

Anatomia de la línia nom = input("Com et dius? "):

  • input(...) — crida la funció de lectura.
  • "Com et dius? " — el missatge que veu l'usuari. Fixa't en l'espai final: sense ell, el cursor quedaria enganxat al signe d'interrogació. És un petit detall que dona molta qualitat.
  • nom = ... — desa el que s'ha teclejat per fer-ho servir després.

El programa queda bloquejat a la línia de l'input() fins que l'usuari prem Retorn. Pots encadenar diverses preguntes i s'aniran fent en ordre:

titol = input("Titol del llibre: ")
autor = input("Autor: ")
print(f"Anotat: {titol}, de {autor}")

input() sempre retorna str: conversió de l'entrada

Aquest és el concepte crític de la lliçó: input() retorna sempre una cadena de text (str), encara que l'usuari teclegi un nombre.

>>> estoc = input("Quants exemplars? ")
Quants exemplars? 5
>>> estoc
'5'
>>> type(estoc)
<class 'str'>
>>> estoc + 1
TypeError: can only concatenate str (not "int") to str

L'usuari va teclejar 5, però la variable conté '5' (text). Intentar operar-hi com a nombre falla o, pitjor, produeix resultats absurds:

>>> estoc * 2      # repeteix el text, no multiplica el nombre!
'55'

La solució és la conversió de tipus que vas aprendre a la lliçó 01-03, aplicada just en llegir:

estoc = int(input("Quants exemplars? "))          # text -> enter
preu = float(input("Preu en euros? "))            # text -> decimal

Es llegeix de dins cap a fora: primer input() obté el text, després int() o float() el converteixen.

L'usuari tecleja Codi La variable conté Tipus
5 input(...) '5' str
5 int(input(...)) 5 int
12.50 float(input(...)) 12.5 float
hola int(input(...)) ValueError

L'última fila és important: si l'usuari escriu alguna cosa que no és un nombre, el programa s'atura amb ValueError. Per ara assumirem usuaris ben intencionats; al mòdul 7 (excepcions) aprendràs a capturar aquest error i tornar a preguntar amb elegància.

Exemple complet per a Papyrus:

# valor_estoc.py - quants diners hi ha al prestatge?
preu = float(input("Preu del llibre: "))
unitats = int(input("Unitats al prestatge: "))

valor_total = preu * unitats
print(f"Valor del prestatge: {valor_total:.2f} euros")
Preu del llibre: 12.50
Unitats al prestatge: 4
Valor del prestatge: 50.00 euros

print() a fons: els paràmetres sep i end

Ja saps que print() mostra valors. Dues coses noves. La primera: pot rebre diversos valors separats per comes, i els mostra separats per un espai:

>>> print("L'Odissea", 12.50, "euros")
L'Odissea 12.5 euros

La segona: print() accepta dos paràmetres especials que en controlen el comportament:

Paràmetre Què controla Valor per defecte
sep El separador entre els valors " " (un espai)
end El que s'escriu al final "\n" (salt de línia)

S'indiquen pel seu nom, al final de la crida:

print("L'Odissea", "Homer", "12.50", sep=" | ")
L'Odissea | Homer | 12.50

Amb sep="-" obtindries L'Odissea-Homer-12.50; amb sep="", tot enganxat. És la manera ràpida de muntar línies tabulars o codis.

Pel que fa a end: per defecte cada print() acaba amb un salt de línia ("\n" és el caràcter especial que el representa). Canviant-lo, pots fer que el següent print() continuï a la mateixa línia:

print("Comprovant estoc", end="... ")
print("OK")
Comprovant estoc... OK

Tots dos paràmetres es poden combinar:

print("Papyrus", "Llibreria", "Barri", sep=" · ", end=" ***\n")
Papyrus · Llibreria · Barri ***

Un truc útil amb sep: imprimir un tiquet de línia única a partir de dades soltes:

data = "2026-07-13"
titol = "Hamlet"
total = 9.95
print(data, titol, total, sep=" ; ")   # 2026-07-13 ; Hamlet ; 9.95

Aquest estil de línia amb separadors et sonarà molt quan treballis amb fitxers CSV al mòdul 6.

Formatatge avançat amb f-strings: decimals, amplades i alineació

A la lliçó 01-03 vas veure les f-strings bàsiques i el format :.2f. La sintaxi general és {valor:especificació}, i l'especificació permet controlar decimals, amplada i alineació. L'essencial:

Decimals

preu = 12.5
print(f"{preu:.2f}")   # 12.50  -> 2 decimals
print(f"{preu:.1f}")   # 12.5   -> 1 decimal
print(f"{preu:.0f}")   # 12     -> sense decimals (arrodoneix)

f significa "format de nombre decimal fix" i el nombre després del punt indica quants decimals. Arrodoneix, no trunca: {9.987:.2f} produeix 9.99.

Amplada mínima i alineació

Pots reservar una amplada fixa de caràcters i decidir cap a on s'alinea el contingut:

Especificació Significat f"[{x:...}]" amb x = "Anna"
:10 amplada 10, text a l'esquerra (per defecte) [Anna ]
:>10 amplada 10, alineat a la dreta [ Anna]
:<10 amplada 10, alineat a l'esquerra [Anna ]
:^10 amplada 10, centrat [ Anna ]

Amb nombres, l'alineació per defecte és a la dreta, i es pot combinar amb els decimals: :{amplada}.{decimals}f.

print(f"[{12.5:8.2f}]")    # [   12.50]  -> amplada 8, 2 decimals

L'ús estrella: taules alineades

Combinant amplades i alineacions, la sortida de text es converteix en taules llegibles. El catàleg de Papyrus:

print(f"{'TITOL':<22}{'AUTOR':<12}{'PREU':>8}")
print("-" * 42)
print(f"{'Faust':<22}{'Goethe':<12}{12.50:>8.2f}")
print(f"{'Hamlet':<22}{'Shakespeare':<12}{9.95:>8.2f}")
print(f"{'El Quixot':<22}{'Cervantes':<12}{15.90:>8.2f}")
TITOL                 AUTOR           PREU
------------------------------------------
Faust                 Goethe         12.50
Hamlet                Shakespeare     9.95
El Quixot             Cervantes      15.90

Observa els detalls:

  • Els títols i autors fan servir :<22 i :<12 (text a l'esquerra, amplada fixa): les columnes queden alineades verticalment.
  • Els preus fan servir :>8.2f (dreta, dos decimals): els decimals queden els uns sota els altres, com en qualsevol factura seriosa.
  • Dins de les claus hi pot anar un literal ('Hamlet') o una variable; en programes reals seran variables.
  • "-" * 42 genera la línia separadora repetint el guió (la repetició de cadenes de text de la lliçó 01-03).

Projecte: fitxa interactiva d'un llibre per a Papyrus

Ajuntem-ho tot. L'Anna vol una petita eina per donar d'alta llibres: el programa pregunta les dades i presenta una fitxa ben formatada, amb el valor total de l'estoc calculat.

# fitxa_llibre.py - Alta interactiva d'un llibre a Papyrus

NOM_BOTIGA = "PAPYRUS"

print("=" * 40)
print(f"{NOM_BOTIGA:^40}")
print(f"{'Alta de llibre al cataleg':^40}")
print("=" * 40)

# --- Entrada de dades ---
titol = input("Titol: ")
autor = input("Autor: ")
preu = float(input("Preu (euros): "))
estoc = int(input("Unitats rebudes: "))

valor_estoc = preu * estoc

# --- Sortida: fitxa formatada ---
print()                              # linia en blanc separadora
print("-" * 40)
print(f"{'FITXA DEL LLIBRE':^40}")
print("-" * 40)
print(f"{'Titol:':<16}{titol}")
print(f"{'Autor:':<16}{autor}")
print(f"{'Preu:':<16}{preu:>8.2f} euros")
print(f"{'Estoc:':<16}{estoc:>8} uts.")
print(f"{'Valor total:':<16}{valor_estoc:>8.2f} euros")
print("-" * 40)
print("Llibre registrat.", "Fins aviat!", sep=" ")

Una execució d'exemple:

========================================
                PAPYRUS
       Alta de llibre al cataleg
========================================
Titol: L'Odissea
Autor: Homer
Preu (euros): 12.50
Unitats rebudes: 4

----------------------------------------
            FITXA DEL LLIBRE
----------------------------------------
Titol:          L'Odissea
Autor:          Homer
Preu:              12.50 euros
Estoc:                 4 uts.
Valor total:       50.00 euros
----------------------------------------
Llibre registrat. Fins aviat!

Repàs de les tècniques emprades:

  • Constant NOM_BOTIGA en majúscules (lliçó 01-04).
  • Capçalera centrada amb :^40 i línies decoratives amb "=" * 40.
  • Entrada convertida: float() per al preu, int() per a l'estoc; el títol i l'autor es queden com a str, que és el que són.
  • Càlcul amb les dades rebudes (valor_estoc).
  • Fitxa alineada: etiquetes a l'esquerra amb amplada fixa (:<16) i nombres a la dreta amb decimals (:>8.2f), estil factura.
  • print() buit per deixar una línia en blanc, i un sep final a tall de comiat.

Aquest script és, de debò, el primer mòdul funcional del sistema de Papyrus: demana dades reals, calcula i presenta resultats amb aspecte professional. Guarda'l: l'anirem millorant en els propers mòduls (validar l'entrada, repetir l'alta per a diversos llibres, desar en fitxer...).

Errors Comuns i Consells

  • Operar amb input() sense convertir: input() retorna str sempre. Si has de fer comptes, embolcalla'l amb int() o float() en el moment de llegir. El símptoma típic: '5' * 2 dona '55' o apareix un TypeError en sumar.
  • Fer servir coma decimal en teclejar: si l'usuari escriu 12,50, float() llança ValueError (Python espera punt: 12.50). Indica-ho al prompt: "Preu (fes servir punt decimal): ".
  • Convertir a int un nombre amb decimals teclejat: int("12.50") falla amb ValueError (no és un enter vàlid com a text). Si esperes decimals, fes servir float().
  • Oblidar l'espai final del prompt: input("Titol:") deixa el cursor enganxat. input("Titol: ") respira.
  • Confondre sep i end: sep va entre els valors d'un mateix print(); end va al final de la crida. Si la teva sortida surt tota en una línia inesperadament, revisa si has tocat end.
  • Desquadraments en taules: si una columna balla, revisa que totes les files facin servir la mateixa amplada a l'especificació (:<22 a totes, no :<22 en una i :<20 en una altra).
  • Consell: dissenya primer la sortida "a mà" en un paper o comentari (com vols que es vegi el tiquet o la fitxa) i després escriu els print(). Formatar amb un objectiu visual clar és molt més fàcil.

Exercicis

Exercici 1

Sense executar-lo, escriu exactament què mostra aquest programa si l'usuari tecleja 3 i després 2:

a = input("Primer nombre: ")
b = input("Segon nombre: ")
print(a + b)
print(int(a) + int(b))
print(a, b, sep="")

Exercici 2

Escriu un script tiquet.py que pregunti el títol d'un llibre, el seu preu i quantes unitats s'endú el client, i mostri un minitiquet de Papyrus amb aquest aspecte exacte (els nombres, amb dos decimals i alineats a la dreta en una amplada de 8):

====== PAPYRUS ======
Hamlet
3 x     9.95
TOTAL:     29.85 EUR

Exercici 3

Escriu un script que pregunti a l'usuari el seu nom i el seu any de naixement, calculi la seva edat aproximada el 2026 i mostri: Hola, Anna. El 2026 fas 34 anys. fent servir una sola f-string. Fes servir una constant ANY_ACTUAL = 2026.

Solucions

Solució 1

32
5
32

Explicació línia a línia:

  • print(a + b)32: a i b són cadenes de text ('3' i '2'), i + entre cadenes concatena.
  • print(int(a) + int(b))5: convertides a enters, + suma de debò.
  • print(a, b, sep="")32: imprimeix totes dues cadenes sense separador. El mateix resultat visual que la primera, per un camí diferent.

Solució 2

# tiquet.py
titol = input("Titol: ")
preu = float(input("Preu: "))
unitats = int(input("Unitats: "))

total = preu * unitats

print("=" * 6, "PAPYRUS", "=" * 6, sep=" ")
print(titol)
print(f"{unitats} x {preu:>8.2f}")
print(f"TOTAL: {total:>10.2f} EUR")

Amb l'entrada Hamlet, 9.95 i 3:

====== PAPYRUS ======
Hamlet
3 x     9.95
TOTAL:      29.85 EUR

Claus: el preu es llegeix amb float() i les unitats amb int(); {preu:>8.2f} alinea a la dreta en 8 caràcters amb 2 decimals; la primera línia fa servir sep=" " per separar els tres fragments amb un espai (també valdria un únic literal "====== PAPYRUS ======").

Solució 3

# edat.py
ANY_ACTUAL = 2026

nom = input("El teu nom: ")
any_naixement = int(input("Any de naixement: "))

print(f"Hola, {nom}. El {ANY_ACTUAL} fas {ANY_ACTUAL - any_naixement} anys.")

Amb l'entrada Anna i 1992:

Hola, Anna. El 2026 fas 34 anys.

Fixa't que dins de les claus de la f-string hi pot anar directament l'expressió ANY_ACTUAL - any_naixement: no cal una variable intermèdia (tot i que crear-la també seria correcte i potser més llegible).

Conclusió

Els teus programes ja són bidireccionals: llegeixen dades de l'usuari amb input() —recordant sempre que retorna str i que cal convertir amb int()/float() allò que sigui numèric— i escriuen resultats amb control total: separadors i finals de línia amb sep/end, i format professional amb f-strings (decimals :.2f, amplades i alineacions :<, :>, :^). Amb tot això has construït la fitxa d'alta de llibres de Papyrus, el primer programa interactiu del projecte.

Queda una última peça per tancar el mòdul d'introducció: preparar el teu entorn per treballar com un professional amb llibreries externes. A la propera lliçó, Entorns Virtuals i Gestió de Paquets, aprendràs a aïllar les dependències de cada projecte amb venv i a instal·lar paquets amb pip.

Curs de Programació en Python

Mòdul 1: Introducció a Python

Mòdul 2: Estructures de Control

Mòdul 3: Funcions i Mòduls

Mòdul 4: Estructures de Dades

Mòdul 5: Programació Orientada a Objectes

Mòdul 6: Gestió de Fitxers

Mòdul 7: Gestió d'Errors i Excepcions

Mòdul 8: Temes Avançats

Mòdul 9: Proves i Depuració

Mòdul 10: Desenvolupament Web amb Python

Mòdul 11: Ciència de Dades amb Python

Mòdul 12: Projecte Final

© Copyright 2026. Tots els drets reservats