Operador Walrus en Python



@eduardo_gpg

Número de visitas 1201

Tiempo de lectura 3 min

10 Octubre 2021

A partir de la versión 3.8 de Python se añade el operador := de forma nativa al lenguaje. Operador al cual común mente conoceremos como walrus operator, por el parecido que tienen los caracteres con los ojos y bigotes de una morza. 🤓

Aun que oficialmente lo conoceremos como assignment expression operator (Aun que nadie le diga así). 🤭

En términos simples, este nuevo operador nos permite asignar un valor a una variable al mismo tiempo que se evalúa como expresión.

Puede sonar a una explicación algo confusa, 🤯 así que veamos un par de ejemplos.

Verás, en versiones anteriores de Python, para nosotros poder evaluar una expresión y utilizar el resultado posteriormente en una variable, primero debíamos definir la variable y posteriormente evaluarla como expresión.

Algo como lo siguiente.

resultado = (10 + 20 ) / 2

if resultado > 10:
    print(f'El resultado ( {resultado} ) es mayor que 10.')
else:
    print(f'El resultado ( {resultado} ) es menor que 10.')

Un fragmento de código bastante sencillo. Me atrevo a decir que la mayoría de nosotros posiblemente llegaríamos al mismo resultado.

Primero creamos la variable a partir de una operación y posteriormente la evaluamos.

Si bien esto funciona bástate bien, con el operador Walrus podemos mejorar aun más nuestro código.

if (resultado := (10 + 20 ) / 2)> 10:
    print(f'El resultado ( {resultado} ) es mayor que 10.')
else:
    print(f'El resultado ( {resultado} ) es menor que 10.')

Ahora, como podemos observar, es en la misma condición donde se declara y asigna el valor a la variable, pudiendo así evaluarla. 🥳

Al hacer esto, la variable ya puede ser utilizad en el resto del programa, tanto en el bloque del if (Cuando la condición se cumpla) como en el bloque del else (Cuando la condición no se cumpla). 🤠

Para lograr esto, obligatoriamente la definición de la variable debe encontrarse entre paréntesis, ya que se ejecuta como expresión.

Error.

>>> variable := 'Valor'
  File "<stdin>", line 1
    variable := 'Valor'

Uso correcto.

>>> (variable := 'Valor')
'Valor'

Una vez la variable es creada, ya puede ser utilizada en cualquier parte del código, claro, siempre y cuando sea en el mismo bloque donde se crea (Por temas de alcance).

Esto resulta de mucha utilidad cuando no deseamos repetir el llamado a una función o repetir algún tipo de expresión. 😎

Y por si te lo estabas preguntado, el operador walrus puede ser utilizado en prácticamente cualquier parte de nuestro código, no solo para condicionar. Veamos un par de ejemplos más.

Ciclo While

while True:
    secreto = input('Ingresa la palabra secreta: ')

    if secreto == 'PyWombat':
        print('Felicidades, la palabra secreta es PyWombat')
        break

    print(f'Lo siento, {secreto} no es la palabra secreta')

Ciclo While con Walrus operator

while (secreto := input('Ingresa la palabra secreta: ')) != 'PyWombat':
    print(f'Lo siento, {secreto} no es la palabra secreta')
else:
    print('Felicidades, la palabra secreta es PyWombat')

Ciclo For

users = [
    {'username': 'User1', 'email': 'user1@example.com' },
    {'username': 'User2', 'email': 'user1@example.com' },
    {'username': 'User3' },
    {'username': 'User4' },
]

for user in users:
    if user.get('email'):
        print('El correo del usuarios es', user['email'])

Ciclo For con Walrus operator

users = [
    {'username': 'User1', 'email': 'user1@example.com' },
    {'username': 'User2', 'email': 'user1@example.com' },
    {'username': 'User3' },
    {'username': 'User4' },
]

for user in users:
    if (email := user.get('email')):
        print('El correo del usuarios es', email)

Creación de diccionario

calificaciones = [10, 10, 9, 8, 8, 10, 10, 10]
total = sum(calificaciones)
promedio = len(calificaciones) / total

{
    'calificaciones': calificaciones,
    'total': total,
    'promedio': promedio
}

Creación de diccionario con Walrus operator

{
    'calificaciones': (calificaciones:= [10, 10, 9, 8, 8, 10, 10, 10]),
    'total': (total:= sum(calificaciones)),
    'promedio': len(calificaciones) / total
}

Conclusión

Sí bien, con el uso del operador walrus es posible reducir las líneas de código, también hay que ser consientes que la legibilidad en nuestro código cuenta, por lo tanto te recomiendo hacer uso de este operador siempre que sea necesario, por ejemplo, cuando evaluemos expresiones computacionalmente complejas y simplemente no debamos, o no podamos, evaluarlas más de una vez. 🥂


¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