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

  1. La indentación: cómo Python organiza los bloques
  2. Comentarios
  3. Tipos de datos básicos: int, float, str, bool y None
  4. Operadores aritméticos
  5. Operadores de comparación
  6. Operadores lógicos
  7. Conversión de tipos
  8. 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 del if anuncian 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.
if stock > 0:
print("Hay ejemplares")   # IndentationError: falta la indentación

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 x junto a x = x + 1 no aporta nada; # el pedido incluye un ejemplar de regalo sí.
  • 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).

>>> 120 + 35          # ejemplares totales en dos estanterías
155

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:

>>> 0.1 + 0.2
0.30000000000000004

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:

tienda = "Papyrus"
lema = 'La librería "de toda la vida" de tu barrio'

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
9

Las 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?

tiene_stock = True
esta_descatalogado = False

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:

fecha_devolucion = None   # el libro no está prestado a nadie

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
False

Atenció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 FalseFalse
or al menos uno es True True or FalseTrue
not invierte el valor not TrueFalse

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 cumple

Tabla 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) da 3: trunca (corta los decimales), no redondea. Para redondear existe round(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: " + 42 falla. Debes convertir: "Total: " + str(42)... o mejor, usar f-strings, que vemos a continuación.
  • En bool(x), el cero, la cadena vacía "" y None se consideran False; 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")
La Odisea cuesta 12.5 euros y quedan 4 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:
>>> print(f"Dos ejemplares: {12.50 * 2} euros")
Dos ejemplares: 25.0 euros

Un adelanto útil: puedes controlar los decimales con :.2f (dos decimales fijos), ideal para precios:

>>> precio = 12.5
>>> print(f"Precio: {precio:.2f} euros")
Precio: 12.50 euros

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,90 no es un float en 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 un SyntaxError en una comparación, revisa esto primero.
  • Escribir true/false en minúscula: en Python son True y False. En minúscula obtendrás NameError.
  • Sumar texto y número: "Total: " + 5 lanza TypeError. Solución rápida: str(5). Solución elegante: f"Total: {5}".
  • Olvidar la f de la f-string: print("{titulo}") sin la f imprime literalmente {titulo}, llaves incluidas. Si ves las llaves en la salida, te falta la f.
  • 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:

  1. 7 / 2
  2. 7 // 2
  3. 7 % 2
  4. "7" + "2"
  5. 7 > 2
  6. int("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:

titulo = "La Odisea"
precio = 12.50
stock = 4

Prueba después a cambiar stock a 0 y comprueba que el resultado cambia.

Soluciones

Solución 1

  1. 7 / 23.5, tipo float (la división / siempre devuelve float).
  2. 7 // 23, tipo int (división entera: descarta los decimales).
  3. 7 % 21, tipo int (resto de dividir 7 entre 2).
  4. "7" + "2""72", tipo str (con cadenas, + concatena, no suma).
  5. 7 > 2True, tipo bool (las comparaciones devuelven booleanos).
  6. int("7") + 29, tipo int (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")
Total de la compra: 29.85 euros
Cambio a devolver: 20.15 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}")
¿Recomendar La Odisea? True

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

Módulo 2: Estructuras de Control

Módulo 3: Funciones y Módulos

Módulo 4: Estructuras de Datos

Módulo 5: Programación Orientada a Objetos

Módulo 6: Manejo de Archivos

Módulo 7: Manejo de Errores y Excepciones

Módulo 8: Temas Avanzados

Módulo 9: Pruebas y Depuración

Módulo 10: Desarrollo Web con Python

Módulo 11: Ciencia de Datos con Python

Módulo 12: Proyecto Final

© Copyright 2026. Todos los derechos reservados