# A dumb question about a class

Steven Bethard steven.bethard at gmail.com
Mon Aug 13 00:35:05 CEST 2007

```Dick Moores wrote:
> At 03:09 PM 8/12/2007, Steven Bethard wrote:
>
>> Here's how I'd write the recipe::
>>
>>      import itertools
>>
>>      def iter_primes():
>>          # an iterator of all numbers between 2 and +infinity
>>          numbers = itertools.count(2)
>>
>>          # generate primes forever
>>          while True:
>>
>>              # get the first number from the iterator (always a prime)
>>              prime = numbers.next()
>>              yield prime
>>
>>              # remove all numbers from the (infinite) iterator that are
>>              # divisible by the prime we just generated
>>              numbers = itertools.ifilter(prime.__rmod__, numbers)
>>
>>
>>      class PrimeList(object):
>>          def __init__(self):
>>              # infinite iterator of primes
>>              self._prime_iter = iter_primes()
>>
>>              # the last prime we've seen
>>              self._last_prime = None
>>
>>              # all primes seen so far
>>              self._prime_set = set()
>>
>>              # add the first prime (so that _last_prime is set)
>>
>>          def __contains__(self, n):
>>              # add primes to the list until we exceed n
>>              while n > self._last_prime:
>>
>>              # return True if n is one of our primes
>>              return n in self._prime_set
>>
>>              # take a prime off the iterator and update the prime set
>>              self._last_prime = self._prime_iter.next()
>
> I'm afraid my next question is "How do I run this"?

The same way I showed at the top (which you snipped in your reply)::

>>> plist = PrimeList()
>>> 1 in plist
False
>>> 2 in plist
True
>>> 22 in plist
False
>>> 23 in plist
True
>>> 782 in plist
False
>>> 787 in plist
True

The first line, ``plist = PrimeList()`` creates a PrimeList object and
names it ``plist``.  You can then check whether a prime is in that
PrimeList object much like you might check a normal ``list`` or ``set``
object -- using the ``in`` operator as above.

Note that if you just want to iterate over all the primes, there's no
need for the class at all.  Simply write::

for prime in iter_primes():
...

HTH,

STeVe

```