[Tutor] While loop issue, variable not equal to var or var

Peter Otten __peter__ at web.de
Sat Jul 12 09:10:25 CEST 2014


Steve Rodriguez wrote:

> Hey guys n gals,
> 
> New to python, having some problems with while loops, I would like to make
> a program quick once q or Q is typed, but thus far I can only get the
> first variable to be recognized. My code looks like:
> 
>     message = raw_input("-> ")
>     while message != 'q':
>         s.send(message)
>         data = s.recv(2048)
>         print str(data)
>         message = raw_input("-> ")
>     s.close()
>     print("Shutting Down")
> 
> I've tried:
> 
> while message != 'q' or 'Q':

This evaluates 

(message != "q") or "Q"

and "Q" is always True in a boolean context:

>>> bool("Q")
True

> while message != 'q' or message != 'Q':

This is true when at least one of the subexpressions

message != "q"
message != "Q"

is True. When the value of message is "q" it must be unequal to "Q" and vice 
versa, so there is always at least one true subexpression.

> while message != ('q' or 'Q'):

When you try the right side in the interactive interpreter you get

>>> "q" or "Q"
'q'

so this is the same as just 

message != "q" 

> Any ideas would be much appreciated! Thanks! :D

while message.lower() != "q":
while message not in ("q", "Q"):
while message != "q" and message != "Q":

There's another one that chains boolean expressions

while "q" != message != "Q":

that I don't recommend here but that is very readable for checking number 
intervals:

if 0 <= some_number < 1:
   print some_number, "is in the half-open interval [0,1)"


You also may consider an infinite loop:

while True:
    message = raw_input("-> ")
    if message in ("q", "Q"):
        break
    s.send(message)
    ...

This avoids the duplicate raw_input().

PS: You sometimes see

message in "qQ"

but this is buggy as it is true when the message is either
"q", "Q", or "qQ".



More information about the Tutor mailing list