Operador Walrus En Python

Fecha de publicaci贸n: 10 Octubre 2021
Tiempo de lectura: 3 min.
Premium: False
N煤mero de visitas: 82


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. 馃

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. 馃悕