Preguntas de entrevista de Python con respuestas
En Python caen siempre las mismas trampas: ámbito y closures, diccionarios, excepciones y generadores. Estas preguntas son de nivel 2, las que tienen trampa, y cada una trae su explicación.
Piensa la respuesta antes de abrirla: la explicación dice por qué fallan las demás opciones. En Streakode tienes 33 preguntas como estas de Python, y un simulacro de 10 preguntas en 15 minutos, sin corrección hasta el final, para ver cómo irías en una entrevista de verdad.
12 preguntas de Python
Temas: Ámbito · Closures · Dataclasses · Diccionarios · Excepciones · f-strings · Ficheros · Generadores · Gestores de contexto · Operador morsa.
1 · Encuentra el fallo · nivel 2
Lanza UnboundLocalError. ¿Qué línea lo provoca?
1count = 02 3def increment():4 count += 15 6increment()7print(count)Ver la respuesta
El fallo está en la línea 4:
count += 1Se arregla conglobal count; count += 1.Asignar a count dentro de la función la convierte en variable local, y count += 1 intenta leerla antes de tener valor. Hay que declarar global count, aunque lo más limpio es devolver el valor nuevo.
2 · Completa el hueco · nivel 2
Completa para que add() modifique la variable count de fuera de la función.
count = 0 def add(): ___ count count += 1 add()print(count)- global
- nonlocal
- local
- static
Ver la respuesta
Respuesta: global
count = 0 def add(): global count count += 1 add()print(count)Sin declaración, count += 1 trata count como una variable local y falla. `global` indica que se refiere a la del módulo. `nonlocal` es para funciones anidadas y aquí no hay ninguna.
3 · Elige la respuesta · nivel 2
¿Qué imprime este código?
funcs = [lambda: i for i in range(3)]print([f() for f in funcs])- A[2, 2, 2]
- B[0, 1, 2]
- C[0, 0, 0]
- DNameError
Ver la respuesta
Respuesta: A. [2, 2, 2]
Las lambdas buscan i cuando se ejecutan, no cuando se crean, y para entonces el bucle ya terminó con i = 2. Para capturar el valor de cada vuelta: lambda i=i: i.
4 · Elige la respuesta · nivel 2
¿Qué imprime este código?
from dataclasses import dataclass @dataclassclass P: x: int y: int print(P(1, 2))- AP(x=1, y=2)
- BP(1, 2)
- C(1, 2)
- D<__main__.P object>
Ver la respuesta
Respuesta: A. P(x=1, y=2)
@dataclass genera por ti __init__, __repr__ y __eq__. El __repr__ generado muestra el nombre de la clase y cada campo con su nombre, algo que una clase normal no hace.
5 · Elige la respuesta · nivel 2
¿Qué imprime este código?
defaults = {"theme": "dark", "lang": "es"}user = {"lang": "en"}print(defaults | user)- A{'theme': 'dark', 'lang': 'en'}
- B{'theme': 'dark', 'lang': 'es'}
- C{'lang': 'en', 'theme': 'dark'}
- DTypeError
Ver la respuesta
Respuesta: A. {'theme': 'dark', 'lang': 'en'}
| une dos diccionarios en uno nuevo y, si una clave se repite, gana el de la derecha. Las claves conservan el orden del primero, así que theme sigue delante.
6 · Elige la respuesta · nivel 2
¿Qué imprime este código?
def f(): try: return "try" finally: print("finally") print(f())- Afinally try
- Btry finally
- Ctry
- Dfinally
Ver la respuesta
Respuesta: A. finally try
finally se ejecuta siempre antes de salir de la función, incluso con return. El valor "try" ya está decidido y se devuelve después, así que el print exterior va segundo.
7 · Encuentra el fallo · nivel 2
Debería imprimir 0 al dividir entre cero, pero el programa se detiene con un error. ¿Qué línea tiene el fallo?
1def divide(a, b):2 try:3 return a / b4 except ValueError:5 return 06 7print(divide(4, 0))Ver la respuesta
El fallo está en la línea 4:
except ValueError:Se arregla conexcept ZeroDivisionError:.Dividir entre cero lanza ZeroDivisionError, no ValueError. Un except solo captura los errores de su tipo (o de sus subclases): hay que nombrar el que realmente puede ocurrir.
8 · Elige la respuesta · nivel 2
¿Qué imprime este código?
user = "ana"print(f"{user=}")- Auser='ana'
- Bana
- Cuser=ana
- D{user=}
Ver la respuesta
Respuesta: A. user='ana'
El especificador = de las f-strings imprime la expresión, un igual y su repr(). Por eso aparecen las comillas.
9 · Elige la respuesta · nivel 2
¿Qué imprime este código?
with open("datos.txt", "w") as f: f.write("uno") print(f.closed)- ATrue
- BFalse
- Cuno
- DError: f ya no existe
Ver la respuesta
Respuesta: A. True
Al salir del bloque with el fichero se cierra solo, aunque haya habido un error dentro. La variable f sigue existiendo, pero apunta a un fichero cerrado.
10 · Completa el hueco · nivel 2
Completa el generador de cuenta atrás y conviértelo en lista.
def countdown(n): while n > 0: ___ n n -= 1 print(___(countdown(3)))- yield
- return
- list
- next
- await
- iter
Ver la respuesta
Respuesta: yield · list
def countdown(n): while n > 0: yield n n -= 1 print(list(countdown(3)))yield entrega un valor y pausa la función hasta que se pida el siguiente. Con return saldría a la primera. list() recorre el generador entero y guarda los valores.
11 · Elige la respuesta · nivel 2
¿Qué imprime este código?
class Caja: def __enter__(self): print("abro") return self def __exit__(self, *args): print("cierro") with Caja(): print("dentro")- Aabro dentro cierro
- Bdentro abro cierro
- Cabro cierro dentro
- Dabro dentro
Ver la respuesta
Respuesta: A. abro dentro cierro
with llama a __enter__ al entrar, ejecuta el bloque y llama a __exit__ al salir, pase lo que pase. Esa garantía es lo que lo hace útil para ficheros, conexiones o bloqueos.
12 · Elige la respuesta · nivel 2
¿Qué imprime este código?
data = [3, 8, 1, 9]if (n := len(data)) > 3: print(f"{n} elementos")- A4 elementos
- B3 elementos
- CSyntaxError
- DNo imprime nada
Ver la respuesta
Respuesta: A. 4 elementos
:= asigna y devuelve el valor en la misma expresión: n vale 4 y la comparación 4 > 3 es cierta. Los paréntesis son necesarios para que n no reciba el resultado de la comparación.