Revisión del curso: Domina la entrevista de Python

Este artículo será una continuación del tema de mi artículo anterior Preparándose para una entrevista con un desarrollador de Python, donde di mis opiniones y sugerencias que...

Introducción

Este artículo será una continuación del tema de mi artículo anterior Preparación para una entrevista de desarrollador de Python donde di mis opiniones y sugerencias que creo que lo pondrán en la mejor posición para superar a otros desarrolladores que compiten por un rol de desarrollador de Python. En este artículo revisaré el popular curso de Udemy sobre cómo prepararse para una entrevista con un desarrollador de Python de nicolas jorge llamado Domine la entrevista de Python: obtenga el trabajo senior y bien pagado.

Antes de comenzar, debemos mencionar que hay muchas formas de practicar la programación de preguntas para entrevistas, incluidos servicios como Problema de codificación diaria, que le enviará un correo electrónico con un nuevo problema para resolver cada día.

Estructura y temas cubiertos en el curso

La estructura de este curso se compone de secciones que cubren los temas enumerados a continuación, donde cada sección termina en uno o más ejercicios o cuestionarios para reforzar el material.

Los temas tratados por Nicolás en su curso son los siguientes:

  • Colecciones con Listas y Tuplas
  • Introducción a la programación orientada a objetos en Python
  • Examen de la unidad
  • Python idiomático - Pide perdón, no permiso
  • Debe conocer las construcciones de programación de Python
  • Debe conocer las estructuras de datos de Python
  • Más sobre programación orientada a objetos en Python
  • Comprensiones de estructura de datos

En las secciones que siguen, discuto brevemente el contenido de cada sección junto con las cosas que me gustaron y las que no me gustaron de cada una. Concluyo con una sección adicional en la que se analizan las cosas que, en mi opinión, beneficiarían a este Curso de Udemy si se incluyeran o se hicieran de otra manera.

Antes de entrar en las secciones individuales, me gustaría señalar que este curso se impartió utilizando Python 2.7 "heredado", lo que creo que es un pequeño defecto en el curso. La comunidad de Python está a poco más de un año de perder completamente el apoyo del equipo de desarrolladores de Core con respecto al mantenimiento de Python 2. Por esta razón, lo siento necesario para el contenido de Python. productores adopten y usen Python 3 al 100 por ciento.

Colecciones con listas y tuplas

Las colecciones son un tema de enorme importancia en todos los lenguajes de programación de alto nivel y Python ciertamente no es una excepción a esto, por lo que estoy muy contento de que se hayan cubierto en este curso. Nicolás hace un buen trabajo al diferenciar entre inmutabilidad y mutabilidad en relación con listas y tuplas que, en mi opinión, son los principales diferenciadores entre los dos.

Desafortunadamente, se hizo un cargo sobre la implementación de listas y tuplas que encontré que era muy engañoso o completamente incorrecto. En esta sección, Nicolás afirma que "las listas contienen tipos de datos homogéneos, mientras que las tuplas deben contener tipos de datos heterogéneos". Al principio pensé que se trataba simplemente de una metedura de pata inofensiva a la que todos somos susceptibles en la vida, pero más adelante en esta sección se reiteró e incluso se reforzó en una de las pruebas finales de la sección.

Me gustaría tomarme un tiempo para corregir esta afirmación, ya que creo que Nicolás probablemente estaba tratando de describir una tendencia de uso común donde las listas a menudo contienen tipos de datos homogéneos, mientras que las tuplas a menudo pueden contener tipos de datos heterogéneos. En mi experiencia es cierto que cuando utilizo listas los datos que contienen suelen ser del mismo tipo. Sin embargo, es importante saber que tanto las listas como las tuplas pueden contener diferentes tipos de datos además de los mismos.

Aquí hay un ejemplo de listas y tuplas que contienen los mismos tipos de datos que son cadenas que representan las letras de mi nombre:

1
2
>>> x = ['a','d', 'a', 'm']
>>> y = ('a', 'd', 'a', 'm')

Y aquí hay un ejemplo de listas y tuplas que contienen diferentes tipos de datos de una cadena que representa mi nombre y un número entero que representa mi edad:

1
2
>>> x = ['Adam', 30]
>>> y = ('Adam', 30)

Introducción a la programación orientada a objetos en Python

En esta sección, Nicolás explica una característica muy importante del lenguaje de programación Python: cada elemento del lenguaje tiene la forma de un objeto. A partir de esto, puede extrapolar que el lenguaje es un lenguaje totalmente orientado a objetos. Nicolas continúa demostrando y explicando el uso y la utilidad de muchas funciones integradas que permiten al programador inspeccionar objetos como dir(), id(), help() y otros.

Sin embargo, Nicolas contradice sus afirmaciones anteriores sobre la homogeneidad/heterogeneidad de los tipos de datos en las listas durante esta sección, que espero puedan aclararse, ya que creo que la mayoría de los primeros usuarios de Python se confundirían bastante en este punto del curso.

Pruebas unitarias

Lo que más me impresionó fue esta sección del curso. Siento que muchos, si no la mayoría, de los cursos de programación a menudo no abordan la importancia de probar el código de uno. Nicolas hace un excelente trabajo cubriendo los conceptos básicos del módulo unittest e incluso dedica un tiempo considerable a explicar cómo usar el desarrollo basado en pruebas y por qué es importante.

Python idiomático: pide perdón, no permiso

Esta es la parte del curso en la que Nicolás comienza a hacer la transición a las convenciones comunes, o expresiones idiomáticas, de la comunidad de programación de Python. No quiero robarle el protagonismo a Nicolás adentrándome demasiado en la explicación del material aquí cubierto porque creo que él hace un gran trabajo explicando lo que significa "pedir perdón y no permiso" ​​y cómo esta convención difiere en Python a diferencia de otros lenguajes, como Java.

Debe conocer las construcciones de programación de Python

Estaba un poco confundido sobre por qué existe esta sección de los cursos y por qué se colocó en el medio del curso. Los temas tratados en esta sección repasan las construcciones sintácticas muy básicas como expresiones booleanas, condicionales y bucles. Para un curso dirigido a desarrolladores de Python de nivel medio a superior, se consideró que esta sección debería asumirse como conocimiento, pero supongo que para completarla no es inapropiado incluirla. Sin embargo, creo que tal vez tendría más sentido poner este material al comienzo del curso.

Habiendo dicho lo anterior sobre esta sección, quiero dejar mi revisión de esta sección con algo que encontré bastante positivo. Me gustó que Nicolás explicara lo que significa en el lenguaje ser considerado verdadero/falso, robar un término de la comunidad Javascript. Nicolas hizo un gran trabajo al tomarse el tiempo para describir la utilidad de la función bool() incorporada para probar los equivalentes booleanos de las expresiones condicionales de uso común para probar valores como listas vacías, cadenas vacías, Ninguno y otros.

Debe conocer las estructuras de datos de Python

Aquí Nicolas presenta un tipo de datos de colección adicional, que se conoce como un “conjunto” y sigue con una comparación de conjuntos y listas. Durante esta explicación, cubre la noción de lo que significa ser hashable.

Sin embargo, una cosa que sentí que faltaba aquí era una explicación de los beneficios de rendimiento de buscar un conjunto para incluir un valor en comparación con una lista, que es un beneficio importante del uso de conjuntos.

Más sobre programación orientada a objetos en Python

Esta sección da la vuelta para dar más detalles sobre la programación orientada a objetos en Python. Nicolas explica además la sintaxis y el significado de definir una clase personalizada y crear objetos a partir de ella. Introduce los conceptos de definición de métodos y atributos de instancia personalizados, y explica qué son los métodos mágicos y cómo se utilizan. En general, sentí que esta sección estaba bien cubierta y es un conocimiento importante para un desarrollador de Python de nivel medio a superior.

Comprensiones de la estructura de datos

El curso termina con una sección sobre una de mis características favoritas de Pythonic, las comprensiones. Aquí Nicolas demuestra cómo se usan las comprensiones y por qué podrías usarlas cuando trabajas con listas y diccionarios.

Temas para agregar que beneficiarían al curso {#temas para agregar que beneficiarían al curso}

Dado que el título de este curso indica que su público objetivo está orientado a roles de desarrollador de Python de nivel medio a superior, creo que no hubo suficiente contenido destinado a describir más funciones del lenguaje de nivel medio a avanzado. A continuación hay un conjunto de temas que creo que mejorarían el curso para adaptarse mejor a su público objetivo.

R. Se necesitan más técnicas de programación Python idiomáticas. Un ejemplo de lo que quiero decir con esto es simplemente desempaquetar tuplas y listas en elementos componentes. Veo que esto se demuestra a menudo en textos avanzados, así como en blogs, y personalmente encuentro que es congruente con el conocido modismo de Python de que lo explícito es mejor que lo implícito.

Creo que un ejemplo de codificación demostraría mejor mi argumento aquí. Considere el caso en el que tiene una lista de tuplas donde cada tupla representa la longitud y el ancho de un rectángulo y le gustaría iterar sobre ellas para calcular y mostrar el área de cada una. Puedo pensar en dos variaciones en las que podría implementar esto: (i) una utiliza la indexación de los elementos de la tupla, y (ii) la otra utiliza el desempaquetado de la tupla en variables con nombres significativos.

Usando la indexación:

1
2
3
4
5
6
7
>>> shapes = [(1,1), (2,2), (3,2)]
>>> for shape in shapes:
...     print "Area of shape %.2f" % (shape[0] * shape[1])
... 
Area of shape 1.00
Area of shape 4.00
Area of shape 6.00

Usando el desempaquetado:

1
2
3
4
5
6
>>> for width, height in shapes:
...     print "Area of shape %.2f" % (width * height)
... 
Area of shape 1.00
Area of shape 4.00
Area of shape 6.00

Para mí, el segundo ejemplo que usa el desempaquetado es más legible y demuestra una mayor implementación idiomática de Python.

B. Una discusión sobre las funciones integradas de Python que realizan operaciones en colecciones sería una gran adición a este curso. Muchas de las funciones integradas se han proporcionado porque brindan soluciones a problemas de programación comunes, pero tienen implementaciones altamente optimizadas que a menudo brindan mejoras significativas en el rendimiento. Algunas de las funciones integradas que creo que valdría la pena mencionar son Código Postal, [filtrar](https://docs .python.org/3/library/functions.html#filter) y mapa.

Por ejemplo, supongamos que desea filtrar una lista de números y seleccionar solo los que son pares. Puedo pensar en dos enfoques comunes que se tomarían. Uno que usaría un ciclo para iterar sobre los elementos junto con un condicional para probar cada número para ver si es par o no y cuando incluso agregar el número a una lista separada designada para los números pares. Es probable que este sea el enfoque adoptado por un desarrollador junior que está menos familiarizado con el lenguaje. La segunda sería usar la función integrada filter() junto con una función lambda para probar números pares.

En el código, estos dos enfoques se verían así:

Primer método:

1
2
3
4
5
6
7
8
>>> nums = [1, 2, 3, 4, 5, 6, 7, 8]
>>> even_nums = []
>>> for num in nums:
...     if num % 2 == 0:
...             even_nums.append(num)
... 
>>> even_nums
[2, 4, 6, 8]

Segundo método:

1
2
3
>>> even_nums = filter(lambda num: num % 2 == 0, nums)
>>> even_nums
[2, 4, 6, 8]

C. Otro tema que creo que sería beneficioso agregar al contenido existente sería la cobertura de algunos de los tipos de datos de recopilación avanzados, como tuplas con nombre y diccionarios ordenados. A menudo busco una tupla con nombre en los casos en que quería representar un objeto del mundo real, pero tal vez sería incómodo o excesivo usar una clase personalizada o el diccionario demasiado usado. No solo son una excelente manera de organizar datos que representan algo en la palabra real, sino que tienen un rendimiento excelente, particularmente mejor que un diccionario.

D. Por último, pero no menos importante, realmente me hubiera gustado que se mencionaran las diferencias entre Python 2 y 3. En particular, creo que hubiera sido importante brindar algunos consejos para migrar los sistemas existentes de Python 2 a Python. 3, que se está convirtiendo rápidamente en un elemento prioritario para muchas empresas y está generando una mayor demanda de desarrolladores sénior de Python.

Conclusión

En este artículo he hecho todo lo posible para dar una revisión completa y honesta del curso de Udemy, [Domine la entrevista de Python: obtenga el trabajo senior y bien pagado](https://stackabu.se/master-the-python- entrevista) de nicolas jorge, que actualmente cuenta con unas 2700 inscripciones.

Mi opinión general del curso es que es un poco engañoso porque su título lleva a creer que el contenido está más orientado hacia el desarrollador de Python de nivel medio a superior, mientras que encontré que falta un poco para que. Dicho esto, hay un contenido realmente excelente cubierto en este curso que será valioso para los desarrolladores de Python de nivel principiante y junior.

Como siempre, les agradezco su lectura y agradezco los comentarios y críticas a continuación. ntinuación.