DEV Community

Cover image for Conceptos Avanzados de Python 馃悕 para ser un profesional en el lenguaje
GeoannyCode
GeoannyCode

Posted on

Conceptos Avanzados de Python 馃悕 para ser un profesional en el lenguaje

驴C贸mo funciona Python?

Python es un聽lenguaje interpretado lo que significa que tu c贸digo es transformado por el int茅rprete (m谩quina virtual de Python) a聽bytecode聽antes de ser ejecutado por un ordenador con聽x聽sistema operativo.

Tipos de lenguaje

El聽bytecode

Es un lenguaje de programaci贸n de m谩s bajo nivel que puede ser le铆do por un int茅rprete.

Aqu铆 un ejemplo de una funci贸n pasando a bytecode.

python-bytecode

Interprete

Es la m谩quina virtual, traduce el bytecode a c贸digo m谩quina (ceros y unos).

python-maquinavirtual

驴Los lenguajes interpretados son m谩s lentos?

La respuesta se puede resumir en la siguiente frase:

C cuando se debe y Python cuando se puede.

Garbage collector

Recuerda que el聽garbage collector聽toma los objetos y variables que no est谩n en uso y los elimina.

驴Qu茅 es la carpeta Pycache?

_pycache _ Es el directorio (carpeta) que contiene el聽bytecode聽(el c贸digo intermedio) que crea Python para que lo pueda leer la m谩quina y no tenga que convertirlo de nuevo a bytecode.

驴C贸mo organizar las carpetas de tus proyectos?

Paquetes y m贸dulos

M贸dulo

  • Es cualquier archivo de Python.
  • Generalmente, contiene c贸digo que se puede reutilizar.

Paquete

  • Es un conjunto de m贸dulos en una carpeta.
  • Siempre posee el archivo __init__.py

Ejemplo:

Proyecto de exploraci贸n espacial:

proyecto_exploracion
M贸dulos:

nave.py 鈫 Explica el funcionamiento de la nave.

destino.py鈫 Calcular las coordenadas del destino.

plataforma.py鈫 Permite manipular la plataforma.

lanzamiento.py鈫 Cualidades que necesita la nave.

test.py鈫 Contiene funciones de prueba.

validacion.py鈫扸erifica identidad de los pasajeros.

驴C贸mo se ver铆a esto en una estructura de carpetas?

estructura_carpetas
Donde:

README 鈫 Como trabajar con este proyecto.

.gitignore鈫 Ignorar archivos en repositorios GIT

venv鈫 Entorno virtual

exploracion_espacial鈫 Paquete que contiene el: __init__.py

驴Qu茅 son los tipados?

馃捇 Los tipados es una clasificaci贸n de los lenguajes de programaci贸n, tenemos cuatro tipos:

  • Est谩tico
  • Din谩mico
  • D茅bil
  • Fuerte

El tipado del lenguaje depende de c贸mo trata a los tipos de datos.

El tipado est谩tico es el que levanta un error en el tiempo de compilaci贸n, ejemplo en JAVA:

String str = "Hello" // Variable tipo String
str = 5 
// ERROR: no se puede convertir un tipo de dato en otro de esta forma.
Enter fullscreen mode Exit fullscreen mode

El tipado din谩mico levantan el error en tiempo de ejecuci贸n, ejemplo en Python:

str = "Hello" # Variable tipo String
str = 5 # La variable ahora es de tipo Entero, no hay error

## TIPADO FUERTE
x = 1
y = "2"
z = x + y # ERROR: no podemos hacer estas operaciones con tipos de datos distintos entre s铆
Enter fullscreen mode Exit fullscreen mode

El tipado d茅bil es el que hace un cambio en un tipo de dato para poder operar con 茅l, como lo hace JavaScript y PHP.

馃悕 Python es un lenguaje de tipado 馃懢 Din谩mico y 馃挭 Fuerte.

tipados_notipados

Tipado est谩tico en Python (Static Typing)

Asignar tipos a las variables de Python:

tipos_variables1

Asignar tipos en funciones:

tipos_variables2

Trabajando con estructuras de datos:

tipos_variables3

Trabajar con tipos

