Screenplay: Python: The Yield Statement

Fibonacci Numbers: Naive List

#!/usr/bin/python

def fibonacci():
    fibo_numbers = []

    previous = 1
    current = 1
    while True:
        next = previous + current
        fibo_numbers.append(next)
        previous, current = current, next
        
    return fibo_numbers

if __name__ == '__main__':
    for num in fibonacci():
        print(num)
  • watch OS become overly jerky, until process is OOM-killed

  • well, there’s need for a limit

Fibonacci Numbers: Naive List, Limited

#!/usr/bin/python

def fibonacci(max_numbers=100):
    fibo_numbers = []

    previous = 1
    current = 1
    while len(fibo_numbers) < max_numbers:
        next = previous + current
        fibo_numbers.append(next)
        previous, current = current, next
        
    return fibo_numbers

if __name__ == '__main__':
    for num in fibonacci():
        print(num)

Sideway: Infinity by Not Using Functions

  • Still not satisfactory

  • Want infinity

  • Can be done, by embedding the using code (print()) into the Fibonacci generation.

  • not so modular though

#!/usr/bin/python

previous = 1
current = 1

while True:
    next = previous + current
    print(next)
    previous, current = current, next

Fibonacci Numbers: Function Producing Infinite Sequence

#!/usr/bin/python

def fibonacci():
    previous = 1
    current = 1
    while True:
        next = previous + current
        yield next
        previous, current = current, next

if __name__ == '__main__':
    for num in fibonacci():
        print(num)

Common Pattern: Turn List into Generated Items

  • correct infinity can save a few lines

--- /home/jfasch/work/jfasch-home/trainings/material/soup/python/advanced/iteration-generation/python_1010_generators_yield/code/10-fibo-list-nolimit.py
+++ /home/jfasch/work/jfasch-home/trainings/material/soup/python/advanced/iteration-generation/python_1010_generators_yield/code/40-fibo-generator.py
@@ -1,16 +1,12 @@
 #!/usr/bin/python
 
 def fibonacci():
-    fibo_numbers = []
-
     previous = 1
     current = 1
     while True:
         next = previous + current
-        fibo_numbers.append(next)
+        yield next
         previous, current = current, next
-        
-    return fibo_numbers
 
 if __name__ == '__main__':
     for num in fibonacci():