Apariencia
🅰️ 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| Concepto | Qué 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 |
| Cuerpo | El 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| Escribes | Qué pasa |
|---|---|
command=registrar ✅ | Le 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=funciony nocommand=funcion()? Porquecommandespera un callback (algo que se ejecuta después).funciones 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}")| Palabra | Qué 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.0 | cualquier número distinto de 0 |
[], {}, () (colecciones vacías) | colecciones con elementos |
None, False | True |
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: unCTkEntryvací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 aTrue/False: los "vacíos/cero/None" son falsos, el resto verdaderos.not valorinvierte 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| Forma | Ejemplo | Nota |
|---|---|---|
| f-string ✅ | f"Hola {nombre}" | Legible, la variable va dentro del texto |
Concatenar con + | "Hola " + nombre | Má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ón | Qué hace | Ejemplo |
|---|---|---|
lista.append(x) | Agrega x al final | tareas.append("Leer") |
lista.remove(x) | Borra la primera aparición del valor x | tareas.remove("Leer") |
len(lista) | Cuántos elementos tiene | len(tareas) → 3 |
for x in lista: | Recorre la lista elemento por elemento | dibujar 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, lanzaValueError.
🧪 Tip de entrevista: ¿Diferencia entre
appendyremove?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 ÚLTIMAComo 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 suyoEl t=tarea guarda el valor de esa vuelta del bucle en el momento de crear la lambda.
🧪 Tip de entrevista: ¿Por qué en un
fortodas 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ónlambda x=valor: ...(argumento por defecto) captura el valor actual. → usado en el Ejercicio 2.
🔗 Relacionado
- Aplicación práctica de estos conceptos → 05-CustomTkinter
- Ejercicios donde los usaste → 01-formulario-registro, 02-lista-tareas