martes, 25 de febrero de 2020

Expresiones de asignación (:=)



Las expresiones de asignación es una novedad que incorpora la sintaxis de Python 3.8 para asignar valores a variables que son parte de una expresión, evitándose con ello el tener que inicializarlas con antelación.

Para este tipo de asignación se utiliza dentro de la expresión el operador morsa := (walrus en inglés) que añade claridad y simplicidad al código.

A continuación, varios casos de uso:

# Inicializar una variable antes de utilizarla
# es lo que siempre hemos hecho:

edad = 18
print(edad)  # 18

# Ahora se puede inicializar en una expresión
# que además es evaluada inmediatamente:

print(edad:=18)  # 18


# Antes, para guardar el valor de una
# función se asignaba previamente a una
# variable y después esta se podía utilizar: 

def media(nota1, nota2):
    return (nota1 + nota2) / 2

   
notafinal = media(6, 8)
if notafinal >= 5:
    print('Aprobado con:', notafinal)

# Ahora las dos acciones se pueden
# hacer en una misma línea:

if (notafinal:=media(6, 8)) >= 5:
    print('Aprobado con', notafinal)
    

# Antes para hacer una asignación en
# un bucle se hacía dentro del mismo:

lista_compra = list()
while True:
    articulo = input('¿Qué necesitas comprar?: ')
    if articulo == '':
        print(lista_compra)
        break
    
    lista_compra.append(articulo)

# Ahora la misma asignación se puede hacer
# en la misma línea de while:

lista_compra = list()
while (articulo := input('Qué necesitas comprar?: ')) != '':
    lista_compra.append(articulo)

print(lista_compra)

Las expresiones de asignación también se pueden utilizar en listas de comprensión:

parcelas_m2 = [220, 320, 180, 430]
precios = [(precio_m2:=100) * sup for sup in parcelas_m2] 
print(f'{precios} al precio de {precio_m2} € el m2')

# [22000, 32000, 18000, 43000] al precio de 100 € el m2

El uso de paréntesis en las expresiones de asignación es fundamental para delimitar exactamente el valor que se asigna a una variable:

# En el ejemplo que sigue a la variable no se
# asigna el valor 10, se asigna el resultado
# de comparar 10 y 5, es decir, True

if precio:=10 > 5:
    print(precio)  # True

# En este caso queda más claro que es 10 el
# valor asignado a la variable precio:

if (precio:= 10) > 5:
    print(precio)  # 10


# Los paréntesis también permiten anidar expresiones
# para una asignación múltiple:

(total:= (precio:=10) * 5)
print(precio, total)  # 10


# Pero atención, recuerda que existe una diferencia
# básica entre el uso de = y := en una asignación:

# En el siguiente ejemplo se asigna una tupla
# de 3 valores a la variable:

var1 = 0, 1, 2
print(var1)  # (0, 1, 2)

# Y en la siguiente expresión se asigna solo el
# primero de los valores: 0

(var1 := 0, 1, 2)
print(var1)  # 0

# Lo recomendable en estos casos es delimitar
# también por paréntesis los valores de la tupla:

(var1 := (0, 1, 2))
print(var1)

# Con delimitar solo los valores de la tupla no
# es suficiente. Hacerlo genera un error de
# sintaxis:

var1 := (0, 1, 2)  # SyntaxError