Café y Código

3. Texto y tipos básicos: str(), int(), bool() y métodos de str

No son “propiedades”: son constructores (funciones incorporadas)

En Python vas a ver cosas como str("13"), int("123") o bool(1). El nombre técnico suele ser constructor o simplemente función incorporada que devuelve un valor de ese tipo (a veces convirtiendo lo que le pasás).

  • str(x) → intenta representar x como texto.
  • int(x) → intenta interpretar x como entero (si no puede, lanza error).
  • float(x) → igual, pero número decimal.
  • bool(x) → devuelve True o False según las reglas de “verdadero / falso” en Python.
conversiones-basicas.py
PYTHON
1 # De texto a número (muy común después de input())
2 n = int("123")
3 print(n + 1) # 124
4
5 # De número a texto (por ejemplo para concatenar con +)
6 s = str(13)
7 print("Código: " + s)
8
9 # bool: casos típicos
10 print(bool(0)) # False
11 print(bool("")) # False (cadena vacía)
12 print(bool("no")) # True (cualquier texto no vacío)
13 print(bool(99)) # True

type(): saber qué tenés en la mano

Cuando dudás si algo es texto o número, type() te lo dice. Esto conecta directo con la lección de variables e input().

type.py
PYTHON
1 dato = input("Escribí un número: ")
2 print(type(dato)) # <class 'str'> siempre con input()
3
4 numero = int(dato)
5 print(type(numero)) # <class 'int'>

len(), posición con [ ] y rebanadas [:]

Un str es una secuencia de caracteres. Podés saber cuántos tiene, leer uno por posición y cortar pedazos (slicing). Los índices empiezan en 0 (el primer carácter es el índice 0).

len(cadena) — cuántos caracteres

len cuenta letras, números, espacios y símbolos: cada “unidad” visible cuenta como uno (en textos simples, un carácter).

str-len.py
PYTHON
1 usuario = "Ana"
2 clave = "hola123"
3 print(len(usuario)) # 3
4 print(len(clave)) # 7
5 print(len("")) # 0 cadena vacía

[0] y [-1] — primer y último carácter

Con corchetes accedés a una posición. [0] es siempre el primero. Los índices negativos cuentan desde el final: [-1] es el último, [-2] el anterior, y así.

str-indices.py
PYTHON
1 s = "Python"
2 print(s[0]) # 'P' primera letra
3 print(s[1]) # 'y' segunda
4 print(s[-1]) # 'n' última
5 print(s[-2]) # 'o' penúltima
6
7 # Ojo: si el string está vacío, s[0] da error (no hay posición 0)

[:3] — las primeras tres letras (o las que indiques)

La notación inicio:fin en corchetes devuelve un tramo: desde inicio hasta antes de fin. Si omitís el inicio, empieza en 0. Por eso [:3] son los índices 0, 1 y 2 (tres caracteres).

str-slice-inicio.py
PYTHON
1 codigo = "PY-4821"
2 prefijo = codigo[:2] # 'PY' (posiciones 0 y 1)
3 tres = codigo[:3] # 'PY-' primeros tres
4
5 nick = "superuser"
6 print(nick[:5]) # 'super' primeros cinco

[2:len(variable)] — del índice 2 hasta el final

El segundo número del slicing es exclusivo: variable[2:len(variable)] toma desde el índice 2 hasta el último carácter incluido, porque len(variable) apunta “una posición después del último”, que es cómo Python cierra el tramo. Es equivalente a escribir variable[2:] (omitir el fin = hasta el final), pero usar len deja explícito que estás pensando en “desde 2 hasta la longitud total”.

str-slice-len.py
PYTHON
1 variable = "Python"
2 # Desde el índice 2 hasta el final (mismas letras que variable[2:])
3 print(variable[2:len(variable)]) # 'thon'
4
5 # Otro ejemplo: quitar los dos primeros símbolos de un código
6 sku = "AB-999"
7 resto = sku[2:len(sku)] # '-999'
8
9 # Combinando: todo menos el primero y el último (índice 1 hasta len-1)
10 palabra = "abcdef"
11 print(palabra[1:len(palabra) - 1]) # 'bcde' (sin 'a' ni 'f')

Cadenas (str): métodos que vas a usar todo el tiempo

Los textos en Python son objetos de tipo str. No “propiedades para setear” como en otros lenguajes: en general usás métodos que devuelven un texto nuevo (las cadenas son inmutables).

upper(), lower(), capitalize() y title()

