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) >> self._add_prime() >> >> def __contains__(self, n): >> # add primes to the list until we exceed n >> while n > self._last_prime: >> self._add_prime() >> >> # return True if n is one of our primes >> return n in self._prime_set >> >> def _add_prime(self): >> # take a prime off the iterator and update the prime set >> self._last_prime = self._prime_iter.next() >> self._prime_set.add(self._last_prime) > > 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 -- http://mail.python.org/mailman/listinfo/python-list