Use it to get the highest Fibonacci number less than 1000, and to check if there is in that range a Fibonacci number that is multiple of 12.
You can solve this problem in a myriad of ways. However, the original idea was to push towards writing a Python generator. I extracted this example from Dive into Python 3, paragraph 6.6.1.
Here is a possible implementation:
def fibonacci(top): a, b = 0, 1 while a < top: yield a a, b = b, a + bHaving a 'yield' statement in its body, we see that this fibonacci function is a generator. That is, a sort of function that behaves like an iterator. Each time we call it, it should yield a value. If not, as in this case when a is not less than top, the generator is consumed, and the iteration stops.
Let's see it in action:
def test_list_1000(self): fib1000 = list(fibonacci(1000)) # 1 self.assertEqual(17, len(fib1000)) self.assertEqual(987, fib1000[-1]) def test_multiple_12(self): for candidate in fibonacci(1000): # 2 if candidate and candidate % 12 == 0: # 3 break else: self.fail('No fibonacci multiple of 12 found!') self.assertEqual(144, candidate)1. Here fibonacci(1000) is used to populate a list of seventeen elements, when the generated value is not less than 1000, the generation of elements ends.
2. Each time we call fibonacci(1000) a new Fibonacci number is generated, starting from 0 on.
3. Since 144 is both a Fibonacci number and a multiple of 12, we won't consume completely the generator.
Full code pushed to GitHub.