python - 在 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()
解决方案
对于有效的参数输入,以下是一些步骤:
- 以无效的值开头
- 使用 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()
运行代码时我没有收到任何错误。
推荐阅读
- vb.net - Visual Basic:如何在文本框中找到最大值和最小值
- java - Parcelable 类中的 Parcelable 列表不使用 Parcel.readTypedList 回读
- shell - 执行 shell 脚本后 Gocd 任务失败
- java - 具有相同功能的普通类、抽象类和接口,哪一个具有最小的内存大小?
- c++ - How do I add 'using namespace' to a class definition based on the object name?
- c++ - 在单独的文件中编写 C++ 类不起作用?
- php - Laravel/Eloquent 转义引号字符
- lampp - Lampp没有显示错误原因
- ios - 如何以编程方式向 UITableViewCell 添加竖线
- python - 如何打印一次,直到 if 条件被打破?