简体   繁体   中英

Basic while loops in Python

I have been trying to make a simple game in Python 3.3.4, at the beginning of the game I want the user to select a difficulty between 1 and 3 and if they put in another character other than 1, 2 or 3 they receive the message 'Invalid input'.

I have written the code below, however I cannot get it to function correctly in the even if the user does input 1, 2 or 3 it will come up with the error 'invalid input', I have tried messing around with it in various combinations with no avail. I understand that this is rather basic an probably something simple that I am overlooking as I am new to Python. Thanks in advance.

while True:
    while True:
        cmd = input('Please select a diffuculty from 1 to 3, with three being the hardest: ')
        if cmd in (1, 2, 3):
            break
        print ('Invalid input.')
    if cmd == 1:
        dopt = 3
        continue
    elif cmd == 2:
        dopt = 4
        continue
    elif cmd == 2:
        dopt = 5
        continue

The problem is with your types. input returns a string, so cmd is a string. You then ask if cmd is in (1,2,3) , a tuple of ints. Let me go through your options with you.

You can change

cmd = input("...")

to

cmd = int(input("..."))

That way, cmd is an int, as expected later on. The problem with this is that is someone enters something that's not parsable as an int, say "foo" , you're program will immediately exit with a ValueError.

Try something like this instead:

...
while True:
    cmd = input('Please select a diffuculty from 1 to 3, with three being the hardest: ')
    if cmd in ('1', '2', '3'):
        break
    print ('Invalid input.')
cmd = int(cmd)
if cmd == 1:
    dopt = 3
    continue
...

Here, you've a tuple of strings instead of a tuple of ints in the cmd validation. After, cmd is parsed as an int, and your program continues as expected.

On another note, your if-else chain can be replaced with dopt = cmd+2

Best of luck!

From the doc:

input([prompt])

Equivalent to eval(raw_input(prompt)).

raw_input([prompt]) :

If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that.

I modified your code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

while True:
    cmd = int(input('Please select a diffuculty from 1 to 3, with three being the hardest: '))
    print("cmd:{}, type:{}".format(cmd, type(cmd)))
    if cmd not in (1, 2, 3):
        print ('Invalid input.')
        continue
    if cmd == 1:
        dopt = 3
        break
    elif cmd == 2:
        dopt = 4
        break
    elif cmd == 3:
        dopt = 5
        break

print ("cmd:{}; dopt:{}".format(cmd, dopt))

You can use type to know what's the type of your input.

There is one problem with your code.

  1. input() returns a string , not an integer.

Because your input is a string , checking if a string is in a tuple of integers, would not work:

>>> tup = (1, 2, 3)
>>> '1' in tup
False
>>> '3' in tup
False

Therefore, you can cast int() to your input() , so that it takes integers and only integers as input:

>>> x = int(input())
4
>>> type(x)
<class 'int'>
>>> x = int(input())
'hello'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: "'hello'"
>>> 

Because of that, you can then check if the input is in your tuple:

>>> tup = (1, 2, 3)
>>> x = int(input())
2
>>> x in tup
True
>>> x = int(input())
7
>>> x in tup
False
>>> 

Here is your edited code:

while True:
    while True:
        cmd = int(input('Please select a diffuculty from 1 to 3, with three being the hardest: '))
        if cmd in (1, 2, 3):
            break
        print ('Invalid input.')
    if cmd == 1:
        dopt = 3
        continue
    elif cmd == 2:
        dopt = 4
        continue
    elif cmd == 2:
        dopt = 5
        continue

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