此代码可能无法正常工作。如果用户输入quit
,那么当您将该输入字符串传递给您时,int()
您将得到一个异常,因为quit
它不能作为整数工作。
然后,如果用户确实输入了 ,您可以在不设置所有、和quit
的情况下跳出循环,因此您调用的最后一行将引发异常。r
g
b
Brightness(r,g,b)
quit
此外,在用户被提示 3 次之前,它不会检查用户是否输入。这会惹恼想要在第一个数字退出的用户。
因此,不要在不检查quit
;的情况下将用户的输入转换为整数。每次提示用户后检查;并且要么具有、 和的默认值,要么r
如果用户退出,则没有最后一次调用。g
b
Brightness()
QUIT = "quit"
got_input = False
while True:
r = raw_input("Enter in the value for red: ")
if r == QUIT:
break
r = int(r)
g = raw_input("Enter in the value for green: ")
if g == QUIT:
break
g = int(g)
b = raw_input("Enter in the value for blue: ")
if b == QUIT:
break
b = int(b)
got_input = True
result = Brightness(r,g,b)
print result
if got_input:
result = Brightness(r,g,b)
请注意,此循环中有很多重复。也许我们可以编写一个函数来清理它?
def get_user_input(question)
answer = raw_input(question)
if answer == QUIT:
return False, None
else:
return True, int(answer)
got_input = False
while True:
quit, r = get_user_input("Enter in the value for red: ")
if quit:
break
quit, g = get_user_input("Enter in the value for green: ")
if quit:
break
b = get_user_input("Enter in the value for blue: ")
if quit:
break
got_input = True
result = Brightness(r,g,b)
print result
if got_input:
result = Brightness(r,g,b)
它好一点。也许我们可以让它更干净?让我们使用 Python 异常。我们可以编写代码来假设事情按计划进行,但是当用户进入时,quit
我们可以引发异常。让我们定义我们自己的异常来说明这一点。
import sys
QUIT = "quit"
class UserHasQuit(Exception):
pass
def get_user_input(question)
answer = raw_input(question)
if answer == QUIT:
raise UserHasQuit
return int(answer)
try:
r = get_user_input("Enter in the value for red: ")
g = get_user_input("Enter in the value for green: ")
b = get_user_input("Enter in the value for blue: ")
result = Brightness(r,g,b)
print result
except UserHasQuit:
sys.exit(0)
而不是raise UserHasQuit
我们可以sys.exit()
在获取用户输入时调用。但是当你在调试时,一个异常会给你一个堆栈回溯,告诉你异常来自哪里,而sys.exit()
只是让程序停止。因此,如果您有意外sys.exit()
情况,可能会有点难以找到,但例外情况很容易找到。所以最好将调用保留sys.exit()
在外层,对内部代码使用异常。