【问题标题】:Limiting a number to a range将数字限制在一个范围内
【发布时间】:2015-04-06 02:34:08
【问题描述】:

现在,我有将 R、G 和 B 颜色值转换为十六进制的代码。

但是,如果用户输入无效数字(例如 -20),它将返回一个完全随机的数字。

我的代码是:

def rgb(r, g, b):
    if r < 0:
        r = 0
    elif r > 255:
        r = 255
    if g < 0:
        g = 0
    elif g > 255:
        g = 255
    if b < 0:
        b = 0
    elif b > 255:
        b = 255
    return '%02x%02x%02x'.upper() % (r,g,b)

但是,我不想放置所有 if/elif 语句,因为它们占用了太多空间。是否可以执行类似 r.range(0,255) 的操作来将无效数字更改为最接近的数字?例如,-20 将更改为 0,300 将更改为 255。

任何帮助将不胜感激。

【问题讨论】:

标签: python


【解决方案1】:

我认为大多数人使用的成语对于某些value来说看起来像这样:

maxValue = 255
minValue = 0

min(maxValue, max(minValue, value))

【讨论】:

  • 恐怕你的代码掩盖了默认的maxmin
  • 哈!是的,这些都是非常糟糕的变量名选择。已编辑。
【解决方案2】:

如果你想看中它,这很好用:

r, g, b = (min(255, max(0, c)) for c in (r, g, b))

例子:

In [1]: r, g, b = -1, 145, 289

In [2]: r, g, b = (min(255, max(0, c)) for c in (r, g, b))

In [3]: r, g, b
Out[3]: (0, 145, 255)

【讨论】:

  • 您的第一个代码示例的最大值和最小值相反。 [max(255, min(0, c)) for c in (-10, 300, 150)] 返回[255, 255, 255]
【解决方案3】:

如果您的值总是打包为“类似列表”的结构(例如,元组、列表、numpy 数组),请考虑使用 Numpy 的 clip 函数。然后,在下面的示例中,您可以避免将值解包到变量 r、g 和 b 中。

#!/usr/bin/env python


import numpy as np


def clip(r, g, b, min_val=0, max_val=255):
    return tuple(np.clip((r, g, b), min_val, max_val))


def main():
    x = clip(-20, 1, 256)
    print(x)

    x = clip(0, 300, -1)
    print(x)

    x = clip(1, 100, 255)
    print(x)

    y = (-20, 1, 256)
    y = clip(*y)  # Unpack y into r, g, b, if you like
    print(y)


if __name__ == '__main__':
    main()

输出:

(0, 1, 255)
(0, 255, 0)
(1, 100, 255)
(0, 1, 255)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2010-10-07
    • 2014-08-04
    相关资源
    最近更新 更多