9 habilidades de programación en Python que distinguen a un principiante de un experimentado

Se preparó una traducción del artículo antes del comienzo del curso Python Developer .




Python es un lenguaje fantástico. Su sintaxis es tan simple que ni siquiera tiene que buscar un punto y coma adicional en su código. Incluso diría que Python es uno de los mejores idiomas para un novato.

Comienza con un amplio conjunto de bibliotecas y agrega más y más a medida que adquiere experiencia en programación.

Después de un tiempo, puede sentir que está atascado cuando resulta que escribió demasiado código para una operación simple. De hecho, esto no es tan malo como podría pensar. Comprender la lógica de lo que está trabajando es mucho más importante que el número de líneas. El código corto es mejor, pero si la lógica se rompe, su código no funcionará según lo previsto. Pero con experiencia y un enfoque creativo para trabajar, su código será más corto y mejor.

Principiante o experimentado?


Entonces, ¿qué distingue a un principiante de un programador experimentado cuando se trata de programar en Python?

En este artículo, me gustaría centrarme en los siguientes problemas:

  • Resolución de problemas y el arte de hacer preguntas.
  • Comprender por qué funciona el código (o no)
  • Trabajar con cuerdas
  • Trabajar con listas
  • Usando bucles
  • Uso de funciones (y terminología adecuada)
  • Programación orientada a objetos
  • Respeto por la PEP

Resolución de problemas y el arte de hacer preguntas.


Como programador, diré que si no tiene suficiente experiencia en la resolución de problemas, le resultará difícil comenzar a escribir un código excelente. Si tiene problemas para resolverlos, probablemente no le resulte fácil encontrar las mejores soluciones. La programación no es solo escribir código. La habilidad para resolver problemas es la habilidad que necesitarás para salir de la categoría de novato.

Hacer preguntas sobre la programación también es muy importante. Si solo le pide a alguien que resuelva el problema por usted, sin intentar nada, está haciendo lo incorrecto. Esto no es fácil, pero si no intenta resolver los problemas usted mismo, no obtendrá ningún beneficio de la solución de otra persona a su problema.

Si desea saber cómo formulo preguntas de programación, aquí hay un artículo separado al respecto.

Problema xy


"Necesito obtener los últimos tres caracteres en una cadena".
"No, no necesita! Necesita obtener la extensión de archivo ".

El problema XY es algo muy divertido. Tiene un problema X, y cuando llama al soporte técnico, pregunta sobre un problema Y, cuya solución, como cree, resolverá el problema X. [1]

El caso descrito anteriormente ilustra bien esta situación. Si desea obtener la extensión del archivo, puede suponer que necesita los últimos 3 caracteres de la línea.

Cómo se vería:

def extract_ext(filename):
    return filename[-3:]
print (extract_ext('photo_of_sasquatch.png'))
>>> png

¡Perfectamente! Bueno, ahora intenta con. Un photo_of_lochness.jpeg
usuario podría preguntar acerca de la extensión desde el principio. El problema Y son los últimos tres caracteres. El problema X es una extensión.

def extract_ext(filename):
    return filename.split('.')[-1]
print (extract_ext('photo_of_sasquatch.png'))
print (extract_ext('photo_of_lochness.jpeg'))
>>> png
>>> jpeg

¡Eso es todo!

También puede usar la biblioteca estándar os.path.splitext().
Puedes familiarizarte con él aquí .

Comprender por qué funciona el código (o no)


Cuando eres nuevo, puedes moler una pequeña pieza de código durante varios días. Y cuando este código de repente comience a funcionar, sentirá alivio y pasará a la siguiente parte. Y esto es lo peor que puedes hacer. Aceptar silenciosamente que el código simplemente funciona y no entender por qué funciona es probablemente aún más peligroso que no entender por qué el código no funciona en principio.

No entiendo por qué su código no funciona sucede todo el tiempo. Cuando elimine todos los errores y finalmente descubra por qué la solución no funcionó, es muy importante pensar por qué no funcionó y qué hizo que el código funcionara correctamente. Llevará este conocimiento a través de todos sus programas.

Por ejemplo, si tiene una sangría de error desde el comienzo de una línea en código con varios bloques, puede comenzar a mover bloques al azar y luego formarlos cuando el programa finalmente se inicie.
Recuerde que en la mayoría de los IDE puede colapsar bucles y si es así. Para que pueda ver fácilmente qué unidad funciona para usted y cuál no.


ATOM con construcciones if-else plegadas a la derecha.

Otra forma genial de ver visualmente cómo funciona su código es www.pythontutor.com , donde puede ver lo que sucede en su programa línea por línea.


Ejecución de código en pitontutores

Trabajar con cuerdas


La sección actual no trata completamente de líneas. Se trata más de cavar en las grandes bibliotecas de Python. En Python, aprendemos temprano que una cadena se puede considerar como una lista de caracteres. Puede acceder a un carácter en una cadena por índice.

word = 'supergreat'
print (f'{word[0]}') 
>>> s
print (f'{word[0:5]}')
>>> super

