¿Qué hace ‘yield’ en Python?

yield es una orden muy similar a un return, con una gran diferencia, yield pausará la ejecución de tu función y guardará el estado de la misma hasta que decidas usarla de nuevo. ¿Confuso? Vamos a verlo en un ejemplo.

Queremos calcular los cuadrados de una lista de números que se pasan como parámetro. Una solución podría ser la siguiente:

def squares(numbers):
  return [number*number for number in numbers]

# si hacemos la siguiente llamada
> squares([1,2,3,4,5])

# el resultado será
[1, 4, 9, 16, 25]

Esta forma de hacerlo tiene un problema, todos los resultados se generan de una vez. Si la lista numbers fuese muy grande, el tiempo de ejecución podría ser considerable.

¿Y si pudiéramos calcular los cuadrados uno a uno? Si no necesitamos todos los resultados, esto podría ser muy útil. Ahora es cuando yield va a ser muy útil.

def squares(numbers):
  for number in numbers:
    yield number*number

# esta vez, si hacemos la siguiente llamada, no obtenemos resultados
# sino que vamos a crear un generador
> squares([1,2,3,4,5])
<generator object squares at 0x10e47f2a0>

# podemos iterar sobre el generador
# si ejecutamos
> for square in squares([1,2,3]):
.   print(square)
1
4
9

De esta forma, sólamente calcularemos los cuadrados que necesitamos. Si en algún momento el bucle se interrumpe, no se calculará ninguno más.

Yield es muy útil se generamos secuencias infinitas que, obviamente, no se pueden calcular con antelación. Por ejemplo, calculemos todos los números naturales:

def numeros_naturales():
  n = 1
  while True:
    yield n
    n += 1

> for natural in numeros_naturales():
.   print(natural)
1
2
3
...

Yield es la declaración que se utiliza para crear generadores, como ya expliqué en Generadores en Python hace mucho mucho tiempo.

Espero que sea útil. ¡Saludos!

Publicado por AlvaroLab

Enamorado de la gastronomía en todas sus facetas: la cocina, sus ingredientes, la agricultura, la nutrición y los restaurantes; diferentes países, culturas, tradiciones y costumbres.

Únete a la conversación

6 comentarios

    1. La pregunta sería ¿pueden haber 2 yields en la misma función?

      La respuesta es sí. Se ejecutarían alternativamente.

      Es decir una función como esta:
      def yield_test():
      yield «a»
      yield «b»

      Producirá «a», «b», «a», «b»… alternativamente. La segunda ejecución de la función comienza en el último yield que se ejecutó.

      Me gusta

Dejar un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: