Logotipo de Orbis Sapientia Elearning Services

Servicios de formación. Especialistas en E-learning.

19 tipos de preguntas que pueden aparecer en una entrevista de Python

El lenguaje, o uno de los lenguajes más usados. ¿Sabes Python? Lo tienes fácil para trabajar. Ahora bien, ¿trabajarás para tí o para otros? Si es lo segundo, estos “19 tipos de preguntas que pueden aparecer en una entrevista de Python” te ayudarán a superarla.

Ojo. Es obvio que debes conocer el lenguaje Python y tener experiencia programando con él; cuanta más mejor. Este artículo no pretende (ni mucho menos) sustituir ese conocimiento.

Sin embargo, llegada la hora de la entrevista, no está de más saber qué preguntan con más frecuencia. Ya sabéis: conoce a tu “enemigo”.

1. Conocimientos generales de programación

Está muy bien conocer un lenguaje de programación pero desde luego, si queremos trabajar con garantías, tanto si somos freelance como si no: tenemos que saber programar.

¿Una perogrullada? De eso nada. Conozco mucha gente (con toda la buena intención del mundo) que sabe sabe usar un lenguaje y no sabe programar.

Un ejemplo es la mala reputación que PHP ha tenido o tiene. Mucha gente lo aprendió entre otras cosas por la curva de aprendizaje tan pequeña que tiene y, se puso a crear aplicaciones web. O eso creían ellos. Resultado: aplicaciones con código spaguetti con múltiples fallos de seguridad, código sin optimizar y un muy largo pésimo etcétera. No había, hay, mala intención. Simplemente no sabían que hay que aprender unas bases que sustenten todo lo anterior.

Indirectamente, los clientes que veían sus aplicaciones realizadas de esta forma con PHP, asociaron que así era este lenguaje… Es evidente que no es así.

Debemos saber cómo se programa realmente, no sólo utilizar un lenguaje

Puedes comenzar con estas bases con nuestro curso de Introducción a la Programación.

Sabedores de lo anterior, la persona o cliente que te entreviste, si además tiene un perfil técnico, puede preguntarte por temas de programación genérica, no solamente exclusivas de Python.

¿Qué es la programación procedimental?¿O la programación funcional?

Pues ambas se basan en intentar repetir código en nuestros programas, englobando el código repetible en funciones o procedimientos.

La programación funcional da un paso más y permite lograr el objetivo sobre unos datos sin centrarse en hemos conseguido ese resultado. Queremos el qué, no el cómo. Y Python es muy bueno con esto.

Java. Iteración de un array de enteros

Python. Iteración de una lista como array

¿Por qué debes hacer tu código más legible?

La respuestas es simple: porque hacen la aplicación o programa más fácil de mantener.

O bien,

¿qué es la encapsulación? Defina la abstracción de datos.

En ambos casos, se trata de conocer la programación orientada a objetos o POO.

La encapsulación es un concepto fundamental en la POO. Permite ocultar cómo se hace algo para facilitar su uso y posterior escalabilidad.

Cuando vemos una película, la vemos y ya está, no nos importa cómo está hecha la TV, la computadora, móvil o tablet donde se visualiza. Es más, si después sacan otro modelo de TV, sigue mostrándonos la peli, aunque haya cambiado el modelo.

La abstracción de datos es representar de forma lógica las propiedades de algo en una determinada estructura (resumiendo mucho). Aquí tenéis algo bastante más completo:

2. ¿Qué es Python?¿Qué nos ofrece?¿Cuáles son sus características?

El título muestra algunas de las preguntas más recurrentes en una entrevista. Veamos:

  • Python es un lenguaje de programación interpretado y orientado a objetos, creado por Guido van Rossum.
    Como lenguaje interpretado necesita un intérprete que procese el código Python cada vez que se quiera ejecutar.
  • Es multiparadigma: orientado a objetos, funcional, procedimental, etc.
  • Es de propósito general. Se puede emplear para crear cualquier tipo de aplicación.
  • Es tipado dinámicamente.
¿Qué beneficios nos ofrece Python?

Código muy fácil de mantener, gestión de memoria automática, es portable entre sistemas y dinámico entre otras cosas.

¿En qué áreas se puede utilizar Python?

Como lenguaje de propósito general se puede emplear en cualquier área. Sin embargo, teniendo en cuenta sus ventajas y desventajas, es interesante su uso en:

  • Desarrollo web. Frameworks como Django son realmente buenos en la creación de aplicaciones web.
  • Apps o aplicaciones para dispositivos móviles.
  • Creación de APIs.
  • Juegos.
  • Aplicaciones científicas y computacionales. Se emplea generosamente y es prácticamente obligatorio su conocimiento en Data Science, Machine Learning, etc.
  • Desarrollo de aplicaciones empresariales y de negocios. Un exponente de esto es Odoo .
  • Procesamiento de imágenes.
  • Desarrollo de lenguajes.
  • Aplicaciones de escritorio en general.
  • Scripts y aplicaciones para sistemas.
¿Se puede compilar un programa Python?

Es interpretado, no compilado pero es posible compilar código Python mediante herramientas externas como Cython , Py2Exe , etc.

3. ¿Qué es PEP 8?

Python, cada cierto tiempo lanza un PEP. ¿Qué es un PEP? Pues PEP es un acrónimo para Python Enhancement Proposals​ (propuestas de mejora para Python).

Dentro de éstos, el llamado PEP 8 es muy importante porque es algo así como las reglas que ha de seguir todo programador de Python para que su código sea legible sobre todo. Si lo seguimos cumpliremos varias de las bases de la programación.

Puedes acceder al texto oficial aquí .

4. ¿Diferencias entre Python 2.x y Python 3.x?

Python 2.x

La instrucción print es un comando, no usa paréntesis: print “Hola”.

El resultado de dividir dos números enteros siempre es otro número entero aunque la división no sea exacta.

Las cadenas o strings no son Unicode por defecto.

La función input() convierte el dato recibido según el tipo del dato. Usa la función raw_input() para tratar como cadena el dato introducido.

La instrucción next puede funcionar como función next() o como método .next().

Si comparamos datos de tipo diferente se intenta realizar la comparación.

El lanzamiento de excepciones con raise se puede realizar como función y como sentencia.

Se dispone de las funciones range() y xrange().

Para iterar diccionarios contamos con las funciones iteritems() e items(). Adicionalmente contamos con itervalues() e iterkeys().

Python 3.x

La instrucción print es una función y usa paréntesis: print(“Hola”).

