On Jul 15, 12:28 pm, "Andreas Tawn" <[EMAIL PROTECTED]> wrote:
> >defn noob wrote:
> >> isPrime works when just calling a nbr but not when iterating on a
> >> list, why? adding x=1 makes it work though but why do I have to add
> >> it?
> >> Is there a cleaner way to do it?
>
> >> def isPrime(nbr):
> >>     for x in range(2, nbr + 1):
> >>         if nbr % x == 0:
> >>             break
> >>     if x == nbr:
> >>         return True
> >>     else:
> >>         return False
>
> >>>>> [isPrime(y) for y in range(11)]
>
> >> Traceback (most recent call last):
> >>   File "<pyshell#45>", line 1, in <module>
> >>     [isPrime(y) for y in range(11)]
> >>   File "C:\Python25\Progs\blandat\myMath.py", line 9, in isPrime
> >>     if x == nbr:
> >> UnboundLocalError: local variable 'x' referenced before assignment
>
> >>>>> map(isPrime, range(100))
>
> >> Traceback (most recent call last):
> >>   File "<pyshell#38>", line 1, in <module>
> >>     map(isPrime, range(100))
> >>   File "C:\Python25\Progs\blandat\myMath.py", line 9, in isPrime
> >>     if x == nbr:
> >> UnboundLocalError: local variable 'x' referenced before assignment
> >>>>> isPrime(10)
> >> False
> >>>>> isPrime(11)
> >> True
>
> >> adding x=1 makes it work though:
>
> >> def isPrime(nbr):
> >>     x=1
> >>     for x in range(2, nbr + 1):
> >>         if nbr % x == 0:
> >>             break
> >>     if x == nbr:
> >>         return True
> >>     else:
> >>         return False
>
> >>>>> [isPrime(y) for y in range(11)]
> >> [False, True, True, True, False, True, False, True, False, False,
> >> False]
> >> --
> >>http://mail.python.org/mailman/listinfo/python-list
>
> >========================================
> >Yep - "local variable 'x' referenced before assignment" is correct.
> >You state: for x in range... but x doesn't exist until initialized.
> >   To save a loop, initialize x=2 (the minimum value) and loop executes
> >   on pass one.
> >In a straight 'C' program
> >   (  for (x=1, x=(nbr+1), x++)  etc...  )
> >   the x is initialized and forceably incremented.
> >   seems Python does not auto initialize but does auto increment.
>
> I think a better explanation is that in your original function, x only
> existed while the for loop was running.

The for loop never ran.

> As soon as execution hit the break statement,

It never hit the break statement, the first call from
[isPrime(y) for y in range(11)]
attempted to do for x in range(2,1).

> x ceased to exist.

Something has to exist before it can cease to exist.

> When you attempted to reference it
> in the next line, Python has no variable called x so it complains that x
> hasn't been initialised.

Right conlusion but false premise.

>
> A more idiomatic way to write it...
>
> def isPrime(nbr):
>     if nbr <= 1:
>         return False
>     for x in xrange(2, nbr+1):
>         if not nbr % x:
>             return x == nbr
>
> Cheers,
>
> Drea

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

Reply via email to