7

Yield in python

Llegó el momento en que me pregunté, ¿Qué hace yield en python? Es el momento de responder esa pregunta, pero para ello hay que entender qué es un iterable y qué es un iterator

<h1>Iterable here!</h1>

Se le llama así a un objeto que es capaz de retornar sus miembros uno a la vez. Entre los iterables se encuentran estructuras de secuencia como son:

  • strings. str
  • listas. list
  • tuples. tuple

Y estructuras no secuenciales como dictionaries dict o file objects.
Para resumir un poco más el cuento, objetos de cualquier clase que tu definas con un _ _ iter() _ _ method o un _ _ getitem() _ _ method que implemente una semántica secuencial.

Los iterables pueden ser usados en un ciclo for y en otros lugares donde una secuencia se necesite. Cuando un objeto iterable pasa por una built_in function llamada iter() el cuál te regresará un iterador del objeto…

iterador: Objeto que está representando un flujo de datos.
Este iterador es bueno para dar un paseo sobre el conjunto de valores.

Generalmente cuando nosotros usamos un iterable, no es necesario pasar el objeto por la función iter(), el bucle for lo hace por nosotros, creando una variable temporal sin nombre que mantiene el iterador durante la duración del ciclo.

<h1>Yield (entregar) here!</h1>

Me apoyaré de un código para explicarlo mejor.

defsquare(nums):
	list = []
	for i in nums:
		list.append(i)
	return list

someNums = square([1, 2, 3, 4, 5])

print someNums

#Esto imprime [1, 4, 9, 16, 25]

Como ustedes pueden ver, creamos primero una lista, a esa lista le agregamos los valores de la iteración, y esa lista mantiene los valores en memoria. Pero un código equivalente sería:

defsquare(nums):for i in nums:
		yield(i*i)

someNums = square([1, 2, 3, 4, 5])

print someNums

# Esto imprime:# <generator object square at 0x1004dc500>

Porque los generadores no mantienen el resultado completo en memoria, ellos entregan a una dirección un valor a la vez y hay que acceder a ellos con cualquier función secuencial como next(), esto se puede hacer de muchas maneras, una de ellas es:

printnext(someNums)
printnext(someNums)
printnext(someNums)
printnext(someNums)
printnext(someNums)

# Imprime:# 1# 4# 9# 16# 25

El cuál va a usar el método next() para recorrer cada uno de los valores que le entregó a la memoria. La otra opción es:

fornumin someNums:
	print(num)

//Imprime la misma cuestión

(Lo siento por el // pero no mostaba como yo quería)
Espero que haya quedado un poco más clara la función de yield dentro del código, claro que haría falta agregar lo que es una list comprehensions para poder hacer el mismo código en una sola línea, pero ahí ya no estaríamos usando yield explícitamente aunque sí implícitamente. Espero me haya habido explicar y les haya servido de algo mi tutorial, las referencias están en los títulos. Gracias por su atención.

Escribe tu comentario
+ 2
0
22924Puntos

Una disculpa, no sabía que me iba a poner así los títulos