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
- Llegir dades de l'usuari:
input() input()sempre retornastr: conversió de l'entradaprint()a fons: els paràmetressepiend- Formatatge avançat amb f-strings: decimals, amplades i alineació
- 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:
Execució (el que escriu l'usuari va després del prompt):
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:
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 strL'usuari va teclejar 5, però la variable conté '5' (text). Intentar operar-hi com a nombre falla o, pitjor, produeix resultats absurds:
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 -> decimalEs 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")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:
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:
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:
Tots dos paràmetres es poden combinar:
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.95Aquest 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.
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.90Observa els detalls:
- Els títols i autors fan servir
:<22i:<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. "-" * 42genera 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_BOTIGAen majúscules (lliçó 01-04). - Capçalera centrada amb
:^40i 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 astr, 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 unsepfinal 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()retornastrsempre. Si has de fer comptes, embolcalla'l ambint()ofloat()en el moment de llegir. El símptoma típic:'5' * 2dona'55'o apareix unTypeErroren sumar. - Fer servir coma decimal en teclejar: si l'usuari escriu
12,50,float()llançaValueError(Python espera punt:12.50). Indica-ho al prompt:"Preu (fes servir punt decimal): ". - Convertir a
intun nombre amb decimals teclejat:int("12.50")falla ambValueError(no és un enter vàlid com a text). Si esperes decimals, fes servirfloat(). - Oblidar l'espai final del prompt:
input("Titol:")deixa el cursor enganxat.input("Titol: ")respira. - Confondre
sepiend:sepva entre els valors d'un mateixprint();endva al final de la crida. Si la teva sortida surt tota en una línia inesperadament, revisa si has tocatend. - Desquadraments en taules: si una columna balla, revisa que totes les files facin servir la mateixa amplada a l'especificació (
:<22a totes, no:<22en una i:<20en 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):
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
Explicació línia a línia:
print(a + b)→32:aibsó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:
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:
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
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsica
- Entorns Virtuals i Gestió de Paquets
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treball amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
- Introducció a les Excepcions
- Gestió d'Excepcions
- Llançament d'Excepcions
- Excepcions Personalitzades
- Bones Pràctiques i Registre d'Errors amb logging
Mòdul 8: Temes Avançats
- Anotacions de Tipus (type hints)
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a la Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Proves amb pytest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Fonaments del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per a la Computació Numèrica
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció a l'Aprenentatge Automàtic amb scikit-learn
