1

我试图让一个程序根据用户给定的值返回灯光的亮度,但是 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)

我觉得答案就在我眼前,但我不能把手指放在它上面。

4

3 回答 3

1

首先,请注意您int(raw_input())无处不在。这意味着当您尝试输入quit作为输入时,程序将引发 aValueError 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)是干什么用的?在我看来,您在循环的最后两行输出结果。

希望这可以帮助!

于 2013-10-28T23:15:31.923 回答
0

问题是您将所有用户输入类型转换为 int 而不验证输入。当输入是字符串时,python 会抛出错误,因为字符串不能转换为整数。

最好将原始输入作为原始数据存储到变量 r、g 和 b 中,然后检查用户是否想先退出。如果没有,您应该对输入值进行完整性检查。如果它们是整数,您可以按原样对它们进行类型转换。否则,打印错误消息或从循环开始处开始。

于 2013-10-28T23:15:05.887 回答
0

此代码可能无法正常工作。如果用户输入quit,那么当您将该输入字符串传递给您时,int()您将得到一个异常,因为quit它不能作为整数工作。

然后,如果用户确实输入了 ,您可以在不设置所有、和quit的情况下跳出循环,因此您调用的最后一行将引发异常。rgbBrightness(r,g,b)

quit此外,在用户被提示 3 次之前,它不会检查用户是否输入。这会惹恼想要在第一个数字退出的用户。

因此,不要在不检查quit;的情况下将用户的输入转换为整数。每次提示用户后检查;并且要么具有、 和的默认值,要么r如果用户退出,则没有最后一次调用。gbBrightness()

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()在外层,对内部代码使用异常。

于 2013-10-28T23:35:19.460 回答