From 02a9ab542492ae6f36c507501dc1a9d3ba927a56 Mon Sep 17 00:00:00 2001 From: Marshal Newrock Date: Tue, 22 Jan 2013 12:23:07 -0500 Subject: [PATCH 1/4] fixed the bug --- iter_bug/fib.py | 2 +- iter_bug/test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iter_bug/fib.py b/iter_bug/fib.py index 59a39a4..03e0d38 100644 --- a/iter_bug/fib.py +++ b/iter_bug/fib.py @@ -12,5 +12,5 @@ def __iter__(self): def next(self): next_fib = self.last_1 + self.last_2 - self.last_1, self.last2 = self.last_2, next_fib + self.last_1, self.last_2 = self.last_2, next_fib return next_fib diff --git a/iter_bug/test.py b/iter_bug/test.py index db32b46..2740f33 100644 --- a/iter_bug/test.py +++ b/iter_bug/test.py @@ -11,7 +11,7 @@ def test2(): i.next() assert i.next() == 3 -def test2(): +def test3(): f = fib.fib() i = iter(f) i.next() From d1f1995529892782d650cfbf0c3299c70f1a001d Mon Sep 17 00:00:00 2001 From: Marshal Newrock Date: Thu, 24 Jan 2013 11:53:25 -0500 Subject: [PATCH 2/4] Look up in the sky...it's a module, it's a generator, it's an iterator...it's sieve! --- sieve_gen/example.py | 10 ++++++++++ sieve_gen/sieve.py | 18 ++++++++++++++++++ sieve_iter/example.py | 10 ++++++++++ sieve_iter/sieve.py | 23 +++++++++++++++++++++++ sieve_mod/example.py | 5 +++++ sieve_mod/sieve.py | 19 +++++++++++++++++++ 6 files changed, 85 insertions(+) create mode 100644 sieve_gen/example.py create mode 100644 sieve_gen/sieve.py create mode 100644 sieve_iter/example.py create mode 100644 sieve_iter/sieve.py create mode 100644 sieve_mod/example.py create mode 100644 sieve_mod/sieve.py diff --git a/sieve_gen/example.py b/sieve_gen/example.py new file mode 100644 index 0000000..3b18a58 --- /dev/null +++ b/sieve_gen/example.py @@ -0,0 +1,10 @@ +import sieve + +count = 1 + +for n in sieve.primes(): + print n + count += 1 + if count > 10: + break + diff --git a/sieve_gen/sieve.py b/sieve_gen/sieve.py new file mode 100644 index 0000000..91a6c82 --- /dev/null +++ b/sieve_gen/sieve.py @@ -0,0 +1,18 @@ +# an implementation of Eratosthenes' Sieve as a generator + +def _is_prime(primes, n): + for i in primes: + if n % i == 0: + return False + return True + +def primes(): + primeslist = [2] + start = primeslist[-1] + 1 + while 1: + if _is_prime(primeslist, start): + primeslist.append(start) + yield start + + start += 1 + diff --git a/sieve_iter/example.py b/sieve_iter/example.py new file mode 100644 index 0000000..3b18a58 --- /dev/null +++ b/sieve_iter/example.py @@ -0,0 +1,10 @@ +import sieve + +count = 1 + +for n in sieve.primes(): + print n + count += 1 + if count > 10: + break + diff --git a/sieve_iter/sieve.py b/sieve_iter/sieve.py new file mode 100644 index 0000000..45cb5c8 --- /dev/null +++ b/sieve_iter/sieve.py @@ -0,0 +1,23 @@ +# an implementation of Eratosthenes' Sieve as an iterator + +class primes(object): + def __init__(self): + self.primeslist = [2] + self.start = self.primeslist[-1] + 1 + + def __iter__(self): + return self + + def _is_prime(self, n): + for i in self.primeslist: + if n % i == 0: + return False + return True + + def next(self): + while 1: + if self._is_prime(self.start): + self.primeslist.append(self.start) + return self.start + self.start += 1 + diff --git a/sieve_mod/example.py b/sieve_mod/example.py new file mode 100644 index 0000000..01c65f3 --- /dev/null +++ b/sieve_mod/example.py @@ -0,0 +1,5 @@ +import sieve + +for n in range(10): + print sieve.next() + diff --git a/sieve_mod/sieve.py b/sieve_mod/sieve.py new file mode 100644 index 0000000..13b0408 --- /dev/null +++ b/sieve_mod/sieve.py @@ -0,0 +1,19 @@ +# an implementation of Eratosthenes' Sieve in a module + +_primeslist = [2] + +def _is_prime(primes, n): + for i in primes: + if n % i == 0: + return False + return True + +def next(): + start = _primeslist[-1] + 1 + while 1: + if _is_prime(_primeslist, start): + _primeslist.append(start) + return start + + start += 1 + From 3dd5d9f349e2b00a0a6207045e81546fc06c6ba3 Mon Sep 17 00:00:00 2001 From: Marshal Newrock Date: Thu, 24 Jan 2013 12:10:23 -0500 Subject: [PATCH 3/4] Fix bug omitting 2 as the first prime --- sieve_gen/sieve.py | 4 ++++ sieve_iter/sieve.py | 8 ++++++-- sieve_mod/sieve.py | 8 +++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/sieve_gen/sieve.py b/sieve_gen/sieve.py index 91a6c82..1a2ea4d 100644 --- a/sieve_gen/sieve.py +++ b/sieve_gen/sieve.py @@ -7,7 +7,11 @@ def _is_prime(primes, n): return True def primes(): + # first iteration, return 2 as the first prime number primeslist = [2] + yield 2 + + # subsequent iterations build off of previously determined primes start = primeslist[-1] + 1 while 1: if _is_prime(primeslist, start): diff --git a/sieve_iter/sieve.py b/sieve_iter/sieve.py index 45cb5c8..5127032 100644 --- a/sieve_iter/sieve.py +++ b/sieve_iter/sieve.py @@ -2,8 +2,7 @@ class primes(object): def __init__(self): - self.primeslist = [2] - self.start = self.primeslist[-1] + 1 + self.primeslist = [] def __iter__(self): return self @@ -15,6 +14,11 @@ def _is_prime(self, n): return True def next(self): + if len(self.primeslist) == 0: + self.primeslist.append(2) + return 2 + + self.start = self.primeslist[-1] + 1 while 1: if self._is_prime(self.start): self.primeslist.append(self.start) diff --git a/sieve_mod/sieve.py b/sieve_mod/sieve.py index 13b0408..bdd1290 100644 --- a/sieve_mod/sieve.py +++ b/sieve_mod/sieve.py @@ -1,6 +1,6 @@ # an implementation of Eratosthenes' Sieve in a module -_primeslist = [2] +_primeslist = [] def _is_prime(primes, n): for i in primes: @@ -9,6 +9,12 @@ def _is_prime(primes, n): return True def next(): + # first iteration, add 2 as a prime number + if len(_primeslist) == 0: + _primeslist.append(2) + return 2 + + # subsequent iterations build off of the previously determined list start = _primeslist[-1] + 1 while 1: if _is_prime(_primeslist, start): From 8f2cfc006afe7905ef0e3097c71b11ad92c15c5c Mon Sep 17 00:00:00 2001 From: Marshal Newrock Date: Thu, 24 Jan 2013 12:17:38 -0500 Subject: [PATCH 4/4] Add generator and iterator tests --- sieve_gen/test1.py | 6 ++++++ sieve_gen/test2.py | 9 +++++++++ sieve_gen/test3.py | 10 ++++++++++ sieve_iter/test1.py | 6 ++++++ sieve_iter/test2.py | 9 +++++++++ sieve_iter/test3.py | 10 ++++++++++ 6 files changed, 50 insertions(+) create mode 100644 sieve_gen/test1.py create mode 100644 sieve_gen/test2.py create mode 100644 sieve_gen/test3.py create mode 100644 sieve_iter/test1.py create mode 100644 sieve_iter/test2.py create mode 100644 sieve_iter/test3.py diff --git a/sieve_gen/test1.py b/sieve_gen/test1.py new file mode 100644 index 0000000..5cbb624 --- /dev/null +++ b/sieve_gen/test1.py @@ -0,0 +1,6 @@ +import sieve + +# test 1 - the first prime should be 2 +gen = sieve.primes() +assert gen.next() == 2 + diff --git a/sieve_gen/test2.py b/sieve_gen/test2.py new file mode 100644 index 0000000..de56be0 --- /dev/null +++ b/sieve_gen/test2.py @@ -0,0 +1,9 @@ +import sieve + +# test 2 - the fourth prime should be 7 - happy :) +gen = sieve.primes() +gen.next() +gen.next() +gen.next() +assert gen.next() == 7 + diff --git a/sieve_gen/test3.py b/sieve_gen/test3.py new file mode 100644 index 0000000..8fd00af --- /dev/null +++ b/sieve_gen/test3.py @@ -0,0 +1,10 @@ +import sieve + +# test 3 - there are 10 primes less than 30 +count = 0 +gen = sieve.primes() +while gen.next() < 30: + count += 1 + +assert count == 10 + diff --git a/sieve_iter/test1.py b/sieve_iter/test1.py new file mode 100644 index 0000000..5cbb624 --- /dev/null +++ b/sieve_iter/test1.py @@ -0,0 +1,6 @@ +import sieve + +# test 1 - the first prime should be 2 +gen = sieve.primes() +assert gen.next() == 2 + diff --git a/sieve_iter/test2.py b/sieve_iter/test2.py new file mode 100644 index 0000000..de56be0 --- /dev/null +++ b/sieve_iter/test2.py @@ -0,0 +1,9 @@ +import sieve + +# test 2 - the fourth prime should be 7 - happy :) +gen = sieve.primes() +gen.next() +gen.next() +gen.next() +assert gen.next() == 7 + diff --git a/sieve_iter/test3.py b/sieve_iter/test3.py new file mode 100644 index 0000000..8fd00af --- /dev/null +++ b/sieve_iter/test3.py @@ -0,0 +1,10 @@ +import sieve + +# test 3 - there are 10 primes less than 30 +count = 0 +gen = sieve.primes() +while gen.next() < 30: + count += 1 + +assert count == 10 +