La división de dos números enteros puede devolver un flotante o float si la división no es exacta.

Las cadenas o strings son Unicode por defecto.

La función input() siempre devuelve una cadena. No existe la función raw_input() a partir de la versión 3.X de Python. La cadena devuelta se puede convertir a otros tipos.

La instrucción next solamente puede utilizarse como función: next().

Si comparamos datos de tipo diferente se lanzará un error.

El lanzamiento de excepciones con raise solamente se puede realizar como función: raise Exception(…).

Solamente disponemos de la función range(). Desaparece xrange().

Para iterar  diccionarios contamos con la función items() y adicionalmente con keys() y values(). Las no mencionadas desaparecen o no funcionan según lo esperado.

Respecto a las funciones range() y xrange() es posible que nos pregunten la diferencia entre ambas.

En Python 3.x es simple: range() sustituye en todo a xrange() y aumenta funcionalidades.

Sin embargo en Python 2.x se pueden usar ambas y existen diferencias entre ellas.

En primer lugar, en Python 2.x, range() devuelve una lista y xrange() una colección xrange. Como resultado, range() exige que se reserve memoria para todos los elementos de la lista y se rellene con todos los valores. En cambio, xrange() genera los valores bajo demanda. Cuando iteremos por los valores devueltos, se obtendrá un valor cada vez.

En consecuencia y resumiendo, xrange() en principio exigirá menos recursos. Al ser un comportamiento más deseado, en Python 3.x, desaparece xrange() y range() toma su comportamiento y el valor devuelto ya no será xrange ni list, sino range.

range()

5. Conocimientos esenciales de Python

Incluiremos en esta área cualquier pregunta sobre temas esenciales del lenguaje Python.

Si estamos a punto de recibir una entrevista sobre Python, éste área debería ser el menor de nuestros problemas. Ejemplos:

¿Cómo se ejecuta un script Python?

Pues llamamos al intérprete Python para, seguidamente, indicar el script:

python scriptdepython.py

Hecho esto, el intérprete de Python, procesará el código fuente del script y lo interpretará para ejecutarlo.

¿Qué diferencia un fichero con extensión .PY de uno con extensión .PYC?

Los archivos .PY son los que contienen el código fuente de un script Python.

Los archivos .PYC se crean cuando el intérprete de Python proceso un fichero .PY y genera un código byte, compilado. Desde ese momento, Python usará el fichero compilado, ya interpretado en vez del original. Por supuesto, se volverá a repetir el proceso cada vez que se cambie el código fuente. Como resultado, la velocidad de ejecución del script, aumentará.

¿Es obligatoria la indentación de código en Python?

Si, absolutamente, además de recomendable por legibilidad.

¿Se distingue entre mayúsculas y minúsculas (casesensitive)?

Totalmente: sí.

¿Cuántas palabras clave (keywords) tiene Python?¿Por qué debemos conocerlas?

Dependerá de la versión del interprete instalado pero rondan las 33. Una forma fácil de saber cuántas y cuáles son es usando este script Python:

Como resultado aparecerá algo como:

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'd
el', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', '
nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

Debemos conocerlas porque conforman el vocabulario del lenguaje Python.

¿Cómo se escriben comentarios en Python?

Anteponiendo el carácter # en cada línea:

# Ejemplo de comentario.

Defina el uso de la funciones help() y dir()

Sirven para buscar o entrar en modo ayuda sobre instrucciones Python y para mostrar todas las propiedades y métodos de un objeto, respectivamente.

¿Para qué sirve del?¿Qué lo diferencia de clear()?

Con la declaración del, borramos cualquier tipo de objeto u objetos. De hecho, su uso es sumamente flexible, combinándolo con diferentes expresiones.

En cambio, el método .clear() es propio de las estructuras o colecciones de datos para dejarlas sin elementos, vaciarlas.

En la función print(), ¿qué efecto tiene el parámetro end?

Si vas a acudir a una entrevista para un trabajo con Python, conocer la función print() es lo mínimo que ya debes saber: que print() imprime el valor que recibe de muy diferentes formas como parámetro en una línea. Cada vez que se usa print(), se imprime una nueva línea.

Lo que quizá no sabes es que podemos cambiar este comportamiento. Si usamos además el parámetro end y le asignamos un valor, usará ese valor al final de la línea:

¿Cómo se gestiona la memoria en Python?

Resumiendo, se gestiona de forma automática mediante un “garbage colector” o recolector de basura.

No tenemos control como tal sobre los objetos que se crean en nuestros desarrollos pero debemos saber que:

Un objeto existe mientras exista una referencia que lo enlace.

El recolector de basura se encargará incluso de objetos con referencias circulares. Finalmente, mencionar que si podemos utilizar el módulo gc para darnos un poco de control sobre este asunto. Sin embargo, ojo. Debemos tener muy claro que vamos a hacer.

Por supuesto es un tema amplio que debería recibir un estudio más profundo.

¿En qué se diferencian las variables locales de las globales?

Resumiendo: las variables locales son las definidas dentro de una función.

Las variables globales son las definidas fuera de una función.

Háblenos sobre las variables de entorno.

Python puede acceder a las variables de entorno del sistema mediante el módulo os y el diccionario environ que provee:

Por otro lado, Python provee de varias variables de entorno propias que pueden leerse y establecerse:

VariableDescripción
PYTHONPATHAlmacena o establece los lugares desde donde el intérprete de Python puede importar (import) módulos
PYTHONSTARTUPIndica o establece la ruta a un script de Python que se ejecutará cada vez que el intérprete de Python se inicialice.
PYTHONCASEOKÚtil únicamente en Windows y OSX, indica en los imports que no se tengan en cuenta mayúsculas o minúsculas.
PYTHONHOMEModifica la localización de las librerías estándar de Python.

Existen muchas más variables de entorno propias de Python. Indico las más usuales. Si queremos saber más:

https://docs.python.org/3/using/cmdline.html

¿Para qué nos sirve assert?

Esencialmente,  nos sirve para controlar errores en la codificación y realizar tests.

Para usar assert establecemos una condición que de no complirse, lanzará una excepción.

6. Los datos en Python

Se trata de una de las áreas sobre la que más preguntan y en concreto, las cuestiones más usuales son:

¿Qué significa que Python sea tipado dinámicamente?

Significa que las variables toman el mismo tipo de dato que el valor que contienen. No se declara el tipo de la variable al principio y a partir de ahí ya no puede ser cambiado como ocurre con Java, por ejemplo.

