# Generators # Generators are very easy to implement, but a bit difficult to understand. # Generators are used to create iterators, but with a different approach. Generators are simple functions which return an iterable set of items, one at a time, in a special way. # When an iteration over a set of item starts using the for statement, the generator is run. Once the generator's function code reaches a "yield" statement, the generator yields its execution back to the for loop, returning a new value from the set. The generator function can generate as many values (possibly infinite) as it wants, yielding each one in its turn. # Here is a simple example of a generator function which returns 7 random integers: import random def lottery(): # returns 6 numbers between 1 and 40 for i in range(6): yield random.randint(1, 40) # returns a 7th number between 1 and 15 yield random.randint(1, 15) for random_number in lottery(): print("And the next number is... %d!" %(random_number)) import os pathofcars = os.path.abspath("cars.csv") def lineofCars(loc): with open(loc,'r') as file: for line in file: yield line text = lineofCars(pathofcars) print(next(text)) print(next(text)) print(next(text)) #Change the values of two variables a = 1 b = 2 a, b = b, a print(a, b) # Exercise # Write a generator function which returns the Fibonacci series. They are calculated using the following formula: The first two numbers of the series is always equal to 1, and each consecutive number returned is the sum of the last two numbers. Hint: Can you use only two variables in the generator function? Remember that assignments can be done simultaneously. The code # fill in this function def fib(): pass #this is a null statement which does nothing when executed, useful as a placeholder. a, b = 1, 1 for num in range(6): a, b = b, a+b yield a + b # testing code import types if type(fib()) == types.GeneratorType: print("Good, The fib function is a generator.") counter = 0 for n in fib(): print(n) counter += 1 if counter == 10: break