Skip to main content

Understand the generators and yield keyword in python, on Python Hunter


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 Python Hunter on youtube   Follow Python Hunter on twitter Follow on tumbl ( at your own risk ) check profile on linkedIn 
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.


Comments

  1. This was short and comprehensive example to understand the actual concept of generators with yield.
    Aman Salaria

    ReplyDelete

Post a Comment

Thanks in anticipation.

Popular posts from this blog

Understanding the usage of underscore( _ ) of Python for beginner. On Python Hunter

Introduction: Just like you, a newbie in python scripting language, me too was confused about lot of new things in python that are not valid or available in other languages like Java, .Net etc. Just like other things i had seen the use of '_' underscore in python, at beginning level that flabbergasted me for a while.      With some research and practice i have summarised the following usage of '_' underscore in python. Hope you will find it helpful at beginning level. First Usage : Hold the previous output value. When used in interpreter. 1 2 3 4 5 6 7 _ = input () # For example you typed '5' print (_) # This will print '5' print ( int ( _ ) * int ( _ ) ) # This will print '25' print ( int ( _ ) + 10 ) The above will print '15', because last input was "5" and in above   line of code is producing '25' as output but not being handl...

regex in python python hunter

Regular Expressions is a powerful concept if understood clearly you can save your valuable time to extract out the particular text from huge string or paragraph. It is wildly pronounced as regex, it can help you to automate the boring stuff, like searching particular text form log files, python used this same concept in web scrapping. Below are some common examples to understand the regex. Method names will help you to have an idea that what exactly the regex is intended to do. if you don't understand any regex or want to create your own regex with your requirements then you can comment below, i'll reach you ASAP. Thanks. import re def phoneNumberPattern (): print ( "*" * 10 ) print ( "phoneNumberPattern()" ) regexObj = re . compile( r'\d\d\d-\d\d\d-\d\d\d\d' ) mo = regexObj . search( 'Find my phone number from this string 998-805-4332' ) print (mo . group()) def grouping (): print ( "*...

XSLT applyTemeplate tag by pran sukh on Python Hunter.

XSLT is used for presenting XML data in well structured way and in eye appealing sense. In XSLT we can define different templates and maintain criteria for XSLT processor to parse the XML data in and apply different template for different XML tags. Lets examine following example XML DATA. 1 2 3 4 5 6 7 8 9 10 <student id= "1" eCode= "e1" > <firstName> Python 1 </firstName> <lastName> Hunert 1 </lastName> <dob> <day> 01 </day> <month> Jan </month> <year> 1991 </year> </dob> <course> Programmer </course> </student> In above XML data we want to present student id with dark background and eCode with red background colors, First Name in blue color, last name in green color and date of birth in different modes, so it will look like this. Source File:- XML_DATA.xml 1 2 3 4 5 6 7 8 9 10 ...