¿Dispone Python de tipos de datos primitivos?¿Cuáles?

No existen los clásicos tipos de datos primitivos de otros lenguajes aunque sí los llamados “built-ins”:

  • Enteros o int.
  • Reales o float.
  • Complejos o complex.
  • Lógicos o bool.
  • Nulos o None.
  • Cadenas o str.
¿Qué son tipos de datos mutables e inmutables?

Esto es fácil. Los tipos de datos mutables pueden cambiar su valor, los inmutables no.

Ejemplo: una lista es mutable, una tupla es inmutable.

¿Existen en Python los arrays por defecto?

Otra respuesta simple: no. Como contraparte tenemos algo similar: las listas (list).

¿Qué es None?

Más que un tipo de dato es un valor: el valor nulo de otros lenguajes. Una variable con valor None, está vacía de valor de cualquier tipo.

La conversión entre tipos de datos, ¿cómo se realiza?

Básicamente se crea un objeto del tipo requerido, utilizando un valor de otro tipo. Para ello se usa el constructor del tipo (recordemos que en Python, todo son objetos).

7. Conocimiento general del lenguaje

Puesto que vamos a acudir a una entrevista de trabajo relacionada con Python, podemos esperar preguntas relacionadas con el conocimiento general del lenguaje. Evidentemente, debemos tener esos conocimientos. Si no es así, ya vas tarde:

 

8. Operadores en Python

Aunque podemos considerar los operadores de Python como conocimientos esenciales del lenguaje, lo pongo como un punto aparte porque es frecuente que se hagan preguntas o peticiones acerca de ellos.

Las preguntas más usuales son enumerar algunos o todos los operadores existentes y para que sirven cada uno de ellos.

Con bastante frecuencia suelen preguntar por el operador ternario de Python. Se trata de una pregunta trampa en cierto modo ya que Python, no dispone de un operador ternario como tal. En su lugar, provee de una expresión if…else particular. Ejemplo:

edad = 20
resultado = "Mayor" if (edad > 18) else "Menor"

De forma adicional, mencionar la cierta frecuencia con que preguntan por operadores concretos como is, not e in por su uso frecuente con colecciones de datos:

  • El operador is comprueba si dos objetos son en realidad el mismo o no.
  • Not niega una situación y con frecuencia se usa junto a otros operadores.
  • In indica si un valor se encuentra en una colección de datos.

Finalmente, comentar que suelen aparecer preguntas del tipo, ¿qué diferencia la división normal de la entera?

9. Pass, Break y Continue

Personalmente soy de los que piensan que es preferible evitar el uso de éstas sentencias que rompen el flujo normal de un programa. Sin embargo, no es este el fin de este artículo. Así que vamos con pass porque es una de las más preguntadas:

¿Qué es pass en Python?

Una sentencia que procesa Python pero que no hace nada. Tal cual. La cara que se les queda a mis alumnos cuando la explico y digo esto…

Pienso que sobra y puede ser sustituida perfectamente por comentarios ya que el único uso realmente práctico por buscar algo, es indicar un punto donde debe ir código que aún no hemos implementado. De forma similar a como en Java hace el famoso // TODO. Y esto se puede hacer con comentarios.

Como consecuencia, el único motivo real de su inclusión en el lenguaje, es la posibilidad de que no resulte en error un bloque de código en el que aún no sabemos que código va a tener.

Ejemplo: nos encontramos definiendo una función. Tenemos claro que algoritmo emplear en ella pero no su implementación. Podemos recurrir a poner comentarios que expliquen el algoritmo que queremos emplear en ella y que aún es necesario implementarlo. Si dejamos solamente los comentarios como cuerpo de la función, Python arrojará un error por la sintaxis de tabulación y bloques de código ya que los comentarios no son procesados. Al usar pass, estamos diciéndole a Python: oye, ahí tienes una instrucción correctamente tabulada y el código funcionaría aunque no haría nada.

¿Y qué pasa con break y continue?

Esto tiene más sentido:

  • Break. Sale, termina un bucle en el mismo punto en que Python la ejecute.
  • Continue. Hace que Python ignore la iteración en la que se ejecute continue, dentro de un bucle.

En resumidas cuentas, lo mismo que en otros lenguajes.

10. Trabajo con cadenas

¿Qué hacen estas … funciones de Python?

Es muy frecuente que nos pregunten por algún método del tipo string. Lo mejor es tener claro cuáles son los métodos de las cadenas: https://www.w3schools.com/python/python_ref_string.asp .

Por otro lado, es igualmente frecuente que nos pregunten por las llamadas funciones built-in. Nuevamente, tenerlas claras es lo mejor: funciones Built-In . De entre todas, prestaremos especial atención a filter(), map() y reduce().

Conversiones a cadena.

Cualquier dato es susceptible de ser convertido a cadena simplemente con el uso de la función-constructor str():

La otra forma de convertir a cadena es mediante el formateo. Cualquier dato formateado como cadena da como resultado… una cadena:

Conversiones de cadena a …

Las conversiones de un valor de cadena a otro tipo de dato, usaremos en principio la función-constructor del tipo al que se quiere convertir:

  • a entero: int()
  • a decimal: float()
  • a complejo: complex()
  • a lista: list()
  • a tupla: tuple()
  • a diccionario: dict()
  • a conjunto: set()

Obvia decir que dependiendo del dato a convertir, la operación será exitosa o no.

Del mismo modo, podemos crear nuestros propios algoritmos para realizar conversiones para, de esta forma, convertir valores que de otro modo no podríamos.

¿Qué son los docstrings?

Ciertamente fácil: son cadenas encerradas entre tres comillas simples o apóstrofes:

'''
Soy una cadena docstring:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
'''

Se usan para documentar principalmente, aunque algunos las utilizan como comentarios multilínea.

¿Cómo formateamos una cadena?

Eso depende de la versión de Python.

  • Formateo con %. Desde las primeras versiones. Actualmente no recomendado.
  • Formateo con .format(). Desde la versión 2.6. Tampoco se recomienda en la actualidad.
  • Formateo con cadenas interpoladas o cadenas f. Desde la versión 3.6. Es la actualmente recomendada.

No obstante, el desarrollo de este tema se aleja del objetivo de este artículo. Por supuesto puedes averiguar más partiendo de este estupendo artículo: https://realpython.com/python-f-strings/

11. Estructuras o colecciones de datos

En primer lugar comencemos con las listas. Una pregunta con cierta frecuencia es:

