Revisión del curso: Domine la entrevista de Python

    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 de desarrollador de Python por Nicolas Georges llamado Domine la entrevista de Python: obtenga el trabajo para personas mayores y bien remunerado.

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

    Estructura y temas cubiertos en el curso

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

    Los temas tratados por Nicolas 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 OOP en Python
    • Comprensiones de estructura de datos

    En las secciones que siguen, analizo brevemente el contenido de cada sección junto con las cosas que me gustaron y no me gustaron de cada una. Concluyo con una sección adicional que discute cosas que creo que beneficiarían a este Curso Udemy si se incluyeron o se hicieron de manera diferente.

    Te puede interesar:Resolver problemas de secuencia con LSTM en Keras: Parte 2

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

    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. Nicolas 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é muy engañoso o completamente incorrecto. En esta sección, Nicolas afirma que «las listas contienen tipos de datos homogéneos, mientras que las tuplas están destinadas a contener tipos de datos heterogéneos». Al principio pensé que esto era simplemente un error inofensivo al que todos son susceptibles en la vida, pero más adelante en esta sección se reiteró e incluso se reforzó en uno de los exámenes finales de la sección.

    Me gustaría tomarme un tiempo para corregir esta afirmación, ya que creo que Nicolas 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, así como 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:

    Te puede interesar:Resolución de problemas de secuencias con LSTM en Keras
    >>> 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:

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

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

    En esta sección, Nicolas explica una característica muy importante del lenguaje de programación Python en que 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() así como otros.

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

    Examen de la unidad

    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. Nicolas hace un excelente trabajo cubriendo los conceptos básicos del unittest módulo e incluso dedica un tiempo considerable a explicar cómo utilizar 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 Nicolas comienza a hacer la transición a las convenciones comunes, o modismos, de la comunidad de programación de Python. No quiero robar el trueno de Nicolas yendo demasiado lejos en la explicación del material cubierto aquí porque creo que hace un gran trabajo explicando lo que significa «pedir perdón y no permiso» y cómo esta convención difiere en Python en oposición a otros lenguajes, como Java.

    Te puede interesar:Algoritmos de búsqueda en Python

    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 que se tratan 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, sentí que esta sección debería asumirse como conocimiento, pero supongo que para completarlo no es inapropiado incluirlo. Sin embargo, creo que quizás tenga más sentido poner este material al comienzo del curso.

    Con lo dicho anteriormente sobre esta sección, quiero dejar mi revisión de esta sección con algo que encontré bastante positivo. Me gustó que Nicolas explicara lo que significaba 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 los dispositivos integrados. bool() función 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 introduce un tipo de datos de recopilación adicional, que se conoce como set y sigue con comparaciones de conjuntos y listas. Durante esta explicación, cubre la noción de lo que significa ser hash.

    Sin embargo, una cosa que sentí que faltaba aquí fue una explicación de los beneficios de rendimiento de buscar un conjunto para la inclusión de un valor en comparación con una lista, que es un beneficio importante de usar conjuntos.

    Más sobre OOP en Python

    Esta sección da un vuelco para profundizar en 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 atributos y métodos de instancia personalizados, así como también analiza 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.

    Te puede interesar:Programación de restricciones con python-constraint

    Comprensiones de estructura de datos

    El curso termina con una sección sobre una de mis características Pythonic favoritas, las comprensiones. Aquí Nicolas demuestra cómo se utilizan las comprensiones y por qué podría utilizarlas al trabajar con listas y diccionarios.

    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 los roles de desarrollador de Python de nivel medio a superior, creo que no hay suficiente contenido destinado a describir más características del lenguaje de nivel medio a avanzado. A continuación se muestra un conjunto de temas que creo que elevarían el curso para que se adapte mejor a su público objetivo.

    A. Se necesitan técnicas de programación de Python más idiomáticas. Un ejemplo de lo que quiero decir con esto es simplemente descomprimir tuplas y listas en elementos componentes. Veo que esto se demuestra a menudo en textos avanzados, así como en blogs, y personalmente lo encuentro congruente con el conocido idioma de Python que explícito es mejor que 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 usa la indexación de los elementos de la tupla, y (ii) la otra utiliza la descomposición de la tupla en variables con nombres significativos.

    Usando indexación:

    Te puede interesar:Introducción a las GAN con Python y TensorFlow
    >>> 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 desembalaje:

    >>> 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.

    SEGUNDO. 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, filtrary mapa.

    Por ejemplo, supongamos que desea filtrar una lista de números y seleccionar solo aquellos 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 cuándo incluso agregar el número a listas separadas designadas para los números pares. Es probable que este sea el enfoque adoptado por un desarrollador junior que esté menos familiarizado con el idioma. El segundo sería utilizar el incorporado filter() función junto con una función lambda para probar números pares.

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

    Te puede interesar:Orden de inserción en Python

    Primer método:

    >>> 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:

    >>> 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 he buscado una tupla con nombre en los casos en los que quería representar un objeto del mundo real, pero sería quizás 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.

    RE. Por último, pero ciertamente no menos importante, realmente me hubiera gustado que se mencionaran las diferencias entre Python 2 y 3. En particular, creo que habría sido importante dar algunos consejos para migrar sistemas existentes de Python 2 a Python 3, que se está convirtiendo rápidamente en un elemento prioritario para muchas empresas y que conduce a una mayor demanda de desarrolladores senior de Python.

     

    Rate this post

    Etiquetas: