检查变量并更改变量的函数

时间:2016-09-19 14:10:41

标签: python python-2.7

我正在制作一个计算器,将RGB值转换为十六进制数。因为我正在编码,我意识到我已经三次写了相同的代码来检查红色,绿色和蓝色的用户输入。所以我想,为什么不使用函数来检查我的变量!!这是我的代码:

invalid_msg = 'Whoops looks like you have entered incorrect information'
def check_rgb(var):
    while var > 255 or var < 0:
        print invalid_msg
        var = int(raw_input('Please enter a value between 0 and 255:'))
    return var

def rgb_hex():
    red = int(raw_input('Enter your value for red.'))
    check_rgb(red)
    green = int(raw_input('Enter your value for green.'))
    while green > 255 or red < 0:
        print invalid_msg
        green = int(raw_input('Enter your value for green.'))
    blue = int(raw_input('Enter your value for blue.'))
    while blue > 255 or red < 0:
        print invalid_msg
        blue = int(raw_input('Enter your value for blue.'))
    val = (red << 16) + (green << 8) + blue
    print '%s' % (hex(val)[2:]).upper()

rgb_hex()

问题在于重新声明变量。现在,它将输入到函数中的值存储到变量'var'而不是红色。

3 个答案:

答案 0 :(得分:2)

你需要做类似

之类的事情
red = check_rgb(red)

当你做的时候

check_rgb(red)

不使用返回值。

答案 1 :(得分:0)

您可以检查分别调用该函数的三种颜色的条件,然后在同一语句中对它们进行比较:

red_ok = check_rgb(red)
green_ok = check_rgb(green)
blue_ok = check_rgb(blue)
if (red_ok and green_ok and blue_ok) :
    val = (red << 16) + (green << 8) + blue
    print '%s' % (hex(val)[2:]).upper()

答案 2 :(得分:0)

正如Davis Yoshida所提到的那样,仅仅执行check_rgb(red)并不会更改red的原始值,因为您忘记保存check_rgb返回的值。

我建议扩展您的帮助程序功能,以便它获取用户输入并验证它。这是一个示例,它还确保输入是适当范围内的有效整数。此代码还显示了一种更简单的方法来打印RGB值的十六进制表示。

def get_color_byte(name):
    while True:
        s = raw_input('Enter a value from 0 to 255 for %s: ' % name)
        try:
            v = int(s)
            if not 0 <= v <= 255:
                raise ValueError('Out of range')
            return v
        except ValueError as e:
            print e

r, g, b = [get_color_byte(name) for name in ('red', 'green', 'blue')]
rgb = (r << 16) | (g << 8 ) | b
print '%06X' % rgb

<强>测试

Enter a value from 0 to 255 for red: hello
invalid literal for int() with base 10: 'hello'
Enter a value from 0 to 255 for red: 12.5
invalid literal for int() with base 10: '12.5'
Enter a value from 0 to 255 for red: -5
Out of range
Enter a value from 0 to 255 for red: 300
Out of range
Enter a value from 0 to 255 for red: 240
Enter a value from 0 to 255 for green: 13
Enter a value from 0 to 255 for blue: 7
F00D07

作为print '%06X' % rgb的替代方案,您可以使用更现代的format函数:

print format(rgb, '06X')

在这两者中,大写X表示在十六进制字符串中使用大写字母。