Importar de la librer铆a typing las clases Dict y List

from typing import Dict, List
Enter fullscreen mode Exit fullscreen mode

Definir una lista de enteros:

positives: List[int] = [1,2,3]
Enter fullscreen mode Exit fullscreen mode

Lista de diccionarios con llaves y valores

countries: List[Dict[str, str]]
Enter fullscreen mode Exit fullscreen mode

Las ventajas de utilizar tipado est谩tico en Python:

  1. Nos aporta claridad del c贸digo.
  2. Nos da calidad a lo que estamos programando.
  3. Nuestro c贸digo va a ser m谩s entendible a otros programadores si trabajamos con tipos.
  4. Nos va a devolver los errores antes del que programa se ejecute.

Scope: alcance de las variables

  • El Scope es el alcance que tienen las variables.
  • Depende de donde declares o inicialices una variable para saber si tienes acceso.

Local Scope

Es la regi贸n que corresponde el 谩mbito de una funci贸n, donde podremos tener una o m谩s variables, las variables van a ser accesibles 煤nicamente en esta regi贸n y no ser谩n visibles para otras regiones

Global Scope

Al escribir una o m谩s variables en esta regi贸n, estas podr谩n ser accesibles desde cualquier parte del c贸digo.

scope

Closures

Es una forma de acceder a variables de otros Scopes a trav茅s de una nested function. Se retorna la nested function y esta recuerda el valor que imprime, aunque a la hora de ejecutarla no este dentro de su alcance.

Nested Functions (Funciones anidadas)

Funciones creadas dentro de otra funci贸n:

def main():
    a = 1
    def nested(): 
        print(a)
    return nested

my_func = main()
my_func()
Enter fullscreen mode Exit fullscreen mode

Reglas para encontrar un Closure

  • Debemos tener una nested function.
  • La nested function debe referenciar un valor de un scope superior.
  • La funci贸n que envuelve a la nested function debe retornarla tambi茅n.

Decoradores

Un decorador es una funci贸n que recibe como par谩metro otra funci贸n, le a帽ade cosas y retorna una funci贸n diferente.
Tienen la misma estructura que los Closures, pero en vez de variables lo que se env铆a es una funci贸n.
Ejemplo:

def decorador(func):
    def envoltura():
        print("Esto se a帽ade a mi funci贸n original.")
        func()
    return envoltura

def saludo():
    print("隆Hola!")

saludo()
# Salida:
# 隆Hola!

saludo = decorador(saludo) # Se guarda la funci贸n decorada en la variable saludo
saludo()                   # La funci贸n saludo est谩 ahora decorada
# Salida:
# Esto se a帽ade a mi funci贸n original.
# 隆Hola!
Enter fullscreen mode Exit fullscreen mode

Se puede hacer de manera m谩s sencilla, con az煤car sint谩ctica (sugar syntax): Cuando tenemos un c贸digo que est谩 embellecido para que nosotros lo veamos de una manera m谩s est谩tica, ayudando a entender de manera m谩s sencilla el c贸digo.

De esta manera, tenemos el c贸digo anterior:

def decorador(func):
    def envoltura():
        print("Esto se a帽ade a mi funci贸n original.")
        func()
    return envoltura

def saludo():
    print("隆Hola!")
saludo = decorador(saludo) # Se guarda la funci贸n decorada en la variable saludo (se decora)

saludo()                   # La funci贸n saludo est谩 ahora decorada

Enter fullscreen mode Exit fullscreen mode
def decorador(func):
    def envoltura():
        print("Esto se a帽ade a mi funci贸n original.")
        func()
    return envoltura

# De esta manera se decora la funci贸n saludo (equivale a saludo = decorador(saludo) de la 煤ltima l铆nea, quedando ahora en la l铆nea inmediata superior ):
@decorador
def saludo():
    print("隆Hola!")

saludo()                   # La funci贸n saludo est谩 ahora decorada
Enter fullscreen mode Exit fullscreen mode

Esto permite ahorrar c贸digo al implementar caracter铆sticas (decoradores) comunes a diferentes funciones:

