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!
gracias!
Me gustaLe gusta a 1 persona
Hola, se pueden tener dos yield en un mismo proyecto django? como los diferencia? Gracias
Me gustaMe gusta
Si, se pueden tener 2 yield en una misma función. La ejecución continuará justo después del último yield que se ejecutó.
Me gustaMe gusta
Hola se pueden tener dos yield en un mismo proyecto Django? como distingue a donde debe regresar? Gracias
Me gustaLe gusta a 1 persona
Hola, pueden haber dos yields en un mismo proyecto Django? Como los distingue? Gracias
Me gustaMe gusta
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 gustaMe gusta