¿qué diferencia a una lista de una lista enlazada?

La respuesta es que una lista normal guarda sus elementos de forma contigua en la memoria, como los clásicos arrays. En cuanto a la lista enlazada, ésta no guarda sus elementos de forma contigua.

¿Qué es una tupla?

Se trata de una colección secuencial de objetos, inmutable. No puede cambiar sus elementos al contrario que ocurre con una lista.

¿Qué es un diccionario?

Las claves de un diccionario deben ser un valor de tipo inmutable como cadenas, números o tuplas.

Ojo: si usamos un número como clave de un elemento de un diccionario, no se trata del índice de ese elemento, si no su clave. Esto quiere decir que el elemento no ocupa el número indicado; es simplemente su clave.

¿Qué es un conjunto?

Es una colección de datos no ordenados. Cada elemento de la colección debe ser único e inmutable aunque si que podemos eliminar o agregar elementos.

Háblenos sobre los rangos.

Los rangos u objeto devuelto por la función range() no son una colección de datos como tal.

Se trata de una sucesión numérica cuyos elementos se van generando al recorrerla. Como consecuencia no podemos tratarla como a una lista, una tupla o similar. Necesitamos algo que la recorra para poder acceder a sus elementos.

Sin embargo, si que podemos convertirlos a listas u otras colecciones.

¿Cuáles son las diferencias entre tal o cual colección de datos?¿Cuándo usar una u otra colección de datos?

Veamos una lista de las colecciones usuales:

Listas.

Son mutables.

Se accede a sus elementos a través de índices.

Son bastante útiles cuando tenemos una secuencia de números (de cualquier tipo) sobre los que queremos realizar operaciones matemáticas.

Tuplas.

Son inmutables.

Se accede a sus miembros a través de índices.

Usémoslas cuando necesitamos un conjunto de valores constantes y probablemente relacionados entre sí. Su acceso será más rápido que una lista. Ejemplo: colores que se utilizan en un gráfico.

Diccionarios.

Son mutables.

Se accede a sus miembros a través de claves, no de índices.

Son bastante útiles para trabajar con grafos y árboles, controlando la membresía de sus diferentes elementos.

Conjuntos.

Mutable.

Sus elementos no están repetidos y se encuentran desordenados.

No podemos acceder a sus valores o elementos mediantes índices: solamente iterando.

Permiten operaciones de conjuntos entre las colecciones de este tipo.

Recomendables cuando necesitamos valores únicos, eliminar duplicidades o realizar operaciones con conjuntos.

Rangos.

Inmutables.

Sus elementos son calculados y siempre valores enteros.

Inaccesibles mediante índices: solamente iterando.

Son muy útiles para actuar como contadores entre otras acciones relacionadas con secuencias de números enteros.

Solamente queda recordaros que pueden tener más aplicaciones por supuesto y que hay más colecciones, la mayoría provistas por módulos adicionales.

¿Arrays o listas?

Pues como siempre, depende de lo que necesitemos. En cualquier caso, por defecto, Python 3.x no usa arrays, sino listas.

De hecho para usar arrays debemos importar el módulo numpy.

En resumen: usaremos listas normalmente excepto cuando tratemos con colecciones de datos numéricos sobre los que tengamos que hacer operaciones matemáticas.

¿Cómo inicializar las diferentes colecciones de datos en blanco?

Cuando queremos crear una colección de datos en blanco para después tratarla desde cero, podemos hacerlo de esta forma:

  1. Listas. Mediante el constructor lista_vacia = list() ó
    lista_vacia = [].
  2. Diccionarios. Igualmente mediante el constructor dict_vacio = dict() ó
    dict_vacio = {}.
  3. Conjuntos. Solamente mediante el constructor  conjunto_vacio = set(). Esto es debido a que si usamos llaves ({}), estaremos creando un diccionario, no un conjunto.

No incluyo otras colecciones cuyo uso inicial vacío no tiene sentido como los rangos o las tuplas (son inmutables) o aquellas que implican el uso de módulos adicionales.

Operar colecciones de… una determinada forma.

En realidad aplicaremos esto a cualquier colección de datos u objetos mutable: son operaciones comunes sobre estas secuencias como:

  • Ordenarla…x.

Podemos ordenar las colecciones de diferentes formas aunque hay que tener en cuenta que dependiendo de la colección elegida podemos disponer de más o menos métodos para lograrlo. En cualquier caso, controlar cómo ordenar de diferentes formas las colecciones en Python, es importante.

  • Obtener un elemento aleatorio de ella.

Depende del tipo de colección a usar (lista, tupla, diccionario, etc.):

  • Comparar dos listas (u otras colecciones).

Si las colecciones a comparar son conjuntos, la comparación es fácil usando matemáticas de conjuntos.

¿Qué comparación queremos realizar?¿Una colección tiene más o menos elementos que otra?¿Una colección contiene un elemento o varios de otra?, etc. Dependiendo de ello, usaremos unos sistemas u otros.

Una forma de comparar colecciones que es básica y quizás no muy eficiente, es recorrer los elementos de éstas mediante bucles. La ventaja de este sistema es que nos puede servir para cualquier tipo de comparación en principio aunque, repito, no sea la más óptima.

  • Eliminar duplicados.

Tal y como sabemos, los elementos de una tupla no pueden modificarse, luego no podemos eliminar los duplicados.

En cuanto a los conjuntos, estos son elementos no ordenados y únicos: no existen duplicados.

Los diccionarios no permiten un elemento cuya clave sea duplicada: si hay más de un elemento con la misma clave y valor, automáticamente se simplifican en uno. Si tienen distinto valor, queda solamente el último elemento cuya clave se encuentra repetida.

En consecuencia, solamente los valores de los diccionarios pueden estar repetidos. Finalmente, en el caso de las listas si que podemos encontrarnos con elementos repetidos. Una forma muy fácil y rápida de eliminar elementos duplicados de una lista o valores de un diccionario, es precisamente, convertir estas colecciones a conjuntos.

Existen muchas formas de lograr todas estas tareas comunes con colecciones. Aquí, he indicado solamente unas que he considerado interesantes.

Gestión de los índices de una colección de datos.

Los elementos de una colección pueden ser accedidos de forma individual o en grupos.

Esto es especialmente conocido en aquellas colecciones indexables: son colecciones u objetos cuyos elementos son accesibles por un número o índice que marca el lugar que ocupan en la colección.

