Generators look like a function but there is huge difference b/w generators and function. Instead of return statements you will find only yield statements are used inside of the body of a generator , i.e. one or more yield statements.
In short the main feature of generator is that the last execution statement is kept remembered by python interpreter and the next time when the same generator is called the it execute from the last yield location instead of starting the location from TOP. And the state of all local variable(s) are kept safe, that means the local variable(s) will not change their value(s) at next call.
Follow the example to understand the concept.
def gen():
yield 1
yield 2
yield 3
yield 4
f=gen()
print(next(f)) # will print 1
print(next(f)) # will print 2
print(next(f)) # will print 3
Let's take a real example...........
--------------------------------------------------CODE STARTS------------------------------------------
import time
def red_cars(arg0 = None):
n = 0
while True:
if arg0 == "y":
n = n + 1
arg0 = yield n
else:
arg0 = yield n
car_color = red_cars()
#Python 2.x
#car_color.next()
#Python 3.x
car_color.__next__()
#Common method, works in both versions
# next(car_color)
stop = time.time() + 5 * 60
while time.time() < stop:
answer = input('Did you spot a red car on the road? ("y" or "n"): ')
print ('You have spotted ' + str(car_color.send(answer)) + ' cars so far!')
--------------------------------------------------CODE ENDS------------------------------------------
Explanation:-
when car_color = red_cars() executes (without any param) it gets the generator object,
then the car_color.__next__() initialize the generator and n is initalized to 0 and while loop executes and the else block executes because the "arg0" is not equal to "y".
The the console ask for input..
that input is send to generator with send(answer)..
now the real magic happens here.....
normally in method invocation the method execution start from top.
But when the yield keyword is used in any method then that method becomes generator.
and when that same method is invoked again the execution starts directly from the next statement of previous yield location (did not get it? don't worry the below screen shots will make it easy to understand).
when str(car_color.send(answer)) gets executed with input variable it calls the generator and gets the yielded value as returned value from generator.
Screen Shot:-
if you still don't get, feel free to email me with your queries at hitman47silent994c4@gmail.com.
This was short and comprehensive example to understand the actual concept of generators with yield.
ReplyDeleteAman Salaria