Saltar al contenido principal

10 preguntas de entrevista para candidatos a desarrolladores Python

ImageImage
Armin_Felahatpisheh.jpg
autorIngeniero de Software, EPAM Anywhere

Python es uno de los lenguajes de programación con más demanda en la actualidad, por lo que las preguntas de entrevista para desarrolladores Python están entre las más frecuentes a la hora de solicitar trabajos remotos de desarrollador Python. El lenguaje Python es fácil de aprender, cuenta con una gran comunidad de programadores y desarrolladores y se utiliza en muchos campos, como la ingeniería de software, automatización de pruebas, aprendizaje automatizado/machine learning, ingeniería de back-end y web scraping.

A continuación, puedes encontrar algunas de las preguntas y respuestas más frecuentes e importantes para la entrevista de desarrollador Python. Recuerda que estas preguntas son para Python Core y no tienen en cuenta otros aspectos, plataformas, métodos, beneficios, casos, problemas o habilidades de desarrollo de aplicaciones (puedes consultarlas en nuestra guía de preguntas para entrevista de candidatos a ingeniero de software).

1. ¿Cuáles serían las claves de un diccionario en Python?

Al responder a esta pregunta de la entrevista, un candidato a desarrollador junior de Python podría responder: Ninguna, cadenas o números. Un programador o desarrollador de nivel medio puede mencionar booleanos, tuplas o cualquier objeto de propiedad inmutable. Sin embargo, se espera que un desarrollador senior de Python responda que cualquier objeto hasheable pueda ser la clave de un diccionario.

Cualquier objeto hasheable es inmutable. Por ejemplo, el código que se ve abajo es correcto, ya que esta tupla y todos sus elementos son hasheables. Te rogamos tener en cuenta que los conjuntos, diccionarios y listas no son hasheables, por lo que no pueden ser las claves de un diccionario.

2. ¿Qué es CPython?

Python es un lenguaje interpretable. Su código es interpretado primero por otro programa (intérprete) y luego compilado en el llamado bytecode. El bytecode está hecho de bytes que representan las instrucciones de la máquina. CPython es la implementación de Python cuyo bytecode está en el lenguaje de programación C.

Por otro lado, tenemos Jython, cuyo bytecode está en Java u otras implementaciones de Python.

También existe algo llamado Cython, que es el lenguaje compilado utilizado para crear extensiones CPython. El lenguaje Cython es un superset o conjunto de Python que soporta varias características del lenguaje de programación C.

encuentra tu trabajo ideal
Solo envíanos tu CV y nuestros reclutadores te contactarán con una opción a la medida
aplica ahora
icono de lupa

3. ¿Qué es LEGB en Python?

Este es un ejemplo de preguntas de entrevista para desarrolladores senior de Python relacionadas con el método de scoping. Cuando el intérprete de Python intenta hacer un lookup/buscar un nombre, utiliza la regla LEGB para resolver los nombres (nombres de variables, funciones y otros objetos). Primero comprueba la existencia de nombres en los ámbitos L, E, G y B, en el siguiente orden:

  • Local Scope/Ámbito local: El ámbito dentro del cuerpo de una función o de una expresión lambda.
  • Enclosing Scope/Ámbito de aplicación adjunto: Supongamos que tenemos una función llamada outer o externa que tiene una función anidada. El ámbito de aplicación adjunto (o ámbito no local) es el área dentro del cuerpo de la función externa.
  • Global scope/Ámbito global: Los nombres dentro de este ámbito son visibles en todo el código de un script de Python (en un archivo que tenga una extensión .py).
  • Built-in Scope/Ámbito integrado: Los nombres que existen en este ámbito, se cargan cuando ejecutamos un shell o script de Python. Algunos ejemplos de palabras clave como in, and, or, def, class y expresiones como __main__, __file__, etcétera.

4. ¿Cuáles son los usos de palabras clave no locales y globales en Python?

Esta pregunta de entrevista tiene relación directa con la anterior. El siguiente ejemplo de código ilustra el uso de estas dos palabras clave:

5. ¿Qué es el GIL y cuál es su importancia?

GIL es una de las características más controversiales e importantes de la implementación de Python basada en CPython. GIL, o Global Interpreter Lock, es un constructo/herramienta que se asegura que un programa Python pueda ser ejecutado por sólo un hilo a la vez. En otras palabras, este bloqueo pertenece al programa Python, que funge como intérprete y lo utiliza para bloquear un hilo.

Por ejemplo, el hilo T1 obtiene GIL y hace su trabajo. Mientras el intérprete de Python está usando GIL para reservar acceso solamente a T1, todos los demás hilos tienen que esperar. Después de que T1 termina, libera el GIL y lo pasa a otro hilo T2 que lo necesite para reanudar el proceso con él. El motivo de la presencia de GIL es hacer que CPython sea de hilo seguro (thread-safe) e impedir que algunos hilos interfieran entre sí.

6. ¿Cómo implementa Python la gestión de memoria?

Antes de responder a preguntas de entrevista para programador Python como ésta, debes comprender que estamos hablando de la implementación de CPython. Otras implementaciones de Python pueden tener reglas, métodos y requisitos diferentes para la gestión de memoria.

Supongamos que tienes un script de Python y quieres ejecutarlo. Cuando ejecutas este archivo, el intérprete de Python ocupa cierta "área" de la RAM. Esta "área" se divide en dos categorías: la pila/stack y el heap privado.