def decorator_upper(func):                  # Funci贸n decoradora
    def wrapper(text):                      # Funci贸n anidada
        return func(text).upper()           # Operaci贸n que realiza el decorado a la funci贸n (func), inserta el texto a la funci贸n original. Convierte todo a may煤sculas.
    return wrapper                          # Devuelve wapper como indica la regla de los Clousures

@decorator_upper                            # Decora la funci贸n message
def message(name):
    return f'{name}, recibiste un mensaje'  # Esto es lo que realiza la funci贸n message, previo a ser decorada.

@decorator_upper                            # Decora la funci贸n warning
def warning(name):
    return f'Usa solo may煤sculas {name}'  # Esto es lo que realiza la funci贸n warning, previo a ser decorada.

print(message("Cesar")) # Output: CESAR, RECIBISTE UN MENSAJE
print(warning("Cesar")) # Output: USA SOLO MAY脷SCULAS CESAR
Enter fullscreen mode Exit fullscreen mode

Iteradores

Antes de entender qu茅 son los iteradores, primero debemos entender a los iterables.

  • Son todos aquellos objetos que podemos recorrer en un ciclo. - Son aquellas estructuras de datos divisibles en elementos 煤nicos que yo puedo recorrer en un ciclo.

Pero en Python las cosas no son as铆. Los iterables se convierten en iteradores.

Ejemplo:

# Creando un iterador

my_list = [1,2,3,4,5]
my_iter = iter(my_list)

# Iterando un iterador

print(next(my_iter))

# Cuando no quedan datos, la excepci贸n StopIteration es elevada
Enter fullscreen mode Exit fullscreen mode
# Creando un iterador

my_list = [1,2,3,4,5]
my_iter = iter(my_list)

# Iterando un iterador

while True: #ciclo infinito
  try:
    element = next(my_iter)
    print(element)
  except StopIteration:
    break
Enter fullscreen mode Exit fullscreen mode

Momento impactante: El ciclo 鈥for鈥 dentro de Python, no existe. Es un while con StopIteration. 馃く馃く馃く

my_list = [1,2,3,4,5]

for element in my_list:
  print(element)

Enter fullscreen mode Exit fullscreen mode

evenNumbers.py

class EvenNumbers:
  """Clase que implementa un iterador de todos los n煤meros pares,
  o los n煤meros pares hasta un m谩ximo
  """

  #* Constructor de la clase
  def __init__(self, max = None): #self hace referencia al objeto futuro que voy a crear con esta clase
    self.max = max


  # M茅todo para tener elementos o atributos que voy a necesitar para que el iterador funcione
  def __iter__(self):
    self.num = 0 #Primer n煤mero par
    #* Convertir un iterable en un iterador
    return self

  # M茅todo para tener la funci贸n "next" de Python
  def __next__(self):
    if not self.max or self.num <= self.max:
      result = self.num
      self.num += 2
      return result
    else:
      raise StopIteration
Enter fullscreen mode Exit fullscreen mode

Ventajas de usar iteradores:

  • Nos ahorra recursos.
  • Ocupan poca memoria.

Generadores

Sugar syntax de los iteradores. Los generadores son funciones que guardan un estado. Es un iterador escrito de forma m谩s simple.

def my_gen():

  """un ejemplo de generadores"""

  print('Hello world!')
  n = 0
  yield n # es exactamente lo mismo que return pero detiene la funci贸n, cuando se vuelva a llamar a la funci贸n, seguir谩 desde donde se qued贸

  print('Hello heaven!')
  n = 1
  yield n

  print('Hello hell!')
  n = 2
  yield n


a = my_gen()
print(next(a)) # Hello world!
print(next(a)) # Hello heaven!
print(next(a)) # Hello hell!
print(next(a)) StopIteration
Enter fullscreen mode Exit fullscreen mode

Ahora veremos un generator expression (es como list comprehension pero mucho mejor, porque podemos manejar mucha cantidad de informaci贸n sin tener problemas de rendimiento):

#Generator expression

my_list = [0,1,4,7,9,10]

my_second_list = [x*2 for x in my_list] #List comprehension
my_second_gen = ()x*2 for x in my_list]) #Generator expression
Enter fullscreen mode Exit fullscreen mode