upper() y lower() cambian todo el texto. capitalize() deja en mayúscula solo la primera letra del string y el resto en minúsculas (ideal para un nombre solo o una frase corta). title() hace eso en cada palabra separada por espacios.

str-mayusculas.py
PYTHON
1 t = "Café y Código"
2 print(t.upper()) # CAFÉ Y CÓDIGO
3 print(t.lower()) # café y código
4 print(t.title()) # Café Y Código (cada palabra con mayúscula inicial)
5
6 raw = "bEnJaMín"
7 print(raw.capitalize()) # 'Benjamín' primera mayúscula, resto minúsculas
8
9 # Comparar sin importar mayúsculas (muy común)
10 respuesta = "SÍ"
11 if respuesta.lower() == "sí":
12 print("Ok")

strip(), lstrip(), rstrip() — sacar espacios

Ideal para limpiar lo que escribe el usuario (espacios al inicio o al final).

str-strip.py
PYTHON
1 s = " hola "
2 print(s.strip()) # "hola"
3
4 # Podés indicar qué caracteres quitar (no solo espacios)
5 codigo = "...123..."
6 print(codigo.strip(".")) # "123"

split() y join() — trocear y unir

str-split-join.py
PYTHON
1 csv = "ana,lucas,diego"
2 nombres = csv.split(",")
3 print(nombres) # ['ana', 'lucas', 'diego']
4
5 # join: el string "pegamento" une una lista de strings
6 frase = " | ".join(nombres)
7 print(frase) # ana | lucas | diego

replace(), startswith(), endswith()

str-replace-start.py
PYTHON
1 url = "http://ejemplo.com"
2 print(url.replace("http://", "https://"))
3
4 archivo = "foto.PNG"
5 print(archivo.lower().endswith(".png")) # True (normalizamos antes)

find(), count(), in

str-buscar.py
PYTHON
1 texto = "python es python"
2 print(texto.find("py")) # 0 (índice de la primera aparición, o -1 si no está)
3 print(texto.count("py")) # 2
4 print("es" in texto) # True

¿Es un número en texto? isdigit() y amigos

isdigit() sirve para saber si todos los caracteres son dígitos (ojo: no valida floats con punto; para eso hay otras estrategias).

str-isdigit.py
PYTHON
1 print("123".isdigit()) # True
2 print("12.3".isdigit()) # False (el punto no cuenta como dígito)
3
4 entrada = input("Edad: ").strip()
5 if entrada.isdigit():
6 edad = int(entrada)
7 print("Edad numérica:", edad)
8 else:
9 print("Eso no parece un entero.")

💻 Misión: normalizar un comando

Pedí al usuario una palabra. Mostrá en pantalla la misma palabra en minúsculas, sin espacios alrededor, y decí con True/False si empieza con la letra "p" (después de normalizar).

👁️ Ver solución sugerida
Python
PYTHON
1 raw = input("Palabra: ")
2 s = raw.strip().lower()
3 print("Normalizada:", s)
4 print("¿Empieza con 'p'?", s.startswith("p"))

Práctica: correo corporativo @cafeycodigo.org

En todos los casos el correo institucional sigue la misma regla: 3 primeras letras del nombre + 2 últimas del apellido + . + año de nacimiento + @cafeycodigo.org (sin espacios). También pedís correo personal y edad como parte del enunciado (aunque en algún ejercicio el año nazca de otra forma).

💻 1. Ficha de ingreso

Solicitá nombre, apellido, correo personal y edad (entero). Calculá el año de nacimiento como año actual − edad usando datetime.date.today().year. Armá el correo corporativo con la regla de arriba (normalizá nombre y apellido en minúsculas y sin espacios al inicio/fin). Mostrá el correo personal y el corporativo en dos líneas claras.

👁️ Ver solución sugerida
correo-ficha.py
PYTHON
1 from datetime import date
2
3 nombre = input("Nombre: ").strip().lower()
4 apellido = input("Apellido: ").strip().lower()
5 correo_personal = input("Correo personal: ").strip()
6 edad = int(input("Edad: ").strip())
7
8 anio_nac = date.today().year - edad
9 usuario = f"{nombre[:3]}{apellido[-2:]}.{anio_nac}"
10 correo_corp = usuario + "@cafeycodigo.org"
11
12 print("Correo personal:", correo_personal)
13 print("Correo corporativo:", correo_corp)

💻 2. Validá la edad antes de convertir

Mismos datos que el ejercicio 1. Antes de hacer int(edad), leé la edad como texto y comprobá con isdigit(). Si no es un entero válido, mostrá un mensaje de error y no generes el correo. Si es válido, calculá el año de nacimiento y el correo corporativo con la misma regla (nombre/apellido en minúsculas).

👁️ Ver solución sugerida
correo-validar-edad.py
PYTHON
1 from datetime import date
2
3 nombre = input("Nombre: ").strip().lower()
4 apellido = input("Apellido: ").strip().lower()
5 correo_personal = input("Correo personal: ").strip()
6 edad_txt = input("Edad: ").strip()
7
8 if not edad_txt.isdigit():
9 print("Error: la edad debe ser un número entero (solo dígitos).")
10 else:
11 edad = int(edad_txt)
12 anio_nac = date.today().year - edad
13 correo_corp = f"{nombre[:3]}{apellido[-2:]}.{anio_nac}@cafeycodigo.org"
14 print("Correo personal:", correo_personal)
15 print("Correo corporativo:", correo_corp)

💻 3. Año de nacimiento explícito

Pedí nombre, apellido, correo personal, edad y además el año de nacimiento en cuatro dígitos (por ejemplo 2008). Para el correo corporativo usá ese año ingresado, no el calculado desde la edad (así practicás otro int()). Al final mostrá una línea que diga si la edad coincide aproximadamente con el año (opcional: compará date.today().year - edad con el año ingresado).

👁️ Ver solución sugerida
correo-anio-explicito.py
PYTHON
1 from datetime import date
2
3 nombre = input("Nombre: ").strip().lower()
4 apellido = input("Apellido: ").strip().lower()
5 correo_personal = input("Correo personal: ").strip()
6 edad = int(input("Edad: ").strip())
7 anio_nac = int(input("Año de nacimiento (aaaa): ").strip())
8
9 correo_corp = f"{nombre[:3]}{apellido[-2:]}.{anio_nac}@cafeycodigo.org"
10 print("Correo personal:", correo_personal)
11 print("Correo corporativo:", correo_corp)
12
13 calculado = date.today().year - edad
14 print("¿Coincide el año con la edad?", calculado == anio_nac)

💻 4. Nombre compuesto: solo la primera palabra

Pedí los mismos cuatro datos. Si el usuario escribe un nombre compuesto (ej. "María Laura"), tomá solo la primera palabra para las tres letras iniciales (usá split()). El apellido sigue entero para las dos últimas letras. El año de nacimiento sale de año actual − edad. Mostrá el correo corporativo con f"...".

👁️ Ver solución sugerida
correo-nombre-compuesto.py
PYTHON
1 from datetime import date
2
3 nombre_raw = input("Nombre: ").strip().lower()
4 apellido = input("Apellido: ").strip().lower()
5 correo_personal = input("Correo personal: ").strip()
6 edad = int(input("Edad: ").strip())
7
8 primer_nombre = nombre_raw.split()[0]
9 anio_nac = date.today().year - edad
10 correo_corp = f"{primer_nombre[:3]}{apellido[-2:]}.{anio_nac}@cafeycodigo.org"
11
12 print("Correo personal:", correo_personal)
13 print("Correo corporativo:", correo_corp)

💻 5. Comprobá el correo personal

Pedí nombre, apellido, correo personal y edad. Generá el correo corporativo como en el ejercicio 1. Además, sin usar regex avanzada, indicá con True/False si el correo personal contiene el carácter @ y si termina en .org, .com o .edu (usá in y endswith() en minúsculas). Mostrá el corporativo y esas dos comprobaciones.

👁️ Ver solución sugerida
correo-comprobar-personal.py
PYTHON
1 from datetime import date
2
3 nombre = input("Nombre: ").strip().lower()
4 apellido = input("Apellido: ").strip().lower()
5 correo_personal = input("Correo personal: ").strip()
6 edad = int(input("Edad: ").strip())
7
8 anio_nac = date.today().year - edad
9 correo_corp = f"{nombre[:3]}{apellido[-2:]}.{anio_nac}@cafeycodigo.org"
10
11 cp = correo_personal.lower()
12 tiene_arroba = "@" in cp
13 termina_ok = cp.endswith(".org") or cp.endswith(".com") or cp.endswith(".edu")
14
15 print("Correo corporativo:", correo_corp)
16 print("¿Tiene @?", tiene_arroba)
17 print("¿Termina en .org, .com o .edu?", termina_ok)

Prueba rápida

Dato curioso: Primera versión pública en 1991; Guido van Rossum. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.