Introducción
Python 3.8, lanzado en octubre de 2019, agrega expresiones de asignación a Python usando la sintaxis :=
. La sintaxis de la expresión de asignación a veces también se llama "el operador de morsa" porque :=
se parece vagamente a una morsa con colmillos.
Las expresiones de asignación permiten la asignación de variables dentro de expresiones más grandes. Si bien las expresiones de asignación nunca son estrictamente necesarias para escribir código Python correcto, pueden ayudar a que el código Python existente sea más conciso. Por ejemplo, las expresiones de asignación que usan la sintaxis :=
permiten asignar variables dentro de las if
, que a menudo pueden producir secciones más cortas y compactas de código Python al eliminar las asignaciones de variables en las líneas antes o después de la if
.
En este tutorial, usará expresiones de asignación en varios ejemplos para producir secciones de código concisas.
Prerrequisitos
Para aprovechar al máximo este tutorial, necesitará:
- Python 3.8 o posterior. Las expresiones de asignación son una nueva característica agregada a partir de Python 3.8. Puede ver los tutoriales de Python en esta dirección.
- Cierta familiaridad con
while
los bucles,if
, lista de acuerdos, y funciones en Python 3 son útiles, pero no es necesario.
Usar expresiones de asignación en declaraciones if
Comencemos con un ejemplo de cómo puede usar expresiones de asignación en una instrucción if
Considere el siguiente código que verifica la longitud de una lista e imprime una declaración:
some_list = [1, 2, 3]
if (list_length:= len(some_list)) > 2:
print("List length of", list_length, "is too long")
Si ejecuta el código anterior, obtendrá el siguiente resultado:
List length of 3 is too long
Inicializa una lista denominada some_list
que contiene tres elementos. Luego, la if
usa la expresión de asignación ((list_length:= len(some_list))
para vincular la variable llamada list_length
a la longitud de some_list
. La if
devuelve True
porque list_length
es mayor que 2
Imprime una cadena usando la variable list_length
, que inicialmente se asoció con la expresión de asignación, lo que indica que la lista de tres elementos es demasiado larga.
Nota: LasPython 3.8
Si no hubiéramos usado la expresión de asignación, nuestro código podría haber sido un poco más largo. Por ejemplo:
some_list = [1, 2, 3]
list_length = len(some_list)
if list_length > 2:
print("List length of", list_length, "is too long")
Este ejemplo de código es equivalente al primer ejemplo, pero este código requiere una línea independiente adicional para asignar el valor de list_length
a len(some_list)
.
Otro ejemplo de código equivalente podría ejecutar len(some_list)
dos veces: una vez en la if
y una vez en la print
. Esto evitaría encontrarse con la línea adicional requerida para vincular una variable al valor de len(some_list)
:
some_list = [1, 2, 3]
if len(some_list) > 2:
print("List length of", len(some_list), "is too long")
Las expresiones de asignación ayudan a evitar la fila adicional o el cálculo doble.
Nota: Las
En la siguiente sección, vamos a explorar el uso de expresiones de asignación dentro while
bucles.
Usar expresiones de asignación en bucles while
Expresiones de asignación menudo funcionan bien en while
los bucles, ya que nos permiten poner más contexto a la condición del bucle.
Consideremos el siguiente ejemplo la incrustación de una input
función dentro del while
condición de bucle:
while (directive:= input("Enter text: "))!= "stop":
print("Received directive", directive)
Si ejecuta este código, Python le pedirá continuamente que ingrese texto desde el teclado hasta que escriba la palabra stop
. Una sesión de ejemplo podría verse así:
>>> while (directive:= input("Enter text: "))!= "stop":... print("Received directive", directive)...
Enter text: hello
Received directive hello
Enter text: example
Received directive example
Enter text: stop
>>>
La expresión de asignación (directive:= input("Enter text: "))
vincula el valor de la directive
al valor recuperado por el usuario a través de la función de input
Asociar el valor de retorno con la directive
variable, que se imprime en el cuerpo del while
de bucle. El while
bucle termina cada vez que escriba stop
.
Si no hubiera utilizado una expresión de asignación, es posible que haya escrito un bucle de input
directive = input("Enter text: ")
while directive!= "stop":
print("Received directive", directive)
directive = input("Enter text: ")
Este código es funcionalmente idéntico al de las expresiones de asignación, pero requiere cuatro líneas en total (en lugar de dos líneas). También duplica la input("Enter text: ")
en dos lugares. Por supuesto, hay muchas formas de escribir un while
, pero la variante de la expresión de asignación presentada anteriormente es compacta y captura bien la intención del programa.
Hasta ahora, usted ha estado utilizando expresiones de asignación en if
y while
bucles. En la siguiente sección, usará una expresión de asignación dentro de una lista de comprensión.
Usar expresiones de asignación en entendimientos de listas
También podemos usar expresiones de asignación en la comprensión de listas. Comprender las listas le permite crear listas de manera sucinta iterando sobre una secuencia y potencialmente agregando elementos a la lista que cumplen con ciertas condiciones. Al igual que la comprensión de las listas, podemos usar expresiones de asignación para mejorar la legibilidad y hacer que nuestro código sea más conciso.
Considere el siguiente ejemplo que usa una comprensión de lista y una expresión de asignación para crear una lista de números enteros multiplicados:
def slow_calculation(x):
print("Multiplying", x, "*", x)
return x * x
[result for i in range(3) if (result:= slow_calculation(i)) > 0]
Si ejecuta el código anterior, recibirá lo siguiente:
Multiplying 0 * 0
Multiplying 1 * 1
Multiplying 2 * 2
[1, 4]
Definimos una función llamada slow_calculation
que multiplica el número dado x
por sí mismo. Luego, se repitió una lista de comprensión a través de 0
, 1
y 2
devueltos por range(3)
. Una expresión de asignación vincula el result
del valor al retorno de slow_calculation
con i
. Agregue el result
a la lista recién creada, siempre que sea mayor que 0
. En este ejemplo, 0
, 1
y 2
son todos múltiplos de sí mismos, pero solo los resultados 1
( 1 * 1
) y 4
( 2 * 2
) satisfacen la condición mayor que 0
y pasan a formar parte de la lista final [1, 4]
.
La slow_calculation
lento no es necesariamente lenta en términos absolutos, pero está destinada a ilustrar un punto importante sobre la eficiencia. Considere una implementación alternativa del ejemplo anterior sin expresiones de asignación:
def slow_calculation(x):
print("Multiplying", x, "*", x)
return x * x
[slow_calculation(i) for i in range(3) if slow_calculation(i) > 0]
Al ejecutarlo, recibirá el siguiente resultado:
Multiplying 0 * 0
Multiplying 1 * 1
Multiplying 1 * 1
Multiplying 2 * 2
Multiplying 2 * 2
[1, 4]
En esta variación del código anterior, no usa expresiones de asignación. En su lugar, slow_calculation
hasta dos veces: una vez para asegurarse de que slow_calculation(i)
sea mayor que 0
y potencialmente una segunda vez para agregar el resultado del cálculo a la lista final. 0
se multiplica por sí mismo una vez porque 0 * 0
no es mayor que 0
. Los otros resultados, en cambio, se calculan doblemente porque satisfacen la condición mayor que 0, por lo que los resultados se recalculan para formar parte de la lista final [1, 4]
.
Ha combinado expresiones de asignación con comprensión de listas para crear bloques de código eficientes y concisos.
Conclusión
En este tutorial, usó expresiones de asignación para crear secciones compactas de código Python que asignan valores a variables dentro de if
while
bucles while y comprensiones de listas.
Para obtener más información sobre otras expresiones de asignación, puede ver PEP 572, el documento que inicialmente propuso agregar expresiones de asignación a Python.