Una mente inquisitiva aprende sobre lo que ofrece str(), pero puede seguir escribiendo sin mirar la documentación str(). Para llamar a la documentación de la función puede escribir help(str)o dir(str). Cuando haces esto, puedes encontrar métodos cuya existencia ni siquiera se sospechaba. Es posible que haya mirado la documentación y sabe que las cadenas tienen un método endswith(), por ejemplo, y puede aplicarlo en algún lugar.



Aquí hay un ejemplo de código que hace lo mismo de dos maneras diferentes. Se utiliza la primera opción split, de la que hablamos recientemente. Y en el segundo, endswith()que puedes encontrar en la documentación.

La mayoría de los programadores nunca leerán toda la documentación y aprenderán todo. Una parte importante del trabajo de un programador es saber dónde buscar información sobre cómo resolver un problema.

Trabajar con listas


Las listas son una gran y versátil cosa.
Por ejemplo, aquí mezclamos valores enteros y cadenas:

my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3, 'a' , 'n' , 'b']
for item in my_list:
    print (f'current item: {item}, Type: {type(item)}')



Mira cómo los mezclamos. Si intentamos ordenar la lista, obtenemos un error.

print (my_list.sort())



¿Qué pasa si necesitamos separar letras de números? La primera forma es resolver el problema utilizando un bucle en el que verificaremos cada elemento de la lista. Un principiante conocerá los ciclos temprano, porque los bucles son una parte importante en la programación.

El código puede verse así:

my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3 , 'a' , 33.3 , 'n' , 'b']
number_list = []
string_list = []
for item in my_list:
    print (f'current item: {item}, Type: {type(item)}')
    if not isinstance(item,str):
        number_list.append(item)
    else:
        string_list.append(item)
my_list = string_list

Este es el enfoque correcto, pero un poco engorroso. El código funciona, pero puede hacerlo para que el problema se resuelva con el mismo método, ¡pero en una línea!

Si quieres ser más feliz, aprende cómo funcionan las expresiones de lista en Python. Aquí está el mismo problema, pero resuelto con una comprensión de cómo funcionan las listas:

my_list = [letter for letter in my_list if isinstance(letter,str)]


¡Eso es todo!

Y este no es el final. Puedes usar filterpara obtener el mismo resultado.

def get_numbers(input_char):
    if not isinstance(input_char,str):
        return True
    return False

my_list = [1,2,3,'a','b','c']
check_list = filter(get_numbers, my_list)
for items in check_list:
    print(items)




Como probablemente ya haya entendido, hay muchas maneras de resolver el mismo problema. Debe tener en cuenta que funcionará mejor específicamente para usted y su equipo.

Prima

  • Voltear una lista (o línea):

names = ['First' , 'Middle' , 'Last']
print(names[::-1])
>>> ['Last', 'Middle', 'First']

  • Combinando elementos de la lista:

names = ['First' , 'Middle' , 'Last']
full_name = ' '.join(names)
print(f'Full Name:\n{full_name}')
>>> First Middle Last

Usando bucles


¿Te has encontrado con un código similar?

greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']
for index in range(0,len(greek_gods)):
    print (f'at index {index} , we have : {greek_gods[index]}')

Probablemente aprenderá esta construcción de otros idiomas, pero esto está lejos del enfoque de Python. En Python usarás:

for name in greek_gods:
    print (f'Greek God: {name}')

Notará rápidamente que no hay índice. ¿Qué pasa si desea operar en un índice? En Python puedes aprovechar enumerate. ¡Esta es una excelente manera de acceder a todo lo que necesita!

for index, name in enumerate(greek_gods):
    print (f'at index {index} , we have : {name}')



Uso de funciones (y terminología adecuada)


Cuando trabajo en animación, siempre digo que si haces lo mismo 5 veces, ¿debes pensar si necesitas un programa? A veces, después de pasar dos semanas desarrollando una herramienta, puede ahorrar seis semanas de trabajo. Cuando escribe código y comprende que está realizando la misma acción varias veces, debe pensar si codifica este código en un procedimiento o función. La función devolverá algún valor, y el procedimiento simplemente ejecutará el código. En el primer ejemplo, verá el procedimiento, y en el segundo, la función.

Suena confuso Aquí hay una ilustración que refleja el principio de funcionamiento:



preste atención a la diferencia entre printy return. Puede parecer que funcionan de la misma manera, pero si observa el resultado, verá que la función simplemente devolverá el nombre pasado.

Los siguientes términos que deberían estar claramente separados son argumentos y parámetros. Los parámetros son lo que se define en el procedimiento o función (resaltado en rojo en la figura), y lo que pasa al procedimiento o función son argumentos (resaltados en verde).

Aquí hay unos ejemplos.

Ejemplo 1

def print_list(input_list):
    for each in input_list:
        print(f'{each}')
    print() #just to separate output
greek_gods = ['Zeus' , 'Hera' , 'Poseidon' , 'Apollo' , 'Bob']
grocery_list = ['Apples' , 'Milk' , 'Bread']
print_list(greek_gods)
print_list(grocery_list)
print_list(['a' , 'b' , 'c'])



