Kay Schluehr wrote:

> That's because it is *one* expression. The avoidance of named
> functions makes it look obfuscated or prodigious. Once it is properly
> dissected it doesn't look that amazing anymore.
>
> Start with:
>
> (n for n in count(2) if is_prime(n, primes))
>
> The is_prime function has following implementation:
>
> def is_prime(n, primes):
>     if primes and n<=primes[-1]:
>         return n in primes
>     else:
>         if all(n%p for p in primes if p <= sqrt(n)):
>             primes.append(n)
>             return True
>         else:
>             return False

Your explication is excellent, Kay! In the is_prime() function, can't we omit the first three lines (if ... else), because it will *always* be the case that "n" exceeds all the primes we've gathered so far. I've tested the code with these lines omitted -- both with the separate is_prime() function and with the generator-expression-only implementation. It seems to work fine. Ex:

---
from itertools import count
from math import sqrt

g = (lambda primes = []:
       (n for n in count(2) if
           (lambda x, primes:
               (primes.append(x) or True
                    if all(x%p for p in primes if p <= sqrt(x))
                    else False)
           )(n, primes)
       )
   )()

for i in range(500):
   print g.next(),
---

Note that we don't need any backslashes, either.

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to