Python 2.7.5退出用户输入

时间:2013-10-28 23:07:06

标签: 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: "))
    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)

我觉得答案是正确地盯着我,但我不能把手指放在上面。

3 个答案:

答案 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,您可以在不设置rgb的情况下突破循环,因此最后一行你致电Brightness(r,g,b)的地方会引发异常。

此外,在用户被提示三次之前,这不会检查用户是否输入quit。这会让想要退出第一个号码的用户烦恼。

因此,请勿在不检查quit的情况下将用户输入转换为整数;每次提示用户后检查;并且要么具有rgb的默认值,要么在用户退出时没有最后一次调用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()的调用,并对内部代码使用异常。