Python 2.7.5在用户输入时退出
我试图让一个程序根据用户给定的值返回灯光亮度,但是while循环让我感到困惑Python 2.7.5在用户输入时退出,python,Python,我试图让一个程序根据用户给定的值返回灯光亮度,但是while循环让我感到困惑 def Brightness(r,g,b): value = 0.2126 * r + 0.7152 * g + 0.0722 * b return value while True: r = int(raw_input("Enter in the value for red: ")) g = int(raw_input("Enter in the value for green:
def Brightness(r,g,b):
value = 0.2126 * r + 0.7152 * g + 0.0722 * b
return value
while True:
r = int(raw_input("Enter in the value for red: "))
g = int(raw_input("Enter in the value for green: "))
b = int(raw_input("Enter in the value for blue: "))
result = Brightness(r,g,b)
print result
if ((r == "quit") or (g == "quit") or (b == "quit")):
break
result = Brightness(r,g,b)
我觉得答案就在我眼前,但我不能把手指放在上面。问题是,您在未验证输入的情况下将所有用户输入键入int。当输入是字符串时,python将抛出一个错误,因为字符串不能转换为整数
最好是将原始输入作为原始数据存储到变量r、g和b中,并检查用户是否希望首先退出。如果没有,您应该对输入值进行一次健全性检查。如果它们是整数,您可以将它们作为整数进行类型转换。否则,请打印错误消息或从循环的开始处开始。问题在于,您将所有用户输入键入int,而没有验证输入。当输入是字符串时,python将抛出一个错误,因为字符串不能转换为整数
最好是将原始输入作为原始数据存储到变量r、g和b中,并检查用户是否希望首先退出。如果没有,您应该对输入值进行一次健全性检查。如果它们是整数,您可以将它们作为整数进行类型转换。否则,请打印错误消息或从循环的开始处开始。首先,请注意,您正在执行
int(raw\u input())
操作。这意味着当您尝试输入quit作为输入时,程序将引发ValueError异常
并异常退出
我的建议是稍微修改一下输入循环:
while True:
i1 = raw_input("Enter in the value for red: ")
i2 = raw_input("Enter in the value for green: ")
i3 = raw_input("Enter in the value for blue: ")
if ((i1 == "quit") or (i2 == "quit") or (i3 == "quit")):
break
r = int(i1)
g = int(i2)
b = int(i3)
result = Brightness(r,g,b)
print result
result = Brightness(r,g,b)
另外,我不明白最后一行result=Brightness(r,g,b)
是什么意思?在我看来,您正在循环的最后两行输出结果
希望这有帮助 首先,请注意,您到处都在执行
int(raw\u input())
。这意味着当您尝试输入quit作为输入时,程序将引发ValueError异常
并异常退出
我的建议是稍微修改一下输入循环:
while True:
i1 = raw_input("Enter in the value for red: ")
i2 = raw_input("Enter in the value for green: ")
i3 = raw_input("Enter in the value for blue: ")
if ((i1 == "quit") or (i2 == "quit") or (i3 == "quit")):
break
r = int(i1)
g = int(i2)
b = int(i3)
result = Brightness(r,g,b)
print result
result = Brightness(r,g,b)
另外,我不明白最后一行result=Brightness(r,g,b)
是什么意思?在我看来,您正在循环的最后两行输出结果
希望这有帮助 此代码可能无法正常工作。如果用户输入
quit
,那么当您将该输入字符串传递给int()
时,您将得到一个异常,因为quit
不能作为整数工作
然后,如果用户确实输入了quit
,则可以在不设置所有r
、g
和b
的情况下跳出循环,因此调用亮度(r,g,b)
的最后一行将引发异常
此外,在用户收到三次提示之前,不会检查用户是否输入了quit
。这会激怒一个想在第一个号码退出的用户
因此,在未检查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)
当获取用户输入时,我们可以调用
sys.exit()
,而不是raiseuserhasquit
。但在调试时,异常会给您一个堆栈回溯,显示异常的来源,而sys.exit()
只会使程序停止。因此,如果您有一个意外的sys.exit()
,可能会有点难以找到,但异常很容易找到。因此,最好在外层保留对sys.exit()的调用,并对内部代码使用异常。此代码可能无法正常工作。如果用户输入quit
,那么当您将该输入字符串传递给int()
时,您将得到一个异常,因为quit
不能作为整数工作
然后,如果用户确实输入了quit
,则可以在不设置所有r
、g
和b
的情况下跳出循环,因此调用亮度(r,g,b)
的最后一行将引发异常
此外,在用户收到三次提示之前,不会检查用户是否输入了quit
。这会激怒一个想在第一个号码退出的用户
因此,在未检查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)
当获取用户输入时,我们可以调用sys.exit()
,而不是raiseuserhasquit
。但在调试时,异常会给您一个堆栈回溯,显示异常的来源,而sys.exit()
只会使程序停止。因此,如果您有一个意外的sys.exit()
,可能会有点难以找到,但异常很容易找到。因此,最好保持对sys.exit()
a的调用