Generators in Python

Generators in Python

Search for: Generators in Python

Generators are iterators. They are closely related to yield

In language reference yield is documented here

The yield expression is used when defining a generator function or an asynchronous generator function and thus can only be used in the body of a function definition. Using a yield expression in a function?s body causes that function to be a generator, and using it in an async def function?s body causes that coroutine function to be an asynchronous generator

When a generator function is called, it returns an iterator known as a generator. That generator then controls the execution of the generator function. The execution starts when one of the generator?s methods is called.

it appears, the first call that returns the generator DOES NOT RESULT in any execution of the body of the function at all!!

During first call to one of the functions of generator iterator, At that time, the execution proceeds to the first yield expression, where it is suspended again, returning the value of expression_list to the generator?s caller

Understand the "send" later.


#*********************************************
# Just a utility function that converts
# an ISO string to a filename based on the hour
#*********************************************
#Date format: 2019-09-01 00:05:00.000

def getFilename(datetimeInstanceString):
    fileBasename = "somebase-filename-for-"
    #i - instance
    i = datetime.fromisoformat(datetimeInstanceString)

    #see the formating options for padding 
    #integers are padded with 0s
    filePostFix = (
        "{}{:02d}{:02d}{:02d}"
        .format(i.year, i.month,i.day, i.hour)
    )
    return fileBasename + filePostFix + ".csv"

#*********************************************
# An Example Generator
# ********************
# 1. Read each line in a file (like a cursor)
# 2. Eliminate lines that needs eliminating
# 3. Present the results as if this is an iterator
#*********************************************
def SpecialFileGenerator(inFilename):
    #remember filename
    filename = inFilename
    print("opening file:", inFilename)
    inputFileObj = open(inFilename)
    for idx, line in enumerate(inputFileObj) :
        #ignore first line
        if (idx == 0): 
            print("ignoring first line")
            continue
        #for each line: only do 6 lines
        if (idx > 6): 
            print ("returning")
            return
        fieldList = line.split(",")
        isoDateTime = fieldList[0]
        yield getFilename(isoDateTime)

#*********************************************
#test the generator
#*********************************************
#No code in SpecialFileGenerator is executed at this point
filegen = SpecialFileGenerator(inputWuActualWeatherForAWeek)

#You will see this line printed first
print("filegen created")

#The function is now executed from top
#and gets suspended after the first row
#as it encounters the yield after the first row
for line in filegen:
    print("from filegen:", line)

the enumerate function's index is 0 based: fyi