# Python indentation deters newbies?

Tim Hochberg tim.hochberg at ieee.org
Tue Aug 17 17:48:52 CEST 2004

```Jeff Shannon wrote:
> beliavsky at aol.com wrote:
>
>> You may want to exit a nested loop when testing if a condition involving
>> several variables is met, such as searching for a zero of a multivariate
>> function.
>> In Python you can print i,j,k and exit() when m == 0, but in a larger
>> program
>> you may want more control.
>>
>>
>
> In this case, I can see several Pythonic ways of doing this.
>
> One would be to use an exception.  While exceptions are not considered
> good control structures in other languages, they *are* considered
> acceptable (and even desirable) in Python.
>
> Another way would be to wrap the nested loops inside a function, and
> simply return the appropriate triple from that function as soon as you
> find it.
>
> An improvement on that would be to replace your return statement with a
> yield.  Suddenly you've got a generator that'll find a whole series of
> Pythagorean triples!
>
[SNIP perfectly good Pythag. triple generator]

Just for fun, here's one that will spit out as many reduced pythagorean
triples as you care to look at.

-tim

def gcd(a, b):
# Euclidean alg.
assert (b > 0) and (b > 0)
if a < b:
a, b = b, a
while b:
a, b = b, a % b
return a

def rptriples():
"generate reduced pythagorean triples"
# Based on formulae from Mathworld, corrected by one from
# planetMath.
v = 1
while True:
u = 1 + (v%2) # u must be opposite parity from v
while u < v:
if gcd(u,v) == 1:
u2, v2 = u*u, v*v
a, b, c = v2-u2, 2*u*v, u2+v2
if a > b:
a, b = b, a
yield a, b, c
u += 2
v += 1

```