首页 > 解决方案 > 在 Python 中检查多个输入的有效性

问题描述

我编写了一个在海龟中绘制凸正多边形的程序(给定边数和长度)。我还希望它检查无效的输入,这样它会立即询问用户是否想尝试不同的输入。有没有办法在更少的代码中检查输入的有效性,同时也考虑 ValueError?

此外,每次成功运行后都会出现 Terminator 错误。可能是什么原因造成的,使用此导入命令时甚至有办法修复它吗?

from turtle import *
def inp():
    while True:
        try:
            n = int(input("Enter the number of sides of the polygon: "))
        except ValueError:
            y_n = input("Invalid input, type \"y\" if you'd like to try again: ")
            if y_n == "y":
                continue
            else:
                print("Goodbye!")
                break
        if n >= 3:
            pass
        else:
            y_n = input("Invalid input, type \"y\" if you'd like to try again: ")
            if y_n == "y":
                inp()
            else:
                print("Goodbye!")
                break
        
        try: 
            l = float(input("Enter the length of the side in pixels: "))
        except ValueError:
            y_n = input("Invalid input, type \"y\" if you'd like to try again: ")
            if y_n == "y":
                continue
            else:
                print("Goodbye!")
                break
        if l > 0:
            for i in range(1, n + 1):
                forward(l)
                left(360/n)
            exitonclick()
            break
        else:
            y_n = input("Invalid input, type \"y\" if you'd like to try again: ")
            if y_n == "y":
                inp()
            else:
                print("Goodbye!")
                break
     
inp()

标签: pythonpython-3.xloopsturtle-graphicsvalueerror

解决方案


对于有效的参数输入,以下是一些步骤:

  • 以无效的值开头
  • 使用 while 循环,向用户询问有效输入
  • 如果输入有效,则退出循环

在您的代码中,两个参数都具有相同的验证检查,因此您可以使用一个函数来检查两者。

试试这个代码:

from turtle import *

def validnum(nm):
    return str(nm).isdigit() and int(nm) > 0  # integer and greater than zero

def inp():
    n = l = ''  # both invalid
    while not validnum(n):  # loop first entry until valid
        n = input("Enter the number of sides of the polygon or 'q' to quit: ")
        if n == 'q':
            print("Goodbye!")
            exit()
        if not validnum(n):
            print("Invalid entry")
            
    while not validnum(l):  # loop second entry until valid
        l = input("Enter the length of the side in pixels or 'q' to quit: ")
        if l == 'q':
            print("Goodbye!")
            exit()
        if not validnum(l):
            print("Invalid entry")
            
    n, l = int(n), int(l)  # convert entries to integers
            
    for i in range(1, n + 1):
        forward(l)
        left(360/n)
    exitonclick()

inp()            

由于这两个参数具有相同的验证,并且仅在消息提示方面有所不同,因此您可以通过将提示放在列表中来使代码更加紧凑。

from turtle import *

def validnum(nm):
    return str(nm).isdigit() and int(nm) > 0  # integer and greater than zero

def inp():
    lstinp = ['','']  # both invalid
    lstmsg = ['Enter the number of sides of the polygon', 'Enter the length of the side in pixels'] # both msgs

    for i in range(len(lstinp)):  # each input value
        while not validnum(lstinp[i]):  # loop until valid entry
            lstinp[i] = input(lstmsg[i] + " or 'q' to quit: ")  # msg 
            if lstinp[i] == 'q':
                print("Goodbye!")
                exit()
            if not validnum(lstinp[i]):
                print("Invalid entry")
                        
    n, l = int(lstinp[0]), int(lstinp[1])  # convert entries to integers
            
    for i in range(1, n + 1):
        forward(l)
        left(360/n)
    exitonclick()

inp()            

运行代码时我没有收到任何错误。


推荐阅读