Ahora supongamos que en este script hemos declarado un objeto string a = "hello". Cuando ejecutamos este script, el sistema de gestión de memoria de CPython crea un objeto tipo string en el heap privado. Este objeto contiene tres campos:

  • Type/tipo: Se trata de una cadena (ten en cuenta que Python es un lenguaje de programación de tipeado dinámico, por lo que entenderá el tipo de objeto que le pides almacenar).
  • Value/valor: Este es/This is “hello”.
  • Conteo de referencia: Muestra el número de veces que se ha hecho referencia a "a". Por ahora, es 1.

Ahora, en el stack, se guarda la referencia a "a" (almacenada en el heap privado) Existe una herramienta llamada recolector de basura. En la práctica, el trabajo del recolector de basura es borrar los objetos (del heap privado) que ya no son referenciados, es decir, elimina objetos cuyo conteo de referencia alcanzó el valor “cero”. De esta forma, el recolector de basura ofrece el beneficio de liberar algo de espacio de memoria para uso del intérprete de Python.

7. ¿Dónde deberíamos utilizar las bibliotecas multithreading, multiprocessing y asyncio de Python?

Para responder a esta pregunta, necesitamos algunos conocimientos prácticos previos. Dividimos las operaciones que queremos que nuestro código Python realice, en dos categorías:

  • Operaciones limitadas a la CPU como el parsing/análisis sintáctico, el procesamiento de imágenes, la manipulación de cadenas y algoritmos involucrados en cálculos pesados o de alta carga. Podemos utilizar el paralelismo para este tipo de operaciones. Básicamente, la programación paralela es cuando creamos diferentes procesos para dividir un trabajo entre ellos, y todos hacen el trabajo simultáneamente. Cada proceso tiene su propio GIL, intérprete de Python, espacio de memoria e información de estado. En Python, utilizamos la biblioteca de multiprocesamiento para lograr el paralelismo.
  • Operaciones IO-bound como enviar solicitudes HTTP, consultar datos de bases de datos, enviar correos electrónicos y abrir un archivo. Utilizamos la concurrencia para estas operaciones. En Python, podemos manejar estas operaciones utilizando las bibliotecas multithreading y asyncio. Ten en cuenta que el paralelismo requiere más recursos que la concurrencia.

8. ¿Cómo funciona la importación en Python?

Para responder a esta pregunta de entrevista para desarrolladores Python, supongamos que tenemos un directorio llamado dir dentro del cual tenemos un script de Python. Cuando importas un módulo en este script de Python, el intérprete de Python intenta encontrar el módulo que has importado en este orden:

  • Busca entre otros scripts Python dentro de la carpeta del directorio dir.
  • A continuación, repasa la lista de los directorios que están modelados o configurados mediante la variable de entorno PYTHONPATH.
  • Por último, busca en los directorios predeterminados donde se instalaron los archivos de Python. Por ejemplo: 'C:\Users\\user\AppData\Local\Programs\Python\Python311\Lib'.

9. ¿Qué es un closure/cierre en Python?

Un cierre es una función interna/anidada que conserva los datos relativos a su ámbito de aplicación adjunto, incluso después de que se llame al cierre. Para ilustrar tu respuesta a esta pregunta de entrevista, puedes proporcionar este escenario para el uso de cierres en la evaluación perezosa:

10. ¿Cómo escribes código escalable en Python?

Esta es una de las preguntas más avanzadas y de más alto impacto en la entrevista senior de Python. "Escalabilidad" significa crear servicios y microservicios que puedan administrar millones de usuarios (grandes cargas) sin interrumpirse o caerse. Este es un reto que debe ser manejado adecuadamente, con responsabilidad, y escribir código escalable es una manera de hacer que nuestro servicio tenga buena escalabilidad.

Ten en cuenta que debemos considerar muchos otros componentes de la creación de un proyecto escalable, como el diseño de sistemas, DBMS/SGBD y la infraestructura.

A continuación, puedes encontrar algunos conceptos de escritura de código escalable para Python Core que puedes incluir en tu respuesta a esta pregunta de entrevista.

Utilizar estructuras de datos eficientes. Por ejemplo, la complejidad temporal del operador "in", es diferente dependiendo de en qué elemento iterable se haya utilizado.

  • En lista/tupla 🡪 O(n) complejidad de tiempo.
  • En diccionario/set 🡪 O(1) es el caso promedio, y O(n) el peor caso.

En los ejemplos anteriores, n es la longitud del elemento iterable.

Utilice el paralelismo. Dividir y ejecutar una operación limitada por la CPU, utilizando diferentes procesos, puede ser una solución para impulsar la velocidad.

Diseñar un sistema distribuido. En un sistema distribuido, hay diferentes máquinas que se comunican entre sí para realizar un trabajo. El uso de bibliotecas como Apache Spark o Ray puede ser un buen enfoque de escalabilidad.

Utiliza la caché. Supongamos que hay una imagen pesada/de alta carga que requiere procesamiento y esta imagen debe enviarse a muchos usuarios. Para cumplir estos requisitos, podemos procesar esta imagen una sola vez y almacenar en caché, dentro de una variable, la versión procesada. De esta forma, siempre que queramos echar mano de esta imagen procesada, podemos hacer uso de esa variable y evitar procesar la imagen de nuevo.

Armin_Felahatpisheh.jpg
autorIngeniero de Software, EPAM Anywhere