我正在尝试让程序根据用户给定的值返回灯光的亮度,但是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: "))
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)
我觉得答案是正确地盯着我,但我不能把手指放在上面。
答案 0 :(得分:1)
首先,请注意您到处都在int(raw_input())
。这意味着当您尝试输入 quit 作为输入时,程序将引发ValueError exception
并异常退出。
我的建议是稍微修改一下输入循环:
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)
的用途是什么?在我看来,你在循环的最后两行输出结果。
希望这有帮助!
答案 1 :(得分:0)
问题是您在没有验证输入的情况下将所有用户输入强制转换为int。当输入是一个字符串时,python将抛出一个错误,因为字符串不能转换为整数。
最好将原始输入作为原始数据存储到变量r,g和b中,并检查用户是否要先退出。如果没有,您应该对输入值进行健全性检查。如果它们是整数,则可以将它们类型化。否则,打印错误消息或从循环开始处开始。
答案 2 :(得分:0)
此代码无法正常运行。如果用户输入quit
,那么当您将该输入字符串传递给int()
时,您将收到异常,因为quit
不能作为整数运行。
然后,如果用户输入了quit
,您可以在不设置r
,g
和b
的情况下突破循环,因此最后一行你致电Brightness(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)
我们可以在获取用户输入时调用raise UserHasQuit
,而不是sys.exit()
。但是在调试时,异常会为您提供一个堆栈回溯,向您显示异常的来源,而sys.exit()
只是让程序停止。因此,如果您有一个意外的sys.exit()
,可能有点难以找到它,但很容易找到异常。因此,最好在外层保持对sys.exit()
的调用,并对内部代码使用异常。