简体   繁体   中英

While Loop Break usage

I am totally going insane over this function I wrote, the while loop wont work for the love of god

        while (something something):
            print("at anytime enter 0 for both origin and destination to exit the game")
            o=input("Enter origin stool's index (Must be int) ")
            d=input("Enter destination stool's index (Must be int) ")
            if isinstance(o,int) and isinstance(d,int):#if input d,o are int
               #do bla bla
            elif o==0 and d==0:#to exit manually
               print("Exiting Manually...")
               break
            elif not (isinstance(o,int) and isinstance(d,int)):
               print ("Invalid entry, exiting...")
               break 

The code should exit when o AND d are 0, and it should also exit when o OR d is not an int

However it seems that it doesn't matter what I enter, (i tried 0,0 and 0,1) it returns invalid entry, exiting...

Whats wrong with the conditions?

In Python 3, the input function always returns a string. It doesn't eval the user input like it used to do in Python 2. As a result, o and d are both strings, not integers. You need to wrap your input calls with int(input('...')) in order to turn them into ints, so your conditionals have a chance of success.

In this case, if the user inputs values that aren't numbers, the int call should fail with a ValueError . The standard way to deal with this is to wrap any calls to user input with a try - except block, to deal with users who provide bad input. So the relevant part of your code might look something like this:

try:
    o=int(input("Enter origin stool's index (Must be int) "))
    d=int(input("Enter destination stool's index (Must be int) "))
except ValueError:
    print("Invalid entry, exiting...")
    break

As a side note, your logic in the conditionals is kind of weird/broken. Your first conditional checks whether a and d are both ints, and then does processing. Then your next conditional (the first elif block) tries to compare those to 0 , which will always fail since if you get to that test, that means the first conditional failed, so they weren't both ints and therefore can never be equal to 0 .

Your first "if" will pass when o and d are ints regardless of their values. Only if that condition fails will it continue through to the next "elif".

Try something more like:

if isinstance(o,int) and isinstance(d,int) and (o != 0 or d != 0):
   #Conditions met, carry on
else:
   break

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM