Я должен преобразовать (0, 128, 64) к чему-то вроде этого № 008040. Я не уверен, что назвать последний, делающий поиск трудным.
Используйте оператор формата %
:
>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'
Обратите внимание, что он не проверяет границы ...
>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')
или
from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')
python3 немного отличается
from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))
def clamp(x):
return max(0, min(x, 255))
"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))
Здесь используется предпочтительный метод форматирования строк, как описано в PEP 3101 . Он также использует min ()
и max
, чтобы гарантировать, что 0 <= {r, g, b} <= 255
.
В обновлении добавлена функция ограничения, как предлагается ниже.
Обновление Из названия вопроса и приведенного контекста должно быть очевидно, что это ожидает 3 целых числа в [0,255] и всегда будет возвращать цвет при передаче 3 таких целых. Однако, судя по комментариям, это может быть не очевидно для всех, поэтому пусть это будет явно указано:
При условии трех значений
int
, это вернет действительный шестнадцатеричный триплет, представляющий цвет. Если эти значения находятся между [0,255], тогда он будет рассматривать их как значения RGB и возвращать цвет, соответствующий этим значениям.