This short post describes what is a generator in Python.
A function with yield in it is a function. However, when called the function, it returns a generator object. Generators allow you to pause a function and return an intermediate result. The function saves its execution context and can be resumed later if necessary.
def fibonacci(): a, b = 0, 1 while True: yield b a, b = b, a + b g = fibonacci() [next (g) for i in range(10)]
This will return [1, 1, 2, 3, 5, 8, 13, 21, 34, 55].
When call the list comprehension again, it will return:
[next (g) for i in range(10)]
[89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
Here, note the function is like a machine that can generate what you want. It will also remember its last state. This is different from a function that returns a list, which will not remember its last state..
Python generators can also interact with the code called with the next method. yield becomes an expression, and a value can be passed along with a new method called send. Here is an example piece of code:
def psychologist(): print("Please tell me your problem") while True: answer = (yield) # note the usage of yield here if answer is not None: if answer.endswith("?"): # note it's endSwith, the s there print("Don't ask yourself too many questions.") elif "good" in answer: print("A that's good, go on. ") elif "bad" in answer: print("Don't be so negative.")
This defines a function that can return a generator.
free = psychologist() type(free)
This will return “generator”
This will return “Please tell me your problem.”
This will return “Don’t ask yourself too many questions.”
free.send("I'm feeling bad.")
This will return “Don’t be so negative.”
free.send("But she is feeling good!")
This will return, “A that’s good, go on.”
send acts like next, but makes yield return the value passed. The function can, therefore, change its behavior depending on the client code.