Skip to content

🅰️ Conceptos — Python

Ideas y teoría del lenguaje explicadas con mis propias palabras.

📦 Variables

Una variable es un nombre que apunta a un valor guardado en memoria. En Python no se declara el tipo: se crea al asignarle algo con =, y el mismo nombre puede cambiar de valor.

python
nombre = "Styp"      # texto (str)
edad = 30            # número entero (int)
activo = True        # booleano (True / False)

💡 En Python = asigna (guarda un valor en una variable), mientras que ==compara (pregunta si dos cosas son iguales). Confundirlos es un error clásico.

🔧 Funciones (def)

Una función es un bloque de código con nombre que se ejecuta solo cuando la llamas. Sirve para no repetir código y para darle nombre a una tarea.

python
def registrar():                 # se DEFINE con def (aún no se ejecuta)
    nombre = entrada_nombre.get()
    print(nombre)

registrar()                      # se LLAMA con paréntesis → ahora sí se ejecuta
ConceptoQué es
Definir (def nombre():)Crear la función. El código de adentro no corre todavía
Llamar (nombre())Ejecutar la función. Los () son los que la disparan
CuerpoEl bloque indentado debajo del def (Python usa la indentación, no {})

⚠️ La indentación importa en Python: lo que está dentro de la función va sangrado (4 espacios). Si desindentas, esa línea ya "sale" de la función.

🔍 Callbacks — pasar una función como command

Un callback es una función que le entregas a otra parte del programa para que la ejecute más tarde (por ejemplo, cuando el usuario hace clic). En customtkinter esto es el command de un botón:

python
ctk.CTkButton(ventana, text="Registrar", command=registrar)   # SIN paréntesis
EscribesQué pasa
command=registrarLe pasas la función misma (referencia). Se ejecuta al hacer clic
command=registrar()La ejecutas ya al construir el botón, y le pasas su resultado (None)

🧪 Tip de entrevista: ¿Por qué command=funcion y no command=funcion()? Porque command espera un callback (algo que se ejecuta después). funcion es la función; funcion() ya es el resultado de haberla ejecutado. → ver 05-CustomTkinter.

🔀 Condicionales (if / else)

Ejecutan un bloque solo si se cumple una condición. Sirven para tomar decisiones.

python
if not nombre:                          # si el nombre está vacío...
    label_estado.configure(text="Completa el campo")
else:                                   # si no...
    label_estado.configure(text=f"Registrado: {nombre}")
PalabraQué hace
if <condición>:Ejecuta su bloque si la condición es verdadera
elif <otra>:"Si no, pero...": prueba otra condición (opcional)
else:Se ejecuta si ninguna condición anterior se cumplió (opcional)

✅ Verdad y falsedad de los valores (truthy / falsy)

En Python, cualquier valor se puede evaluar como verdadero o falso dentro de un if, no solo True/False. Los valores "vacíos" cuentan como falsos.

Se considera falso (falsy)Se considera verdadero (truthy)
"" (string vacío)"algo" (texto con contenido)
0, 0.0cualquier número distinto de 0
[], {}, () (colecciones vacías)colecciones con elementos
None, FalseTrue
python
if not nombre:        # equivale a "si nombre está vacío"
    ...

💡 Por eso en el formulario if not nombre or not correo or not edad: detecta si algún campo quedó en blanco: un CTkEntry vacío devuelve "", que es falsy. → usado en el Ejercicio 1.

🧪 Tip de entrevista: ¿Qué es truthy/falsy? Que en un contexto booleano (como un if), Python convierte cualquier valor a True/False: los "vacíos/cero/None" son falsos, el resto verdaderos. not valor invierte ese resultado.

🧵 f-strings (texto con variables adentro)

Un f-string es un texto con una f delante que permite insertar variables entre llaves {}. Es la forma moderna y legible de armar mensajes.

python
nombre = "Styp"
edad = 30
print(f"Registrado: {nombre}, {edad} años")   # → Registrado: Styp, 30 años
FormaEjemploNota
f-string ✅f"Hola {nombre}"Legible, la variable va dentro del texto
Concatenar con +"Hola " + nombreMás verboso; falla si mezclas texto y números

💡 Dentro de las {} puedes poner variables e incluso operaciones: f"{len(tareas)} tarea(s)".

📋 Listas ([]) — guardar varias cosas en una variable

Una lista es una colección ordenada de valores que viven en una sola variable. Es la forma más común de "guardar muchas cosas" en memoria mientras la app está abierta. Se crea con corchetes [] y puede crecer o encogerse en cualquier momento.

python
tareas = []                      # lista vacía
tareas.append("Comprar pan")     # agrega al FINAL           → ['Comprar pan']
tareas.append("Estudiar Python") # otra más                  → ['Comprar pan', 'Estudiar Python']
print(len(tareas))               # cuántos elementos hay     → 2
tareas.remove("Comprar pan")     # borra por valor           → ['Estudiar Python']

for tarea in tareas:             # recorrer una por una
    print(tarea)
OperaciónQué haceEjemplo
lista.append(x)Agrega x al finaltareas.append("Leer")
lista.remove(x)Borra la primera aparición del valor xtareas.remove("Leer")
len(lista)Cuántos elementos tienelen(tareas)3
for x in lista:Recorre la lista elemento por elementodibujar cada tarea
lista[0]Accede por posición (empieza en 0)tareas[0] = el primero

💡 La idea clave del Ejercicio 2: la lista es la "verdad" de la app y la pantalla solo la refleja. Cada vez que cambia la lista (agregas/borras), se vuelve a dibujar todo desde ella. Así no tienes que sincronizar la pantalla a mano. → ver el patrón en 05-CustomTkinter.

⚠️ remove(x) borra por valor, no por posición, y solo la primera coincidencia. Si hay dos tareas con el mismo texto, borra la primera. Si el valor no existe, lanza ValueError.

🧪 Tip de entrevista: ¿Diferencia entre append y remove? append(x) agrega al final (crece la lista); remove(x) busca ese valor y lo elimina. Ninguno devuelve la lista: la modifican en el sitio (mutan la lista original).

🔒 Closures y late binding (el truco lambda t=tarea)

Una closure es una función que "recuerda" el entorno donde fue creada. En Python, las variables que usa una función se resuelven cuando la ejecutas, no cuando la defines (late binding). Esto causa un error clásico al crear botones dentro de un bucle:

python
for tarea in tareas:
    ctk.CTkButton(fila, text="✕", command=lambda: borrar(tarea))   # ❌ todos borran la ÚLTIMA

Como tarea se lee al hacer clic (cuando el for ya terminó), todos los botones ven el último valor. La solución es congelar el valor con un argumento por defecto:

python
for tarea in tareas:
    ctk.CTkButton(fila, text="✕", command=lambda t=tarea: borrar(t))   # ✅ cada uno el suyo

El t=tarea guarda el valor de esa vuelta del bucle en el momento de crear la lambda.

🧪 Tip de entrevista: ¿Por qué en un for todas las lambdas terminan usando el último valor? Por late binding: la variable se evalúa al llamar la función, no al definirla. El patrón lambda x=valor: ... (argumento por defecto) captura el valor actual. → usado en el Ejercicio 2.

🔗 Relacionado