streakode

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. 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 += 1 Se arregla con global 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. 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. 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. 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. 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. 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. 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 con except 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. 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. 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. 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. 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. 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.

Preguntas de entrevista de otras rutas

Ver todos los ejercicios de Python