62

7 conceptos de Python que acelerarán tu aprendizaje

50653Puntos

hace un año

Aprender Python es una de las aventuras más fascinantes en las que vas a participar. Es divertido, puedes construir proyectos interesantes y las oportunidades laborales son enormes.

Sin embargo, es normal que, al menos al inicio, no tengamos muy claro ciertos conceptos y que la curva de aprendizaje se ponga más empinada. Es por eso que en este artículo te voy a explicar temas que harán que tu experiencia de aprendizaje en este lenguaje sea más amena.

¿Eres nivel intermedio o pro en Python? Igual quédate. Estoy seguro de que tu pensamiento computacional mejorará luego de leer este blog.

https://images.unsplash.com/photo-1557599443-2071a2df9c19?ixlib=rb-4.0.3&q=80&fm=jpg&crop=entropy&cs=tinysrgb

⚠️Ten en cuenta que para sacar el máximo provecho es necesario que tengas conocimientos básicos de Python. Todo esto lo puedes aprender en **Curso de Fundamentos de Python.

1. El intérprete de Python

El intérprete de Python es un software que ejecuta las instrucciones de un script, sin necesidad de una compilación previa. Este lenguaje es compilado y se diferencia de los interpretados porque genera un resultado, u output, a partir de un programa y no un programa escrito en Assembly.

Para usar el intérprete podemos valernos de la Shell de Python. Entonces, nos vamos a la terminal y ponemos:

Python3

El comando anterior funciona en distros de Linux y MacOS. Si estás en Windows, prueba con python.

Ya dentro de la Shell verás algo como esto:

python-interpreter.png

Allí ya puedes empezar a ejecutar código Python. Intenta poner lo siguiente:

2 + 2

O esto:

for i in range(5):
	print(i)

¿Qué observas?

Finalmente, para salir del intérprete puedes poner:

exit()

2. Ambientes virtuales

Cuando instalas Python en tu computadora, este se aloja en un directorio. Para saber dónde, puedes poner:

which python3

En mi caso, esto me devolverá /usr/bin/python3 porque estoy en una distro de Linux (Ubuntu). Pero en tu caso, puede ser diferente por tener otro sistema operativo.

El punto es que con el Python alojado en esa dirección funcionan todos los proyectos en tu computadora. Y también pasa esto si instalas alguna otra librería. Mira el diagrama de la siguiente imagen.

https://static.platzi.com/media/user_upload/Untitled-bf9d42f1-5c44-4521-8b1f-8052334b96c0.jpg

¿Qué pasa si tienes proyectos que funcionan con versiones diferentes de Python o de las otras librerías que instalaste? Por ejemplo, tienes un proyecto que funciona con Python 3.10.6 y otro que funciona con Python 3.8.2. ¿Cómo lidiar con esta diferencia de versiones?

Es aquí que vienen los ambientes virtuales. La idea es tener un Python diferente para cada proyecto en el que estés trabajando. O sea, aparte del Python alojado en el directorio general para toda tu computadora, vas a tener un Python alojado en una carpeta dentro de tu proyecto X. Y así para tu proyecto Y, tu proyecto Z, etc. Entonces tus proyectos se verán así:

https://static.platzi.com/media/user_upload/Untitled%20%281%29-8f77947f-7ca7-4c49-9ab4-c462d734678f.jpg

Crear y activar ambientes virtuales es muy sencillo. Primero veamos cómo hacerlo en sistemas basados en Unix como Linux y Mac OS. Te ubicas en la carpeta root del proyecto y corres los siguientes comandos:

#Para crear el ambiente virtual
python3 -m venv nameOfVirtualEnv

#Luego lo tienes que activarsource nameOfVirtualEnv/bin/activate

#Lo puedes desactivar así
deactivate

Ten en cuenta que nameOfVirtualEnv es el nombre de tu ambiente virtual. Puede ser cualquiera. Pero te recomiendo ponerle env o venvpara una mejor comunicación con otros desarrolladores y desarrolladoras. Además, verás una carpeta con este mismo nombre.

Si estás en Windows, puedes poner lo siguiente:

#Crear
py -m venv nameOfVirtualEnv

#Activar
.\nameOfVirtualEnv\Scripts\activate

#Desactivar 
deactivate

Te sugiero que, si trabajas en Windows, uses una terminal basada en Unix como Cmder o WSL. Además, el Curso de Introducción a la Terminal y Línea de Comandos te viene perfecto para dominar la terminal.

3. Funciones

Una función es un pedazo de código que toma valores de entrada, los procesa y después devuelve otros valores. Sus ventajas son que reducen las líneas de código, hacen que el código sea más prolijo y escalable. Su sintaxis viene así:

defhello(name):return'Hello, {name}!'.format(name=name)

Nuestra función recibe name como argumento o valor de entrada y luego nos da un output habiendo procesado este valor, justo en la línea del return. Algo clave en este punto es diferenciar entre hacer referencia a la función y ejecutar la función.

Hacer referencia a una función es solamente indicarle a Python dónde está para que posteriormente puede hacer algo con esta. Aquí no empleamos paréntesis. Por otra parte, ejecutar la función es hacer uso de la lógica de la función en ese momento. Aquí sí utilizamos los paréntesis. Veamos un ejemplo con la función que creamos.

hola = hello
print(hola)
print(hola('Axel'))

Mira que asignamos la referencia de la función hello a hola. Luego imprimimos tanto la referencia a la función, como su ejecución.

<function hello at 0x7fc826f0df30>
Hello, Axel!

La primera línea indica la clase (function) y su almacenamiento en memoria (0x7fc826f0df30). La segunda, es la ejecución en sí.

El concepto de funciones en python no se queda solo acá. Hay temas mucho más avanzados como los decoradores y dominarlos te convertirá en un desarrollador o desarrolladora top. Te dejo este artículo de decoradores en Python para que logres aquello. Irás de 0 a 100.

4. Argumentos indefinidos *args y **kwargs

Cuando no tengas la total certeza de cuántos argumentos va a necesitar una función, puedes emplear *args y **kwargs. Los primeros son positional arguments y los otros keyword arguments.

Veamos un ejemplo en el cual vamos a sumar un número indefinido de números.

defsum_multiple(*args):return sum(args)
    
print(sum_multiple(1, 2, 4, 5))

El output es 12. Ten en cuenta que puedes poner tantos números como desees. Al usar el argumento especial *args, Python interpreta que entrarán varios valores e internamente los almacena en una tupla.

En el caso de los keyword arguments, Python los trata como diccionarios. Por lo tanto, podemos hacer uso de ellos con la sintaxis de clave-valor. Veamos un ejemplo en el que se imprimen los datos personales de una persona.

defpersonal_data(**kwargs):for k, v in kwargs.items():
        print(f'{k}: {v}')
        
personal_data(name='Axel', country='Ecuador', height=182, born=1998)

Esto nos devuelve:

name: Axel
country: Ecuador
height: 182
born: 1998

En la documentación de varias librerías te encontrarás tanto con positional arguments, como con keyword arguments. Por eso es importante que lo entiendas para que tu interpretación al leer documentación sea la más óptima. Échale un ojo a Boxplot en Seaborn.

5. Lambdas

Lambdas son funciones con sintaxis especial que pueden tomar varios argumentos, pero solo tener una expresión. También las puedes encontrar como funciones anónimas. Primero miremos una función normal.

defsum_one(x):return x + 1
    
sum_one_funct = sum_one(5)
print(sum_one_funct)

Y ahora la misma función, pero como lambda.

sum_one_lambda = lambda x: x + 1

print(sum_one_lambda(5))

En ambos casos el resultado es 6. Pero quiero que te fijes en las líneas de código que ahorramos. Este es el valor de las funciones lambda. Sin embargo, te recomiendo no abusar de este recurso porque tu código podría perder su legibilidad y hacerlo más difícil de escalar.

6. Scope

El scope se refiere al alcance que tienen los bloques de código de un programa en Python. Básicamente, están el local scope y el global scope. Este concepto viene bien visualizarlo en una función.

x = 5#Global scopedefmyfunction():
    x = 1#Local scope
    print(x)

myfunction()
print(x)

La variable x = 5 tiene global scope, porque se puede hacer referencia a ella desde cualquier parte del programa. Pero x = 1 que está dentro de la función myfunction y tiene local scope. Por eso cuando ejecutamos myfunction() se imprime 1, porque su scope no va más allá de la función. No puede alterar valores globales.

También existen los closures. Son una forma de acceder a variables de otros scopes con nested fuctions. Por ejemplo:

defmain():
	a = 1defnested():
		print(a)
	return nested

my_func = main()
my_func()

Para que una función se considere un closure debe cumplir con:

  • Tener una función anidada.
  • La función anidada debe referenciar a una variable de un valor superior.
  • La función que envuelve a la función anidada debe retornarla también.

7. High order functions

Las high order functions son funciones que reciben una función como parámetro y devuelven otra. Este tipo de funciones tienen las siguientes propiedades:

  • Se pueden almacenar en una variable.
  • Son instancias del tipo objeto.
  • Pueden pasar la función como parámetro de otra función.
  • Pueden retornar una función a partir de otra función.

