¿Qué significa dos puntos iguales (:=) en Python?

Resuelto Julio asked hace 10 años • 6 respuestas

¿Qué significa el :=operando, más específicamente para Python?

¿Alguien puede explicar cómo leer este fragmento de código?

node := root, cost = 0
frontier := priority queue containing node only
explored := empty set
Julio avatar Sep 23 '14 23:09 Julio
Aceptado

Respuesta actualizada

En el contexto de la pregunta, estamos tratando con pseudocódigo, pero a partir de Python 3.8 , :=en realidad es un operador válido que permite la asignación de variables dentro de expresiones:

# Handle a matched regex
if (match := pattern.search(data)) is not None:
    # Do something with match

# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
   process(chunk)

# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]

# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]

Consulte PEP 572 para obtener más detalles.

Respuesta original

Lo que has encontrado es pseudocódigo.

El pseudocódigo es una descripción informal de alto nivel del principio operativo de un programa de computadora u otro algoritmo.

:=es en realidad el operador de asignación. En Python esto es simplemente =.

Para traducir este pseudocódigo a Python, necesitaría conocer las estructuras de datos a las que se hace referencia y un poco más de la implementación del algoritmo.

Algunas notas sobre el pseudocódigo:

  • :=es el operador de asignación o =en Python
  • =es el operador de igualdad o ==en Python
  • Hay ciertos estilos y su kilometraje puede variar:

estilo Pascal

procedure fizzbuzz
For i := 1 to 100 do
    set print_number to true;
    If i is divisible by 3 then
        print "Fizz";
        set print_number to false;
    If i is divisible by 5 then
        print "Buzz";
        set print_number to false;
    If print_number, print i;
    print a newline;
end

estilo C

void function fizzbuzz
For (i = 1; i <= 100; i++) {
    set print_number to true;
    If i is divisible by 3
        print "Fizz";
        set print_number to false;
    If i is divisible by 5
        print "Buzz";
        set print_number to false;
    If print_number, print i;
    print a newline;
}

Tenga en cuenta las diferencias en el uso de llaves y el operador de asignación.

Mike McMahon avatar Sep 23 '2014 16:09 Mike McMahon

PEP572 propuso soporte para el :=operador en Python para permitir asignaciones de variables dentro de expresiones.

Esta sintaxis está disponible en Python 3.8.

chadlagore avatar Apr 27 '2018 22:04 chadlagore

Este símbolo :=es un operador de asignación en Python (principalmente llamado operador Walrus ). En pocas palabras, el operador morsa comprime nuestro código para hacerlo un poco más corto.


He aquí un ejemplo muy sencillo:

# without walrus
n = 30
if n > 10:
    print(f"{n} is greater than 10")

# with walrus
if (n := 30) > 10:
    print(f"{n} is greater than 10")

Estos códigos son los mismos (y generan lo mismo), pero como puede ver, la versión con el operador morsa está comprimida en solo dos líneas de código para hacer las cosas más compactas.


Ahora bien, ¿por qué utilizarías el operador morsa?

En primer lugar, no se sienta obligado.

Yo mismo rara vez uso este. Solo estoy usando el operador morsa para comprimir un poco mi código, principalmente cuando trabajo con expresiones regulares .

También puede encontrar su propio caso de uso de esto. Lo importante es que tenga una idea aproximada al respecto y sepa cuándo podría resultar útil cuando se encuentre con un problema como este.

Y así es como puedo explicar el operador de morsa en un nivel superior. Espero que hayas aprendido algo.

menard_codes avatar Sep 14 '2020 00:09 menard_codes

El código de la pregunta es pseudocódigo; allí, :=representa asignación.

Sin embargo, para futuros visitantes, lo siguiente podría ser más relevante: la próxima versión de Python (3.8) obtendrá un nuevo operador, que :=permitirá expresiones de asignación (los detalles, los ejemplos motivadores y la discusión se pueden encontrar en PEP 572 , que fue aceptado provisionalmente). a finales de junio de 2018).

Con este nuevo operador, puedes escribir cosas como estas:

if (m := re.search(pat, s)):
    print m.span()
else if (m := re.search(pat2, s):
    …

while len(bytes := x.read()) > 0:
    … do something with `bytes`

[stripped for l in lines if len(stripped := l.strip()) > 0]

en lugar de estos:

m = re.search(pat, s)
if m:
    print m.span()
else:
    m = re.search(pat2, s)
    if m:
        …

while True:
    bytes = x.read()
    if len(bytes) <= 0:
        return
    … do something with `bytes`

[l for l in (l.strip() for l in lines) if len(l) > 0]
Clément avatar Jul 06 '2018 03:07 Clément