Paul McGuire ptmcg at austin.rr.com
Fri Jun 8 15:09:15 CEST 2007

```On Jun 7, 6:15 pm, Steve Howell <showel... at yahoo.com> wrote:
> Programs like this were posted on this thread:
>
>
>
>
>
> >    def fib():
> >        generation, parent_rabbits, baby_rabbits = 1,
> > 1, 1
> >        while True:
> >            yield generation, baby_rabbits
> >            generation += 1
> >            parent_rabbits, baby_rabbits = \
> >                   baby_rabbits, parent_rabbits +
> > baby_rabbits
>
> >     for pair in fib():
> >         if pair[0] > 100:
> >             break
> >         print "Generation %d has %d (baby) rabbits."
> > % pair
>
> One goal behind the SimplePrograms page is to give
> people that are new to Python a *gentle* immersion
> into Python code.  I prefer simple:
>
>     parent_rabbits, baby_rabbits = (1, 1)
>     while baby_rabbits < 100:
>         print 'This generation has %d rabbits' %
> baby_rabbits
>         parent_rabbits, baby_rabbits = (baby_rabbits,
> parent_rabbits + baby_rabbits)
>
> Somebody commented in another reply that they'd prefer
> the variable names "a" and "b," but other than that, I
> think it's hard to simplify this.
>
> The problem of counting rabbits is not sufficiently
> rich to motivate a solution with generator functions,
> and "yield" statements are just gonna scare people
> away from the Python, unless they've had a chance to
> see simpler idioms first.
>
> I do think there's a place on the page for a good
> generators example, but it needs to solve a
> sufficiently complex problem that the use of
> generators actually simplifies the solution.
>
> So I'm throwing down the gauntlet--can somebody write
> a short program (maybe 10 to 20 lines) where you solve
> a problem more simply than a similar
> non-generator-using solution would solve it?  Maybe
> something like Eight Queens?
>
> -- Steve
>
> P.S.  FWIW the page does already include examples of
> generator expressions and the itertools module, but it
> does not yet show any code that actually implements a
> generator.  I would greatly welcome the addition of a
> good example.
>
> ___________________________________________________________________________­_________
> Yahoo! oneSearch: Finally, mobile search
>
> - Show quoted text -

queens using recursion and exceptions.  Perhaps this could serve as
the "before" to an "after" using generators. (I note that neither
recursion nor exceptions are covered in your examples.)  Also, in
googling about for other 8-queens solutions in Python, most are quite
complicated - this one uses only 24 lines, and works for boards of any
size.  I also think this line for printing out the board:

print "\n".join( "."*q+"Q"+"."*(BOARD_SIZE-q-1) for q in queens )

illustrates a couple of interesting idioms of Python (joining a list,
generator expression, "."*repetition to give "....").

-- Paul

BOARD_SIZE = 8
def validate(queens):
left = right = col = queens[-1]
for r in reversed(queens[:-1]):
left,right = left-1,right+1
if r in (left, col, right):
raise Exception

for i in range(BOARD_SIZE):
testQueens = queens+[i]
try:
validate(testQueens)
if len(testQueens)==BOARD_SIZE:
return testQueens
else:
except:
pass
raise Exception