El lenguaje Python es sumamente flexible y potente con esto: permite acceder y extraer un elemento concreto, obtener un extracto o rango de ellos, usar índices negativos para cambiar el orden en que accedemos a los elementos, etc. A todo esto le llamamos “slicing”.

Comparto con vosotros 3 enlaces que he estimado bastante esclarecedores sobre el uso de los índices y el slicing:

https://www.digitalocean.com/community/tutorials/how-to-index-and-slice-strings-in-python-3

https://www.oreilly.com/content/how-do-i-use-the-slice-notation-in-python/

https://towardsdatascience.com/the-basics-of-indexing-and-slicing-python-lists-2d12c90a94cf

Del mismo modo, trabajando con índices nos podemos encontrar con dos errores un tanto comunes y que pueden ser preguntados:

  • Si uso una clave en un diccionario y ésta no existe, ¿qué error devuelve? Pues un KeyError.
  • ¿Y si intento acceder a un índice de una lista o una tupla qué no existe? En ese caso: IndexError.
¿Qué hace el método … del tipo de estructura …?

Por supuesto, cada colección o estructura de datos es una clase y, como tal, disponen de una serie de métodos que pueden usarse con ellas para diferentes labores.

Desde luego que esto depende de la estructura en sí, ya que una tupla no puede tener un método para agregar nuevos elementos como si ocurre con una lista, por ejemplo.

Entoces, es tu labor conocer estos métodos a través de referencias al respecto. Puedes empezar por la documentación oficial sobre estructuras de datos con Python .

¿Qué es la comprensión en las colecciones de datos?

Sin más, es una técnica que puede emplearse en Python para, partiendo de una colección de datos, generar otra.

En Python, esta técnica usa funciones como map(), filter(), expresiones, lambdas, etc.

Básicamente, permite tratar los objetos de una o más colecciones, aplicar condiciones, operaciones sobre ellos y, del resultado obtenido, generar otras colecciones.

Explíquenos sobre los iteradores en Python.

Un iterador es una colección que podemos recorrer para acceder a todos sus elementos.

Aquí diréis: claro, como las listas, las tuplas, las cadenas, los rangos, etc. ¡Exacto! Todas esas colecciones son iterables porque implementan un iterador.

La función iter() nos permite obtener ese iterador que es el objeto que hace posible que una colección sea iterable.

El objeto iterador siempre dispondrá de los metodos:

  • __iter__() y
  • __next__().

La declaración for hace uso del objeto iterador de cualquier colección para poder recorrerla. Si intentásemos recorrer una colección no iterable, ocurriría un error.

12. Funciones

¿Qué es una función en Python?

Una función en Python es un bloque de código fuente almacenado bajo un identificador.

De esta forma, cada vez que necesitamos ejecutar ese bloque de código, llamamos a su identificador en lugar de escribir de nuevo el bloque de código.

Como es obvio, permite reutilización, claridad y mayor facilidad de mantenimiento del código.

¿Funciones Built-In?

Estas funciones son las que se encuentran en el módulo __builtins__ y por tanto, se encuentran disponibles siempre.

Se las llama igualmente funciones integradas o internas, ya que el módulo __builtins__ forma parte de lo que podríamos llamar el núcleo de Python.

Podemos importarlo pero sería redundante, pues como ya habréis comprobado, para usar print(), open(), etc., las usamos directamente sin importar nada.

La documentación oficial de estas funciones se puede ver aquí: funciones Built-In .

¿Qué son parámetros y argumentos en Python?

Los argumentos y parámetros son aquellos valores (objetos) asociados a un identificador que se usan  dentro de la función como parte de la lógica de ésta y que pasan a la función cuando la queremos ejecutar.

Dicho de otro modo, valores externos a la función que le pasamos a ésta cuando es ejecutada para que pueda hacer su trabajo.

¿Las funciones Python reciben los argumentos por valor o por referencia?

Todos los argumentos de una función en Python, son pasados por referencia.

Esto quiere decir que si se modifican dentro de la función, los originales serán modificados también.

¿Qué es *args y **kwargs?

En Python podemos pasar un determinado número de argumentos o parámetros a las funciones, dependiendo de cómo estén definidas éstas.

¿Pero y si no sabemos cuántos argumentos va a necesitar la función en un momento determinado? Pues la respuesta es que si declaramos la función indicando como argumento *args, hacemos que ésta pueda recibir un indeterminado número de argumentos cuando se ejecute.

Todos los argumentos pasados de esta forma, pueden ser tratados dentro de la función como una tupla.

¡Ojo! Que args es solamente un nombre. El asterisco, es realmente el operador que obra “la magia”. Puede ser perfectamente válido *nombres, por ejemplo. El asterisco usado así, es llamado operador de desempaquetado.

Si queremos en cambio, asociar los valores usados como argumentos, con identificadores, deberemos usar **kwargs (ojo nuevamente, kwargs es sólo un nombre, podemos usar cualquiera). Esta vez el operador de desempaquetado es **. En lugar de una tupla, los parámetros pueden serán usados como diccionario dentro de la función.

En la práctica, se puede prescindir de este sistema ya que podemos hacer uso de tuplas y listas externas a la función, que pasamos como parámetros.

¿Para qué sirve return?

La palabra clave return termina la ejecución de una función y devuelve un valor.

A diferencia de otros lenguajes, una función puede terminar sin usar return.

En cambio, la función siempre retornará una valor:

  • Si no se usa return para terminar la función, ésta devolverá None.
  • Si return se usa sin devolver nada, devolverá None.
  • Si se usa return devolviendo un valor, devolverá ese valor.
¿Pueden crearse funciones anidadas?¿Cómo se usan?

Las funciones anidadas son aquellas que se declaran dentro de la declaración de otra función y por tanto, accesibles en esa función padre.

Ese mismo comportamiento, es el causante de la primera de las ventajas de su uso: la encapsulación; no se puede acceder a una función anidada, fuera de la función padre. ¿Qué necesidad hay de poder acceder a funciones internas o anidadas de otra función que solamente va a usar ésta?

Otra ventaja es más claridad en el código.  Una función que podría extenderse mucho en código, es posible que podamos reducirla, creando una o más funciones anidadas que podamos ejecutar dentro de la función padre las veces que haga falta.

Por último, son muy útiles para crear decoradores o implantar el patrón factory en general.

¿Cómo es la recursión en Python?

La recursión en Python es en resumen como en cualquier otro lenguaje: una función definida se llama a sí misma y se establece una condición de salida que permita terminar la recursión y no entrar en un bucle infinito.


¿Para qué se utiliza yield?

La declaración yield es un return con “esteroides”.

Como return, yield devuelve un valor (un objeto en Python) pero en este caso, devuelve ese objeto como un generador. En consecuencia, cada vez que se llame a la función que devuelve el valor a través de yield, devolverá el siguiente valor generado.

Con sus diferencias claro, pero es como si usásemos la función range() dentro de la función y devolvieramos cada vez un solo valor generado por range().

¿Y la función map() qué hace?

La función map() aplica una función sobre cada elemento que pertenece a una o más colecciones de objetos, iterables.

Sintaxis:

resultado = map(funcion(), colección_iterable)

Como resultado devuelve un objeto map que puede ser casteado a lista, conjunto, etc.

El primer parámetro, será una función cuyo código se irá aplicando a cada elemento de la colección o colecciones indicadas como segundo o más parámetros. Devolverá un objeto que figurará como elemento en el objeto map del resultado.

En consecuencia, podemos usar lambdas en lugar de una función normal.

Es muy útil en la programación funcional ya que evita el uso de bucles (junto con el código anidado).

¿Qué son predicados (predicates)?

Los predicados son funciones que devuelven un valor lógico (verdadero o falso) y que sirven para, dependiendo del valor devuelto, obtener uno o más valores, normalmente, de colecciones de objetos.

¿Qué son generadores (generators)?

Los generadores se pueden crear mediante expresiones generadoras y funciones generadoras que utilizan yield en lugar de return.

Devuelven un objeto generator al estilo del devuelto por range: los elementos que componen el objeto generator, son calculados en cada iteración.

¿Qué es un decorador (decorator) en Python?

Se trata de un patrón de diseño aplicable a diferentes lenguajes, no sólo a Python.

Consta de una función que recibe otra función como argumento para devolver una tercera como resultado.

De hecho, para todo esto, hace uso de las funciones anidadas que permite Python.

En conclusión: un decorador en Python, es una función que permite agregar funcionalidades a otra función.

Un decorador en Python es una función que permite agregar funcionalidades a otra función

La definición de un decorador se realiza mediante el carácter @:

def soyundecorador(funcion):
   pass

@soyundecorador
def funcion_decorada():
   pass

13. Lambdas

Python permite la programación funcional y es muy bueno en ella. La notación lambda es uno de sus pilares pero:

¿Qué es una lambda?

Se trata de una función que consta de una expresión que devuelve un valor y que es anónima, no dispone de identificador.

¿Cuál es la diferencia entre una función lambda y una función normal?

Una función normal consta de unas declaraciones, tiene un identificador, puede tener una o más expresiones y devuelve o no un valor.

Una función lambda no tiene declaraciones, es anónima, dispone de una sola expresión y devuelve siempre un valor.

¿Por qué las funciones lambda no tienen declaraciones?

Porque son funciones anónimas que siempre devuelven algo como resultado de la única expresión que pueden manejar.

Lambda. Icono

14. Gestión de ficheros

¿Para qué se usan las funciones open() y close() en Python?

Sencillo: con la función open(), abrimos ficheros para gestionar sus contenidos. En cambio, .close() es un método de un fichero abierto con la función open() que cierra a ese mismo fichero.

¿Por qué debemos cerrar los ficheros abiertos?

Debemos cerrar los ficheros abiertos porque si no lo hacemos, nos exponemos a:

  • Un consumo más alto de recursos porque dependeremos de que el recolector de basura decida liberar ese recurso. Esto puede ralentizar nuestra aplicación al mismo tiempo que además, perdemos control sobre ella que cedemos al propio Python.
  • Que perdamos información que hayamos editado y que no se guarde hasta el momento de cerrar el archivo.
  • El fichero quede bloqueado y no pueda operar con él porque sigue en uso.
  • El sistema operativo no nos deje abrir ficheros debido a que hemos superado el límite de archivos abiertos al mismo tiempo.
¿Cómo se borran ficheros en Python?

Con el método .remove() del módulo os:

import os
os.remove(“fichero_a_borrar.txt”)
¿Por qué necesitamos los directorios en Python?

Resumiendo: depende de los objetivos que queramos cubrir pero:

  • gestionar ficheros y directorios del sistema.
  • ejecución de tareas programadas.
  • comprobar si existe un determinado fichero o directorio para la gestión del contenido de éstos.
  • etc.
¿Cómo obtener el directorio actual?

Lo primero es entender que el directorio actual es aquel donde se está ejecutando el script Python.

Teniendo eso en cuenta:

15. Gestión de excepciones

¿Qué son excepciones en Python?

Las excepciones son errores que ocurren mientras estamos ejecutando un script Python. Este lenguaje ofrece la posibilidad de gestionar acciones que se ejecutarán cuando tenga lugar uno de estos errores.

¿Qué diferencia hay entre errores y excepciones?

Es algo propio de la programación en general.

Los errores son los errores de interpretación o de sintaxis, en este caso, de Python.

Como hemos comentado antes, las excepciones son aquellos errores que aparecen en tiempo de ejecución (o runtime). Python nos provee formas de gestionarlos, igualmente, en tiempo de ejecución.

¿Qué provoca una excepción?

Insisto, cualquier error que ocurra mientras se está ejecutando el código Python:

  • Intentar abrir un fichero que no existe.
  • Acceder a elementos inexistentes de una lista.
  • Realizar operaciones matemáticas con datos recibidos por la función .input(), directamente.
  • Y un muy largo etcétera.

Por otro lado, también es posible que el programador establezca en el código que cuando se den unas determinadas condiciones, se lancen excepciones, bien del propio Python, o bien creadas por él.

¿Qué son las declaraciones “try” y “except”?

He mencionado que Python provee un mecanismo que permite gestionar las excepciones. Esto es posible gracias a los llamados bloques try … except.

El código anidado en el bloque try es el que queda controlado para capturar cualquier excepción que ocurra ahí.

En cambio, el código anidado en el bloque except, se ejecutará cuando ocurra una excepción del código que se encuentra en el bloque try.

Ejemplo:

16. Módulos y complementarios de Python

¿Qué es un módulo en Python?

Un módulo Python es un archivo de script .py que puede contener una serie de funciones o clases que proveen de una serie de funcionalidades, normalmente relacionadas entre sí.

De esta forma, para usar estas funcionalidades en nuestro propio script Python, tendremos que importar el módulo.

Ejemplos de módulos son random, re, turtle, os, etc., que proveen de funcionalidades de números aleatorios, expresiones regulares, gráficos, sistema de archivos, respectivamente.

¿Qué son paquetes?

Los paquetes son conjuntos de módulos almacenados bajo un mismo general.

Están formados por una jerarquía de carpetas y ficheros.

Para utilizarlos es necesario igualmente, importarlos.

¿Qué es un namespace o nombre de espacio?

Esencialmente, se trata de una forma de evitar ambigüedades entre entidades que se llaman igual. De esta manera, nos aseguramos el uso de identificadores únicos en el programa o script Python.

De forma genérica, el sistema logra desambiguar cualquier situación mediante:

  • La indicación de que el identificador pertenece a un módulo, clase u objeto concreto y no a otro. Es lo que ocurre normalmente al importar un módulo: el nombre del módulo actúa como nombre de espacio.
  • El uso de los diferentes ámbitos en Python: built-in, global y local que vienen a indicar si un identificador está siendo usado por el intérprete de Python, a nivel global en el script, o a nivel local de una función o bloque, respectivamente.
¿Cómo importar un módulo?

Cuando necesitamos importar un módulo, lo hacemos de la siguiente forma:

import nombre_módulo

Son posibles otras variaciones pero normalmente es así y, hoy día, la forma recomendable.

¿Cómo podemos usar en Python librerías de terceros?

Para usar librerías de terceros tendremos que importarlas. El problema es que deben estar disponibles para hacerlo y como son de terceros, antes es necesario instalarlas.

Es posible una instalación automatizada mediante herramientas como pip o conda. Sin embargo, esto solamente es posible si la librería que queremos instalar se encuentra entre los repositorios que usen.

Las librerías más conocidas suelen estar en estos repositorios. Si no fuera así, tendremos que recurrir a una instalación manual.

¿Por qué se usa a menudo en Python esta declaración: if __name__ == ”__main__”: ?

Cada vez que un script Python es cargado por el intérprete para ser procesado o interpretado, éste crea una serie de variables especiales.

Una de ellas es __name__, un “dunder”. Recibe como valor el nombre del script que ejecuta pero, teniendo en cuenta lo siguiente:

  • Si el script se ejecuta porque ha sido llamado directamente por el intérprete, el valor de __name__ será __main__.
  • En cambio, si el script es interpretado porque ha sido cargado mediante import, tomará el nombre del módulo.

Resumiendo, __name__ valdrá __main__ cuando el script ejecutado lo sea directamente, no mediante import.

¿Y qué podemos hacer con esto? Pues por ejemplo, ejecutar un determinado código si el script lo hace directamente, o bien otro código, si el script se ejecuta indirectamente si es importado.

¿Cuál es la librería para generar números aleatorios?

Si importamos el módulo random, dispondremos de varias posibilidades para trabajar con números pseudoaleatorios:

import random

Puedes aprender más desde la documentación oficial sobre el módulo random .

¿Qué podemos usar en Python para utilizar expresiones regulares?

Python incorpora un módulo que nos permite trabajar con expresiones regulares:

import re

Este módulo utiliza como modelo de expresiones regulares las clásicas de Perl y Posix .

¿Qué es el módulo NumPy?

Tal como indican en su página oficial NumPy es:

” el módulo NumPy es el paquete fundamental para la computación con arrays “

Este módulo nos aportará muchas y potentes funcionalidades entre las que destacan:

  • Provee de una increíble capacidad para el trabajo con arrays.
  • Aporta numerosas funcionalidades para el trabajo matemático.
  • Permite integrar código C, C++ y Fortran.
  • Y un largo etcétera.
¿Qué es Django?

Aunque es un paquete de Python que podemos instalar como cualquier otro, Django es realmente un framework que nos permitirá crear aplicaciones web de forma robusta, clara y rápida.

Se nota que ha sido creado por programadores, para programadores.

17. Programación orientada a objetos

Se trata de un paradigma de programación, no algo exclusivo de Python. Sin embargo, es cierto que usa la programación orientada a objetos de forma intensiva y alguna pregunta sobre este paradigma suele caer.

¿Qué es una clase en Python?

Como en cualquier lenguaje orientado a objetos, una clase abstrae una entidad del mundo real.

Esa, es la explicación “cuántica” jeje. En la práctica, una clase es como una plantilla o un plano que define cómo ha de construirse un cierto objeto.

Para definir una clase usaremos la palabra clave class NombreClase:.

¿Qué son los métodos de una clase?

Al igual que en la anterior definición, un método es una acción que puede realizar una clase, como en cualquier lenguaje orientado a objetos.

Haciendo un símil con objetos de la vida real, un método sería como la acción de “arrancar” de un vehículo.

En Python, los métodos son funciones que pertenecen a una clase (son miembros de ésta).

¿Qué son “dunders” en Python?

Son los llamados métodos mágicos de Python. Se les reconoce fácilmente porque su nombre se encuentra encerrado entre un doble subrayado tanto al principio como al fin de éste. Ejemplo: __init()__.

Igualmente forman parte de los llamados “miembros built-in” de Python o, lo que es lo mismo, que vienen formando parte del lenguaje de Python por defecto.

Son llamados “mágicos” porque se ejecutan automáticamente ante ciertos eventos. Bastante numerosos, los más frecuentes son:

De inicialización, instanciación, etc.:

  • __new()__: permite crear un objeto de una clase determinada.
  • __init()__: termina el trabajo de instanciación de una clase, comenzado por __new()__.
  • __del()__: se ejecuta cuando el recolector de basura elimina un objeto.

De operaciones aritméticas, etc.:

  • __add()__: usamos el operador +.
  • __sub()__: usamos el operador .
  • __mul()__: usamos el operador *.
  • __floordiv()__: usamos el operador de división de enteros //.
  • __div()__: usamos el operador de división /.
  • __mod()__: usamos el operador de módulo %.
  • __and()__: operación and.
  • __or()__: operación or.
  • __xor()__: operación xor.
  • __pow()__: usamos el operador de potencia **.
  • __lshift()__: realizamos un desplazamiento de bits a la izquierda.
  • __rshift()__: realizamos un desplazamiento de bits a la derecha.

De comparación:

  • __eq()__: usamos el operador de comparación ==.
  • __ne()__: usamos el operador de desigualdad !=.
  • __lt()__: usamos el operador menor que <.
  • __gt()__: usamos el operador mayor que >.
  • __le()__: usamos el operador menor o igual que <=.
  • __ge()__: usamos el operador mayor o igual que >=.