En lugar de escribir el ciclo tres veces, lo escribiré una vez en el procedimiento y lo llamaré cuando lo necesite. Y en el segundo ejemplo, puede ver cómo la función devuelve una lista invertida.

Ejemplo 2

def reverse_list(list_input):
    return list_input[::-1]
my_list = ['a', 'b' , 'c']
print (reverse_list(my_list))
>>> ['c', 'b', 'a']

Programación orientada a objetos


Python es un lenguaje orientado a objetos, y hay mucho poder en los objetos. Piense en un objeto como un dibujo: si usa un dibujo, crea una instancia del mismo. Por lo tanto, puede crear tantas instancias como desee y no arruinar nada en el dibujo original cuando las use.

La programación orientada a objetos (OOP) es un gran tema, por lo que esta sección no contiene todo lo que necesita saber al respecto, pero hablaremos de algunos ejemplos simples que lo ayudarán en su trabajo.

Si ha leído sobre POO anteriormente, probablemente esté cansado de estudiar, pero aquí está nuevamente. Comencemos definiendo una clase Student. Tendrá un nombre ( name) y una lista de disciplinas ( subject_list):

class Student():
    def __init__(self,name):
        self._name = name
        self._subject_list = []

Aquí __init__está el constructor de la clase. Define el núcleo de la clase. Más adelante verá cómo se agregan los métodos. Los métodos son procedimientos o funciones que pertenecen a una clase a la que se puede llamar cuando se usa la clase dentro del programa.
Si desea crear un alumno, creará la siguiente variable:

student1 = Student('Martin Aaberge')

Si necesita más estudiantes, usará la misma clase y creará un nuevo objeto.

student2 = Student('Ninja Henderson')

Y student1, y student2serán instancias de la clase Student. Tienen el mismo esquema, pero no tienen nada más en común. Por el momento, podemos hacer poco con los estudiantes, pero hemos agregado una lista de disciplinas. Para completar esta lista, crearemos un método separado. Puede llamar a métodos para interactuar con instancias de clase.

Actualicemos la clase:

class Student():
    def __init__(self,name):
        self._name = name
        self._subject_list = []
    def add_subject(self, subject_name):
        self._subject_list.append(subject_name)
    def get_student_data(self):
        print (f'Student: {self._name} is assigned to:')
        for subject in self._subject_list:
            print (f'{subject}')
        print()

Ahora esta clase se puede usar para crear estudiantes, editar y obtener información sobre ellos.

#create students:
student1 = Student('Martin Aaberge')
student2 = Student('Heidi Hummelvold')
#add subjects to student1
student1.add_subject('psychology_101')
student1.add_subject('it_security_101')
#add subject to student2
student2.add_subject('leadership_101')
#print current data on students
student1.get_student_data()
student2.get_student_data()

Por lo general, las clases se almacenan en archivos separados y se importan en código. En nuestro ejemplo, creamos una clase Studenten un archivo student.pyy la importamos a nuestro archivo main.py. (En este caso, ambos archivos están en la misma carpeta).

from student import Student
student1 = Student('Martin')
student1.add_subject('biomechanics_2020')
student1.get_student_data()



Respeto pep


A menudo puede ver personas que escriben código Python y no piensan en PEP en absoluto. Tal vez yo mismo haga esto a veces. Cuando trabajas en un entorno de desarrollo, es muy importante seguir los estándares, si no los estándares PEP, al menos los estándares de tu empresa.

PEP es una recomendación establecida para su código. Aquí está el enlace a PEP-8 . Gran lectura Léalo al menos una vez para entender de qué se trata. Un ejemplo clásico es este snake_case. Las variables en Python se escriben en snake_case, es decir, las palabras en el nombre de la variable se separan con guiones bajos. Incluso en las universidades, a veces aprenden incorrectamente, así que no se desanime y simplemente comience a escribir según las reglas.

Así es:

chocolate_cake = 'yummy'

Y aquí está, no:

chocolateCake = 'Yummy'

Conclusión


Ser un novato es asombroso. ¡Tu camino no será fácil, pero tu curva de aprendizaje será empinada y te dará una nueva experiencia! Dejar de ser un novato puede ser difícil. A veces es difícil entender en qué debes concentrarte. ¿Cuál será el próximo paso?

Tal vez este artículo lo empuje en la dirección correcta, o tal vez para usted fue solo un montón de charlas aleatorias que ya conoce. Si no está seguro de dónde ir después, no tenga miedo de preguntar. Asegúrese de seguir los consejos de quienes tienen más experiencia que usted. Esté abierto a diferentes opiniones y descubra lo que es adecuado para usted. Si no está listo para usar ciertas formas de escribir código, escriba de una manera que sea conveniente para usted hasta que aprenda nuevos y mejores.

Fuentes:

[1] Número XY, en.wikipedia.org/wiki/XY_problem



Lección gratuita: Introducción a AutoTests



All Articles