Python 2.7.5在用户输入时退出

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:

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

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

问题是,您在未验证输入的情况下将所有用户输入键入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的调用