Otros:

  • __str()__: usamos la función str().
  • __repr()__: usamos la función repr().
  • __hash()__: usamos la función hash().
  • __len()__: usamos la función len().
  • __getitem()__: cuando se obtiene el valor de una propiedad o un atributo de una clase.
  • __setitem()__: cuando se establece el valor de un atributo o propiedad de una clase.
  • __delitem()__: cuando eliminamos un item de una colección.
  • __iter()__: cuando obtenemos un iterador de una colección.

Todos ellos pueden ser sobrecargados para dotarles de más funcionalidades cuando se ejecuten como respuesta a los eventos que los disparan.

¿Qué es el método __init__?

Es lo que llamaríamos en otros lenguajes de programación orientados a objetos, constructor de la clase.

Cuando se instancia una clase (se crea un objeto de ésta), se llama automáticamente al método __init__ que permite, entre otras cosas, inicializar los atributos de la clase.

Es considerado un “dunder” o método mágico.

¿Qué es self?

La variable self equivale a la instancia de una clase. Cuando instanciamos un objeto de una clase, self, es la misma instancia. Es el “yo” de un objeto.

Permite acceder a los diferentes miembros de la clase. Siguiendo con el símil del “yo”, éste accedería a brazos, piernas de uno mismo.

¿Qué es un objeto de una clase?

Se trata de algo básico en la programación orientada a objetos:

” Un objeto es una instancia de una clase con un estado determinado por los valores asignados a los diferentes miembros de esa instancia. “

¿Cómo copiar un objeto en Python? y ¿Qué son “deep copys” y “shallow copys”?

Cuando asignamos una colección de datos previa, a otra, se hace por referencia. De esta forma, la nueva colección apunta a la anterior colección. Resumiendo, son las mismas.

Si queremos cambiar un elemento de una colección solamente, este comportamiento por defecto lo hace imposible: se cambiará en ambas.

El módulo copy permite realizar copias que pueden ser de dos tipos:

  • copia superficial o shallow copy: copia el primer nivel de la colección.
  • copia profunda o deep copy: copia cualquier nivel de valores de la colección.

La misma idea y soluciones podemos aplicar cuando tratamos de copiar un objeto.

¿Se pueden declarar clases anidadas?

Si, se pueden declarar clases anidadas o internas en Python.

Simplemente se declaran como cualquier clase pero dentro de una preexistente.

¿Cómo es la herencia en Python?

La herencia en Python, como lenguaje de programación orientado a objetos, se puede realizar sin problemas. De hecho, tenemos:

  • Herencia simple. Heredamos de una clase:
    class ClaseHija(ClasePadre): …
  • Herencia múltiple. Heredamos de varias clases:
    class ClaseHija(ClaseP1, ClaseP2, …): …
¿Qué es “monkey patching” en Python?

Es un sistema mediante el cual podemos modificar los miembros de una clase, de un módulo, etc., en tiempo de ejecución.

Dependiendo de si lo que se quiere modificar se encuentra en un módulo, en diferentes módulos, etc., es posible que tengamos que recurrir a diferentes métodos.

¿Qué es “pickling” y “unpickling”?

Resumiendo: “pickling” es serializar un objeto y “unpickling”, deserializarlo.

Pero entonces, ¿qué es serializar un objeto y deserializarlo?

Serializar un objeto es convertirlo en una secuencia de bytes que nos permita almacenarlo guardando sus valores, su estado, para su posterior utilización. Ejemplo: guardar la partida de un videojuego.

En la parte contraria, deserializar un objeto es transformar la secuencia de bytes leída de un medio de almacenamiento y procesarla para que vuelva a ser un objeto con sus valores.

En Python, este proceso lo podemos llevar a cabo fácilmente mediante el uso del módulo pickle que tendremos que importar:

import pickle

pickle.dump() # Serializa: pickling.

pickle.load() # Deserializa: unpickling.

¿Por qué sobrecargar operadores?

La sobrecarga de operadores implica que un operador de Python, podrá comportarse de diferentes formas dependiendo de los tipos o valores con los que interactúa.

En consecuencia, para conseguir un resultado necesitaremos menor código que además, será más legible.

Resumiendo, por productividad, legibilidad y mejor mantenimiento a posteriori del código.

18. Pruebas prácticas

Poco puedo decir de esto. Aquí es la experiencia del candidato donde sí o sí, se pone a prueba.

Si nuestro evaluador tiene un perfil técnico, es frecuente que nos presente tests o pruebas del tipo ¿qué resultado da tal o cual código?, o bien como ¿ocurrirá un error con el código indicado?

Por fortuna, no suele ser un código complicado aunque, eso sí, con alguna “trampa”.

19. Depuración y testeo

Todo desarrollo de sofware implica un ciclo. Parte de ese ciclo son la depuración y el testeo. Raro será que no pregunten algo aunque sea mínimo.

Depuración

La librería estándar provee del módulo pdb que podríamos considerar la herramienta “de facto” para depurar. Por supuesto, existen más herramientas e incluso más completas. Por ejemplo, los IDEs que trabajan con Python, tienen integrados un depurador.

Testeo

Nuevamente disponemos de un módulo-framework: unittest, integrado en la librería estándar.

Por supuesto existen otros externos como pytest o nose y nose2. En consecuencia, habrá que instalarlos.

Conclusión

Insisto en que este artículo no sustituye la experiencia y conocimientos que podamos tener con Python. De hecho, para seguirlo será necesario disponer de ciertos conocimientos sobre el lenguaje.

En definitiva, pretende ser una guía orientativa que ayude en las entrevistas laborales respecto a Python.

Nada más, un saludo y hasta otra.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Logotipo de Orbis Sapientia Elearning Services

Protegemos tus datos

En este portal web procesamos datos personales como, por ejemplo, tus datos de navegación. Si sigues navegando por nuestro portal, nosotros y otras compañías seleccionadas, podrán instalar cookies o acceder a información no sensible de tu dispositivo con el objetivo de crear perfiles, personalizar contenidos, servir anuncios adaptados a tus preferencias y elaborar estadísticas. Es imprescindible para acceder al sitio web, aceptar:
Con este acto reconoces que has leído y comprendido todos ellos.
Algunas cookies son esenciales para la carga del portal y que puedas ver este mensaje por lo que ya han sido cargadas.
Si lo deseas, puedes eliminar y bloquear todas las cookies de esta web tal como se indica en las Políticas de cookies, aunque de hacerlo, el portal no funcionará correctamente.