All Articles

Experto vs Principiante en Python

Diferencia entre principiantes y avanzados en Python

Python es uno de los lenguajes mas usados por el momento y sigue atrayendo a mucha gente mes tras mes, esto se debe a varias cosas, entre ellas la facilidad de su sintaxis, la variedad de programas que se pueden hacer con el (servidores web, algoritmos de Machine Learning, análisis de datos etc…), la rapidez con la cual se puede desarrollar un programa y correrlo sin problemas con tutoriales para principiantes etc.

El último punto tiene sus ventajas y desventajas, lo bueno es que la barrera de entrada es tan fácil que gente de otras áreas puede empezar a programar de manera rapida y sencilla, generando contadores/programadores, fisicos/programadores, abogados/programadores y demas. Lo malo es que estos tutoriales estan diseñados para que empieces de manera rápida y mucha gente se queda con ese conocimiento y no saca provecho de todas las demas funcionalidades de python ni sus buenas prácticas, esto es lo que diferencia a un programador avanzado de uno principiante

Alguien con mas experiencia en Python hará lo siguiente…

Esta lista no implica que todo esto se debe de usar en TODOS los proyectos, pero a lo largo de los años he visto muchos codigos que deberian de usar estos elementos y no usan ni siquiera uno.

Uso de clases:

Python no es el lenguaje orientado a objetos por excelencia, pero sin duda alguna se ve sumamente beneficiado por esta funcionalidad. Nos ayuda a modularizar mucho mejor nuestro, reutilizar modúlos a los que acudimos varias veces durante nuestro mismo codigo y demas pros que vienen con el desarrollo orientado a objetos.

Podemos hacer herencias, constructores, overriding, metaclases tal como lo hariamos en otros lenguajes de programación. Y, claro, como estamos hablando de Python esto es sumamente facil de hacer.

##El clasico y "original" ejemplo del automovil en programacion orientada a objetos :P
class Auto:
   def __init__(self, color, modelo, marca):
       self.llantas = 4
       self.color = color
      self.modelo = modelo
       self.marca = marca
   
   def kilometraje(self, km):
       self.kilometraje = km
       return ("El kilometraje es: {}".format(self.kilometraje))

Uso de __init\.py y __main\

Si llevas tiempo usando Python probablemente ya te topaste con lo siguiente:

if __name__=="__main__":
  main()

O tambien te has topado con un archivo llamado __init__.py

¿Para que sirven?

  • __init__.py te permite hacer una paqueteria dentro de tu proyecto, por ejemplo, asi como usas import tensorflow para importar la paqueteria de tensorflow, si tu creas modulos desde cero y quieres usarlos en tu script principal con un import, unicamente tienes que ingresarlos en una carpeta (con el nombre de tu paqueteria) y adentro poner los scripts necesarios y un archivo __init__.py vacio.

    #En este ejemplo podriamos hacer un import paqueteria desde nuestro archivo main.py
    .
    ├── paqueteria
    │   ├── __init__.py
    │   ├── procesamiento.py
    │   ├── client.py
    └── main.py
  • if name==”main: esta condicional normalmente la encontramos al final de un script y a lo que te ayudará es a poder hacer debbuging más efectivo de tu código. Imagina que tienes un proyecto con varios scripts:

# Usemos de nuevo esta estructura
.
├── paqueteria
│   ├── __init__.py
│   ├── procesamiento.py
│   ├── client.py
└── principal.py

principal.py es el archivo que vas a correr desde tu terminal con:

python principal.py

Por lo tanto cuando llegues a este condicional el nombre de tu variable __name__ sera igual a __main__ (ya que es el archivo que mandaste a llamar directo desde tu terminal), en cambio si tu archivo principal.py manda a llamar a client.py el __name__ de client.py no será igual a __main__

Pero ¿Cómo nos ayuda esto a hacer debbuging? Fácil, cuando estés desarrollando tu archivo client.py vas a queres estar corriendo algunas funciones constantemente para probar que todo funcione, asi que lo mandas a llamas directo desde tu terminal, lo cual hara que su nombre sea __main__ haciendo que entre a este condicional y dentro de ese IF puedes poner todas las pruebas que quieras hacer, pero cuando ya este en producción tu codigo, como client.py no se manda a llamar directo desde terminal, sino que lo invoca main.py, no tendra el nombre __main__ asi que no entrará al IF y no ejecutara todas las pruebas de testing o debugging que integraste en ese script.

Uso de ambientes viruales de desarrollo

El no usar ambientes de desarrollo creo que ha sido un dolor de cabeza en un inicio para la mayor parte de los programadores de Python. ¿Qué es un ambiente de Python y para que nos sirve?

Cuando desarrollamos varios proyectos en Python usamos muchas paqueterias como Pandas, sklearn, scipy, matplotlib… si tenemos varios proyectos es muy probable que en algun punto nuestras paqueterias vayan a tener conflictos entre ellas, por ejemplo el proyecto A usa tensorflow 1.1 mientras que el proyecto B usa tensorflow 1.2, si solo tenemos una version de tensorflow instalada en la maquina entonces ya sea el proyecto A o el B no va a correr de manera adecuada. Es aqui donde los ambientes virtuales nos ayudan, nos permiten tener varios ambientes aislados entre si para poder manejar distintos proyectos con distintas versiones de dependencias.