Con el entorno ya funcionando, es hora de aprender las reglas del juego: cómo se estructura el código Python (indentación, comentarios) y con qué materiales básicos trabaja (números, textos, booleanos). También conocerás los operadores para combinarlos, cómo convertir un tipo en otro y una herramienta que usarás a diario: las f-strings. Esta lección es la base sobre la que se construye absolutamente todo lo demás, así que tómatela con calma y prueba cada ejemplo en el REPL o en un script.
Contenido
- La indentación: cómo Python organiza los bloques
- Comentarios
- Tipos de datos básicos:
int,float,str,boolyNone - Operadores aritméticos
- Operadores de comparación
- Operadores lógicos
- Conversión de tipos
- f-strings: textos con valores incrustados
La indentación: cómo Python organiza los bloques
En muchos lenguajes, los bloques de código se delimitan con llaves { }. Python tomó una decisión distinta y muy característica: los bloques se delimitan con la indentación, es decir, con los espacios al principio de cada línea.
Observa este fragmento (usa una condición if; las estudiaremos a fondo en el módulo 2, aquí solo nos interesa la forma):
stock = 5
if stock > 0:
print("Hay ejemplares disponibles")
print("Puedes venderlo")
print("Fin del programa")- Las dos líneas indentadas (desplazadas 4 espacios a la derecha) forman el bloque que depende del
if: solo se ejecutan si la condición se cumple. - La última línea, sin indentar, está fuera del bloque: se ejecuta siempre.
- Los dos puntos
:al final delifanuncian que a continuación viene un bloque indentado.
Reglas de oro:
- Usa 4 espacios por nivel de indentación (es la convención oficial, recogida en la guía de estilo PEP 8).
- No mezcles tabuladores y espacios: provoca errores difíciles de ver. Configura tu editor para que la tecla Tab inserte 4 espacios (VS Code lo hace por defecto en ficheros Python).
- La indentación no es decorativa: cambiarla cambia el significado del programa.
Este código no se ejecuta: Python espera un bloque indentado tras los : y no lo encuentra. La consecuencia positiva de este diseño es que todo el código Python del mundo tiene un aspecto uniforme y legible.
Comentarios
Un comentario es texto que Python ignora por completo; existe solo para los humanos que leen el código. Se escribe con el símbolo #: todo lo que hay desde # hasta el final de la línea es comentario.
# Este script calcula el valor del estante de novedades de Papyrus
precio = 15.90 # precio en euros de un ejemplar
ejemplares = 3 # unidades en el estante
# El total es precio por unidades
print(precio * ejemplares)Buenas prácticas:
- Comenta el porqué, no el qué evidente.
# suma 1 a xjunto ax = x + 1no aporta nada;# el pedido incluye un ejemplar de regalosí. - Mantén los comentarios actualizados: un comentario que miente es peor que ninguno.
- Para "desactivar" temporalmente una línea de código mientras pruebas, ponle
#delante (es lo que se llama comentar código).
Tipos de datos básicos: int, float, str, bool y None
Todo valor en Python tiene un tipo, que determina qué es y qué se puede hacer con él. Los cinco fundamentales:
| Tipo | Nombre | Qué representa | Ejemplos |
|---|---|---|---|
int |
Entero | Números sin decimales | 42, -3, 0, 2500 |
float |
Coma flotante | Números con decimales | 15.90, -0.5, 3.0 |
str |
Cadena (string) | Texto | "Papyrus", 'La Odisea' |
bool |
Booleano | Verdadero o falso | True, False |
NoneType |
Nada | Ausencia de valor | None |
Puedes preguntar el tipo de cualquier valor con la función type():
>>> type(42)
<class 'int'>
>>> type(15.90)
<class 'float'>
>>> type("Papyrus")
<class 'str'>
>>> type(True)
<class 'bool'>Enteros (int)
Números sin parte decimal: unidades en stock, número de clientes, año de publicación. En Python pueden ser arbitrariamente grandes (no hay límite práctico de tamaño).
Decimales (float)
Números con parte decimal, escritos con punto (no coma): 15.90, no 15,90. Son la elección natural para los precios de Papyrus.
Un detalle importante: los float se almacenan en binario y a veces producen pequeñas imprecisiones:
No es un fallo de Python (pasa en casi todos los lenguajes), sino una limitación de la representación binaria. Para este curso basta con saber que existe y que al mostrar precios conviene redondear (las f-strings, al final de esta lección, lo resuelven con elegancia).
Cadenas de texto (str)
Texto delimitado por comillas dobles "..." o simples '...' — ambas son válidas, elige una y sé consistente. Si el texto contiene una comilla, usa el otro tipo por fuera:
Dos operaciones básicas con cadenas:
>>> "Papyrus" + " " + "Libros" # concatenación (unir textos)
'Papyrus Libros'
>>> "=" * 20 # repetición
'===================='
>>> len("La Odisea") # longitud: número de caracteres
9Las cadenas dan para mucho más (métodos, rebanado, etc.); lo veremos en profundidad en el módulo 4. Por ahora, con crear, unir y medir es suficiente.
Booleanos (bool)
Solo dos valores posibles: True (verdadero) y False (falso), con la inicial en mayúscula. Responden a preguntas de sí o no: ¿hay stock?, ¿el cliente tiene descuento?
Los booleanos cobran todo su sentido con las sentencias condicionales del módulo 2; aquí aprenderemos a producirlos con los operadores de comparación.
None: la ausencia de valor
None representa "nada" o "sin valor todavía". Es útil, por ejemplo, para indicar que aún no conocemos un dato:
No es 0 ni una cadena vacía: es su propio tipo, y significa literalmente ausencia de valor.
Operadores aritméticos
Python incluye los operadores matemáticos habituales y alguno más:
| Operador | Operación | Ejemplo | Resultado |
|---|---|---|---|
+ |
Suma | 15.90 + 12.50 |
28.4 |
- |
Resta | 20 - 3 |
17 |
* |
Multiplicación | 15.90 * 3 |
47.7 |
/ |
División (siempre da float) |
10 / 4 |
2.5 |
// |
División entera (descarta decimales) | 10 // 4 |
2 |
% |
Módulo (resto de la división) | 10 % 4 |
2 |
** |
Potencia | 2 ** 10 |
1024 |
Ejemplo aplicado a Papyrus:
# Ana quiere repartir 10 ejemplares nuevos en cajas de 4
ejemplares = 10
por_caja = 4
print(ejemplares // por_caja) # 2 -> cajas completas
print(ejemplares % por_caja) # 2 -> ejemplares sueltos que sobran//responde a "¿cuántas cajas completas puedo llenar?"%responde a "¿cuántos ejemplares quedan fuera?"
La precedencia sigue las reglas matemáticas (primero **, luego * / // %, luego + -). Ante la duda, usa paréntesis: (15.90 + 12.50) * 2 es más claro y evita sorpresas.
Operadores de comparación
Comparan dos valores y devuelven siempre un booleano (True o False):
| Operador | Significado | Ejemplo | Resultado |
|---|---|---|---|
== |
Igual a | 5 == 5 |
True |
!= |
Distinto de | 5 != 3 |
True |
> |
Mayor que | 10 > 20 |
False |
< |
Menor que | 10 < 20 |
True |
>= |
Mayor o igual | 5 >= 5 |
True |
<= |
Menor o igual | 4 <= 3 |
False |
>>> stock = 0
>>> stock > 0 # ¿queda algún ejemplar?
False
>>> precio = 15.90
>>> precio <= 20 # ¿entra en el presupuesto de Luis?
True
>>> "Hamlet" == "hamlet" # las mayúsculas importan en los textos
FalseAtención:
==(comparar) y=(asignar, lo veremos en la próxima lección) son cosas distintas. Confundirlos es uno de los errores más clásicos de principiante.
Operadores lógicos
Combinan booleanos para expresar condiciones compuestas:
| Operador | Devuelve True cuando... |
Ejemplo |
|---|---|---|
and |
ambos operandos son True |
True and False → False |
or |
al menos uno es True |
True or False → True |
not |
invierte el valor | not True → False |
Ejemplo: Luis quiere un libro que esté disponible y cueste menos de 20 euros:
stock = 3
precio = 15.90
hay_stock = stock > 0
es_asequible = precio < 20
print(hay_stock and es_asequible) # True -> cumple ambas condiciones
print(not hay_stock) # False -> sí hay stock
print(stock == 0 or precio > 50) # False -> ninguna de las dos se cumpleTabla de verdad resumida de and y or:
| A | B | A and B |
A or B |
|---|---|---|---|
True |
True |
True |
True |
True |
False |
False |
True |
False |
True |
False |
True |
False |
False |
False |
False |
Conversión de tipos
A menudo necesitas transformar un valor de un tipo a otro. Python ofrece funciones con el mismo nombre que el tipo destino:
| Función | Convierte a... | Ejemplo | Resultado |
|---|---|---|---|
int(x) |
Entero | int("42"), int(3.99) |
42, 3 (trunca, no redondea) |
float(x) |
Decimal | float("15.90"), float(7) |
15.9, 7.0 |
str(x) |
Cadena | str(15.90) |
"15.9" |
bool(x) |
Booleano | bool(0), bool("hola") |
False, True |
>>> int("120") # de texto a entero: perfecto para cantidades
120
>>> float("15.90") # de texto a decimal: perfecto para precios
15.9
>>> str(2026) + " sera un gran año para Papyrus"
'2026 sera un gran año para Papyrus'
>>> int("quince") # esto NO puede convertirse
ValueError: invalid literal for int() with base 10: 'quince'Observaciones importantes:
int(3.99)da3: trunca (corta los decimales), no redondea. Para redondear existeround(3.99)→4.- Convertir texto a número solo funciona si el texto parece un número; si no, obtienes un
ValueError(aprenderás a manejarlo en el módulo 7). - No puedes concatenar texto y número directamente:
"Total: " + 42falla. Debes convertir:"Total: " + str(42)... o mejor, usar f-strings, que vemos a continuación. - En
bool(x), el cero, la cadena vacía""yNonese consideranFalse; casi todo lo demás,True.
Esta conversión será vital en la lección 01-05, porque todo lo que teclea el usuario llega como texto y habrá que convertirlo.
f-strings: textos con valores incrustados
Las f-strings (cadenas formateadas) son la forma moderna y recomendada de construir textos que mezclan literales y valores. Se escriben anteponiendo una f a las comillas, y dentro se incrustan expresiones entre llaves { }:
titulo = "La Odisea"
precio = 12.50
stock = 4
print(f"{titulo} cuesta {precio} euros y quedan {stock} ejemplares")Ventajas frente a la concatenación con +:
- No hay que convertir los números con
str(): la f-string lo hace sola. - El texto se lee de un vistazo, con los valores en su sitio.
- Dentro de las llaves cabe cualquier expresión, no solo variables:
Un adelanto útil: puedes controlar los decimales con :.2f (dos decimales fijos), ideal para precios:
En la lección 01-05 exploraremos el formateo con más detalle (alineación, anchos de columna). Por ahora, acostúmbrate a usar f-strings siempre que necesites mezclar texto y valores.
Errores Comunes y Consejos
IndentationError: casi siempre por olvidar indentar tras:, indentar donde no toca, o mezclar tabuladores con espacios. Configura el editor a 4 espacios y sé consistente.- Usar coma decimal:
15,90no es unfloaten Python (de hecho crea otra cosa: una tupla, que verás en el módulo 4). Los decimales van con punto:15.90. - Confundir
=con==:=asigna,==compara. Si Python te da unSyntaxErroren una comparación, revisa esto primero. - Escribir
true/falseen minúscula: en Python sonTrueyFalse. En minúscula obtendrásNameError. - Sumar texto y número:
"Total: " + 5lanzaTypeError. Solución rápida:str(5). Solución elegante:f"Total: {5}". - Olvidar la
fde la f-string:print("{titulo}")sin lafimprime literalmente{titulo}, llaves incluidas. Si ves las llaves en la salida, te falta laf. - Consejo: ante cualquier duda de tipos, pregunta al REPL con
type(). Es gratis y quita muchas confusiones.
Ejercicios
Ejercicio 1
Sin ejecutar el código, indica el tipo (int, float, str o bool) y el valor resultante de cada expresión. Luego compruébalo en el REPL:
7 / 27 // 27 % 2"7" + "2"7 > 2int("7") + 2
Ejercicio 2
Papyrus vende Hamlet a 9.95 euros. Un cliente compra 3 ejemplares y paga con un billete de 50 euros. Escribe un script que calcule y muestre con una f-string (y dos decimales) el total de la compra y el cambio a devolver.
Ejercicio 3
Escribe un script que, dadas estas variables, calcule un booleano recomendable que sea True solo si el libro tiene stock (más de 0 unidades) y su precio es menor o igual a 15 euros, y lo muestre con una f-string:
Prueba después a cambiar stock a 0 y comprueba que el resultado cambia.
Soluciones
Solución 1
7 / 2→3.5, tipofloat(la división/siempre devuelvefloat).7 // 2→3, tipoint(división entera: descarta los decimales).7 % 2→1, tipoint(resto de dividir 7 entre 2)."7" + "2"→"72", tipostr(con cadenas,+concatena, no suma).7 > 2→True, tipobool(las comparaciones devuelven booleanos).int("7") + 2→9, tipoint(primero convertimos el texto a entero, luego sumamos).
Solución 2
# compra_hamlet.py
precio = 9.95
unidades = 3
pago = 50
total = precio * unidades
cambio = pago - total
print(f"Total de la compra: {total:.2f} euros")
print(f"Cambio a devolver: {cambio:.2f} euros")El formato :.2f garantiza dos decimales exactos, imprescindible al mostrar dinero (y de paso oculta las pequeñas imprecisiones de los float).
Solución 3
# recomendable.py
titulo = "La Odisea"
precio = 12.50
stock = 4
recomendable = stock > 0 and precio <= 15
print(f"¿Recomendar {titulo}? {recomendable}")Con stock = 0, la primera condición (stock > 0) pasa a ser False, y como and exige que ambas sean verdaderas, recomendable se vuelve False.
Conclusión
Ya conoces la gramática esencial de Python: los bloques se definen con indentación de 4 espacios, los comentarios con #, y los datos se clasifican en tipos (int, float, str, bool, None). Sabes combinarlos con operadores aritméticos, de comparación y lógicos, convertir unos tipos en otros y construir mensajes limpios con f-strings. Papyrus ya puede calcular totales, cambios y decidir si un libro es recomendable.
Habrás notado que llevamos toda la lección guardando valores en nombres como precio o stock sin explicar formalmente qué son. Ese es justo el tema de la próxima lección: Variables y Constantes — cómo se asignan, cómo nombrarlas bien según PEP 8 y qué ocurre exactamente cuando reasignas un valor.
Curso de Programación en Python
Módulo 1: Introducción a Python
- Introducción a Python
- Configuración del Entorno de Desarrollo
- Sintaxis de Python y Tipos de Datos Básicos
- Variables y Constantes
- Entrada y Salida Básica
- Entornos Virtuales y Gestión de Paquetes
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for y while
- Herramientas de Control de Flujo
- Comprensiones de Listas
Módulo 3: Funciones y Módulos
- Definición de Funciones
- Argumentos de Función
- Funciones Lambda
- Módulos y Paquetes
- Visión General de la Biblioteca Estándar
Módulo 4: Estructuras de Datos
Módulo 5: Programación Orientada a Objetos
Módulo 6: Manejo de Archivos
- Lectura y Escritura de Archivos
- Trabajo con Archivos CSV
- Manejo de Datos JSON
- Operaciones con Archivos y Directorios
Módulo 7: Manejo de Errores y Excepciones
- Introducción a las Excepciones
- Manejo de Excepciones
- Lanzamiento de Excepciones
- Excepciones Personalizadas
- Buenas Prácticas y Registro de Errores con logging
Módulo 8: Temas Avanzados
- Anotaciones de Tipos (type hints)
- Decoradores
- Generadores
- Administradores de Contexto
- Concurrencia: Hilos y Procesos
- Asyncio para Programación Asíncrona
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con unittest
- Pruebas con pytest
- Desarrollo Guiado por Pruebas
- Técnicas de Depuración
- Uso de pdb para Depuración
Módulo 10: Desarrollo Web con Python
- Introducción al Desarrollo Web
- Fundamentos del Framework Flask
- Construcción de APIs REST con Flask
- Introducción a Django
- Construcción de Aplicaciones Web con Django
Módulo 11: Ciencia de Datos con Python
- Introducción a la Ciencia de Datos
- NumPy para Computación Numérica
- Pandas para Manipulación de Datos
- Matplotlib para Visualización de Datos
- Introducción al Aprendizaje Automático con scikit-learn