Sets

Un set es una colecci贸n desordenada de elementos 煤nicos e inmutables.

驴C贸mo se crean los sets?

my_set = {1, 2, 3, 4, 5}
print("my_set =", my_set)

my_set2 = {"Hola", 2.4, False, True}
print("my_set2 =", my_set2)

my_set3 = {3,3,2}
print("my_set3 =", my_set3)

my_set4 = {[1,2,3], [4,5,6],4}
print("my_set4 =", my_set4)
## Este 煤ltimo da error porque una lista es un elemento mutable
Enter fullscreen mode Exit fullscreen mode

Una llave sin los dos puntos crea un set

Se puede crear sets vac铆os鈥

empty_set = {}
print(type(empty_set)) #<class 'dict'>

empty_set = set()
print(type(empty_set)) # <class 'set'>
Enter fullscreen mode Exit fullscreen mode

Datos a tener en cuenta:

  • Python trata las llaves como un diccionario
  • Se usa la funci贸n set() para indicar que es un set

Casting con set

Convertir un set a otra estructura de datos, o una estructura de datos a un set.

my_list = [1,1,2,3,45,324]
my_set = set(my_list)
print(my_set)

my_tulpe = ("hola", "hola", "hola", 1)
my_set2 = set(my_tulpe)
print(my_set2)
# {1, 2, 3, 324, 45}
# {1, 'hola'}
Enter fullscreen mode Exit fullscreen mode

Datos a tener en cuenta:

  • Para transformar una lista y una tupla. solo tenemos que usar el set() sobre la variable
  • El set() elimina los elementos que se repiten.

A帽adir elementos a un set

my_set = {1,2,3}
print(my_set)

#a帽adir un elemento

my_set.add(4)
print(my_set)

#a帽adir m煤ltiples elementos
my_set.update([1,2,5])

#a帽adir m煤ltiples elementos
my_set.update([1,7,2], {6,8})
print(my_set)
# {1, 2, 3}
# {1, 2, 3, 4}
# {1, 2, 3, 4, 5, 6, 7, 8}
Enter fullscreen mode Exit fullscreen mode

Datos a tener en cuenta:

ac谩 podemos apreciar de que hay m茅todos que se pueden combinar con los set, por ejemplo .add() y .update(). el .add para agregar un elemento y el update para agregar m煤ltiples elementos

Borrar elementos de un set

my_set = {1,2,3,4,5,6,7}
print(my_set)

#Borrar un elemento existente
my_set.discard(1)

my_set.discard(2)
print(my_set)

#borrar un elemento inexistene
my_set.discard(10)

my_set.remove(12)
print(my_set)
# {1, 2, 3, 4, 5, 6, 7}
# {3, 4, 5, 6, 7}
# Traceback (most recent call last):
#   File "python.py", line 28, in <module>
#     my_set.remove(12)
# KeyError: 12
Enter fullscreen mode Exit fullscreen mode

Se usan los m茅todos discard y remove
Si el elemento no existe con remove, lanza un error de tipo KeyError. Remove, es m谩s exigene.

Para eliminar elementos aleatorios se usa el pop() y para eliminar todos los elementos del set se usa .clear()

Operaciones con sets

Operaciones con sets

M茅todos Set

from platform import system
from os import system as console_command


# Utility
def clean_screen() -> None:
  """This function is responsible for cleaning the screen."""

  if system() == 'Windows': console_command('cls')
  else: console_command('clear')


def sets() -> None:
  """Multiple Operations with sets"""
  my_set1 = {'馃崕', '馃崐', '馃崌', '馃崜', '馃崍'}
  my_set2 = {'馃崏', '馃崐', '馃崚', '馃崜', '馃崑'}
  print("  鈫  Set 1:", my_set1)
  print("  鈫  Set 2:", my_set2)
  print('')
  # Union
  my_set3 = my_set1 | my_set2
  print("     Union                  :", my_set3)
  # Intersection
  my_set4 = my_set1 & my_set2
  print("\n     Intersection           :", my_set4)
  # Difference
  my_set5 = my_set1 - my_set2
  print("\n     Difference set1 - set2 :", my_set5)
  my_set6 = my_set2 - my_set1
  print("\n     Difference set2 - set1 :", my_set6)
  # Symmetric Difference
  my_set7 = my_set1 ^ my_set2
  print("\n     Symmetric Difference   :", my_set7)


if __name__ == '__main__':
  clean_screen()
  print("*** O P E R A T I O N S    W I T H    S E T S ***\n")
  sets()

Enter fullscreen mode Exit fullscreen mode

Manejo de fechas

datetime es un m贸dulo de manejo de fechas aqu矛 un ejemplo de su uso:

import datetime

my_time = datetime.datetime.now() # hora local de mi PC u hora universal
my_date = datetime.date.today() # fecha actual

my_day = datetime.date.today()

print(my_time)
print(my_date)

print(f'Year: {my_day.year}')
print(f'Month: {my_day.month}')
print(f'Day: {my_day.day}')
Enter fullscreen mode Exit fullscreen mode

Tabla de c贸digos de formato para fechas y horas(los m谩s importantes):

Formato C贸digo
A帽o %Y
Mes %m
D铆a %d
Hora %H
Minutos %M
Segundos %S
from datetime import datetime

my_datetime = datetime.now()
print(my_datetime)

latam = my_datetime.strftime('%d/%m/%Y')
print(f'Formato LATAM: {latam}')

usa = my_datetime.strftime('%m/%d/%Y')
print(f'Formato USA: {usa}')

random_format = my_datetime.strftime('a帽o %Y mes %m d铆a %d')
print(f'Formato random: {random_format}')

formato_utc = datetime.utcnow()
print(f'Formato UTC: {formato_utc}')

Enter fullscreen mode Exit fullscreen mode

Este c贸digo importa la clase datetime del m贸dulo datetime, que proporciona diversas funciones para trabajar con fechas y horas.

La primera l铆nea crea un objeto datetime que representa la fecha y hora actual. Luego, se imprime en pantalla utilizando la funci贸n print().

La siguiente l铆nea utiliza el m茅todo strftime() para dar formato a la fecha y hora actual en un formato espec铆fico. El m茅todo strftime() toma una cadena de formato como argumento, que indica c贸mo se deben mostrar los distintos componentes de la fecha y hora (d铆a, mes, a帽o, etc.). En este caso, el formato especificado es '%d/%m/%Y', que indica que se deben mostrar el d铆a, mes y a帽o en ese orden, separados por barras.

La siguiente l铆nea hace lo mismo, pero con un formato distinto: '%m/%d/%Y', que indica que se deben mostrar el mes, d铆a y a帽o en ese orden, separados por barras.

La l铆nea siguiente tambi茅n utiliza el m茅todo strftime(), pero con un formato m谩s personalizado: 'a帽o %Y mes %m d铆a %d', que muestra el a帽o, mes y d铆a en ese orden, con las palabras "a帽o", "mes" y "d铆a" incluidas en la cadena de formato.

Por 煤ltimo, se crea un nuevo objeto datetime que representa la fecha y hora actual en el formato UTC (Coordinated Universal Time, o Tiempo Universal Coordinado), que es una referencia de tiempo uniforme utilizada a nivel internacional. Luego, se imprime en pantalla utilizando la funci贸n print().

隆Gracias por leer este post!馃槉

Si te ha parecido 煤til o interesante, puedes darle un like 馃挋 para motivarme a seguir compartiendo contenido as铆. Si tienes la oportunidad y quieres apoyar mi trabajo, puedes hacerlo a trav茅s de un peque帽o donativo 馃捀 隆Un caf茅 virtual ser铆a un gran detalle! 鈽 Puedes hacerlo a trav茅s de Ko-fi.

Adem谩s, si te gustar铆a seguir mis actualizaciones y contenido en redes sociales, puedes encontrarme en Twitter y YouTube como "GeoannyCode" 馃摫馃捇 Espero verte por all铆! 馃槉 隆Gracias por tu apoyo! 鉂わ笍"

Latest comments (1)

Collapse
 
maxwellnewage profile image
Maximiliano Burgos

buen art铆culo! No sab铆a lo del for, que locura!