# 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/python_1010_generators_yield/code/10-fibo-list-nolimit.py
+++ /home/jfasch/work/jfasch-home/trainings/material/soup/python/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():