While loop with "or"? Please help!
Bruno Desthuilliers
bruno.desthuilliers at websiteburo.com
Thu Jan 25 07:31:25 EST 2007
wd.jonsson at gmail.com a écrit :
> Hmm, my while loop with "or" doesn't seem to work as I want it to...
> How do I tell the while loop to only accept "Y" or "y" or "N" or "n"
> input from the str(raw_input)?
>
> Thank's in advance!
>
> Snippet of code:
>
> import os
>
> def buildfinder():
> os.system("CLS")
> GameRoot = os.getenv("GAME_ROOT") + "\\"
>
> print "Do you want to use " + GameRoot + " as your source
> directory?"
> usr = str(raw_input('Y/N: '))
> return usr
>
> #Runs the buildfinder function
> usrinp = buildfinder()
>
> def buildwhiler():
>
> while usrinp != "y" or "Y" or "N" or "n": <<<<----PROBLEM
Yes, obviously.
The above reads as:
while (usrinp != "y") or ("Y") or ("N") or ("n"):
What you want is something like:
while usrinp != "y" and usrinp != "Y" \
and usrinp != "n" and usrinp != "N" :
which is better written as
while not (usrinp == "y" or usrinp == "Y" \
or usrinp == "n" or usrinp == "N") :
which can be simplified using str.lower:
while not (usrinp.lower() == "y" or usrinp.lower() == "n"):
and simplified again thanks to Python 'in' operator:
while not usrinp.lower() in "yn":
> print "Enter Y or N!"
> usr = str(raw_input('Y/N: '))
> else:
> code continues
While we're at it, there are other problems in your code. One of them is
that buildwhiler() will go in an infinite loop if the usr first typed
anything else than "y", "Y", "n" or "N". I let you try to find out why,
and just give you two hints :
- globals are Bad(tm)
- don't mix application logic with user-interface logic (ie: a function
should only deal with one or the other, not mix both).
HTH
More information about the Python-list
mailing list