我正在编写一个程序,接受用户的输入。
#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18:
print("You are able to vote in the United States!")
else:
print("You are not able to vote in the United States.")
只要用户输入有意义的数据,程序就会按预期工作。
C:\Python\Projects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!
但如果用户输入无效数据,则失败:
C:\Python\Projects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
File "canyouvote.py", line 1, in <module>
age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'
我希望程序再次请求输入,而不是崩溃。像这样:
C:\Python\Projects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!
当输入非感官数据时,如何使程序请求有效的输入而不是崩溃?
我怎样才能拒绝像-1
这样的值,这是一个有效的int
,但在这个上下文中是没有意义的?
最简单的方法是将} ,当您满意时使用
input
方法放入while循环中。当输入错误时使用^{break
退出循环。当您的输入可能引发异常时
使用^{} and ^{} 检测用户何时输入无法分析的数据。
实现自己的验证规则
如果要拒绝Python可以成功解析的值,可以添加自己的验证逻辑。
结合异常处理和自定义验证
以上两种技术都可以组合成一个循环。
将其全部封装在函数中
如果需要向用户询问许多不同的值,那么将此代码放入函数中可能会很有用,因此不必每次都重新键入它。
总而言之
您可以将此思想扩展为一个非常通用的输入函数:
用法如下:
常见的陷阱,以及为什么要避免它们
冗余语句的冗余使用
这种方法有效,但通常被认为是低劣的风格:
它最初看起来很有吸引力,因为它比
while True
方法短,但它违反了软件开发的Don't Repeat Yourself原则。这会增加系统中出现错误的可能性。如果您想通过将input
更改为raw_input
,但意外地只更改上面的第一个input
,将backport更改为2.7,该怎么办?只是在等待发生。递归将破坏堆栈
如果您刚刚学习了递归,那么您可能会尝试在
get_non_negative_int
中使用它,以便可以处理while循环。这在大多数情况下似乎工作正常,但是如果用户输入无效数据的次数足够多,脚本将以
RuntimeError: maximum recursion depth exceeded
结束。你可能认为“没有傻瓜会连续犯1000个错误”,但你低估了傻瓜的聪明才智!尽管公认的答案是惊人的。我还想分享一个快速破解这个问题的方法。(这也解决了负年龄问题。)
这段代码是针对python 3.x的
为什么你要做一个
while True
,然后跳出这个循环,而你也可以把你的需求放在while语句中,因为你只想在你有了年龄后停止?这将导致以下结果:
这将起作用,因为年龄永远不会有一个没有意义的价值,代码遵循您的“业务流程”逻辑
相关问题 更多 >
编程相关推荐