Python ya trae integradas un algunas de estas funciones: map, filter y reduce.

La función filter filtra los valores de un iterable según una función. Ten en cuenta que devuelve un iterador, no una lista o tupla. Su sintaxis es así:

filter(function, iterable)

Veamos un ejemplo:

nums = [1, 5, 3, 6, 7, 2]

defless_five(n):
    numeros = [1, 3, 2]
    
    returnTrueif n in numeros elseFalse

num_smaller_than_five = list(filter(less_five, nums))

print(num_smaller_than_five)

Esto retorna:

[1, 3, 2]

La función map tiene una sintaxis similar. Solo que ahora le aplica la función a todos los valores del iterable.

map(function, iterable)

Veamos un ejemplo con la misma lista anterior:

nums = [1, 5, 3, 6, 7, 2]

squares = list(map(lambda x: pow(x, 2), nums))

print(squares)

Que nos devuelve:

[1, 25, 9, 36, 49, 4]

Y finalmente la función reduce es útil cuando debas reducir un iterable a un solo valor. La función recibe 2 argumentos (ya no 1 solo). Debe importarse de functools.

reduce(functionWith2Arguments, iterableObject)

Supongamos que tenemos una lista de 5 elementos que valen 2. Ahora queremos reducirla y obtener un 32, es decir, multiplicarlos a todos entre sí.

from functools import reduce

myList = [2, 2, 2, 2, 2]
allMultiplied = reduce(lambda a, b: a * b, myList)

print(allMultiplied)

Esto nos da 32 como respuesta.

Nunca pares de aprender Python 🐍

Has aprendido 7 conceptos fundamentales para tu carrera profesional con Python. Estoy seguro de que con esto, tu pensamiento computacional mejorará mucho y podrás avanzar 10x más rápido en tus proyectos.

Pero el camino no llega hasta aquí. Te animo a seguir con el Curso de Python: Comprehensions, Funciones y Manejo de Errores para que pongas a prueba todo lo que acabas de aprender en este blog.

Finalmente, me gustaría que dejes en los comentarios si conoces algún otro concepto que creas relevante para desarrollar en Python. Te estaré leyendo.

Axel
Axel
axl-yaguana

50653Puntos

hace un año

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
2
11090Puntos

Excelente recopilación de las principales temáticas del Curso de Python: Comprehensions, Funciones y Manejo de Errores, el cual ya estoy por finalizar 💚

1
50653Puntos
9 meses

¡Genial! Me alegro mucho por eso, Sara. 🚀

2
4918Puntos

Buenísimo el articulo! , además sirve para aquellos que estén adentrándose en el mundo de Python como es mi caso!. Hermoso aporte Axel 👏

2
50653Puntos
un año

¡A darle con todo, Angela!

Cuentas con el apoyo de toda la comunidad. 💪

2
5196Puntos

Python es un lenguaje hermoso, gracias por el artículo.

2
50653Puntos
un año

Totalmente, Iani. Es un lenguaje muy querido por la comunidad.

2
41995Puntos

Excelente atículo, algunas cosas que aportar:

1-. Desde cierta versión de python3 se usa una nueva sintaxis más agradable para concatenar string, en vez de usar

return'Hello, {name}!'.format(name=name)

Ahora se usa

name = 'Carlos'return f'Hello, {name}!'

.
2-. Para activar los ambientes virtuales, el comando es para linux

source nameOfVirtualEnv/bin/activate

Si quieren hacerlo desde windows con power shell es

.\nameOfVirtualEnv\Scripts\activate

.
3-. Para entender mejor los *args y **kwargs hay primero entender que el asterisco simple (*) es para destructurar listas o tuplas, y el asterisco doble (**) es para destructurar diccionarios, es decir, que si usamos una función que reciba estos parámetros nos imprimirá una lista y un diccionario en la ejecución de estos, ejemplo

defprint_values(*args, **kwargs):
	print(args)
	print(kwargs)

print_values(1, 2, "3", a=4, b=5, c="6")
# results:# (1, 2, '3')# {'a': 4, 'b': 5, 'c': '6'}
2
50653Puntos
un año

Excelente tu aporte, Carlos. Muchas gracias por compartir. 😄

2
3389Puntos

Muy bueno, muchas gracias, yo me confundo un poco con el apply y el map

1
50653Puntos
un año

¡Hola, Edwar!

Al apply lo usamos para DataFrames. Por otra parte, el map se aplica sobre un iterable, como una lista, por ejemplo. Esta es la principal diferencia.

2
1240Puntos

Excelente artículo, aunque tanto map y las funciones lambdas se ven fáciles de entender, al menos a mí me cuesta aplicarlas bien.