ZetCode

Python hex 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 hex 函数,该函数将整数转换为十六进制字符串。我们将介绍基本用法、格式化、错误处理以及十六进制转换的实际示例。

基本定义

hex 函数将整数转换为带有 "0x" 前缀的小写十六进制字符串。十六进制是使用数字 0-9 和字母 a-f 的 16 进制数字系统。

主要特征:仅适用于整数,返回字符串,处理正数和负数。输出始终以 "0x" 为前缀。

基本整数转换

这是一个简单的用法示例,使用不同的整数展示了 hex 如何将正数、负数和零值转换为十六进制。

basic_hex.py
# Positive integers
print(hex(10))     # 0xa
print(hex(255))    # 0xff

# Negative integers
print(hex(-10))    # -0xa
print(hex(-255))   # -0xff

# Zero
print(hex(0))      # 0x0

此示例展示了带有不同整数值的 hex。 正数进行标准转换,负数保留其符号,零变为 "0x0"。

前缀 "0x" 表示十六进制格式,类似于 Python 字面量的书写方式。字母始终为小写。

大整数转换

hex 函数可以处理任意大的整数,使其适用于密码学和底层编程应用。

large_numbers.py
# Very large numbers
big_num = 2**64 - 1
print(hex(big_num))  # 0xffffffffffffffff

# Extremely large numbers
huge_num = 10**100
print(hex(huge_num)) # 0x1249ad2594c37ceb0b2784c4ce0bf38ace408e211a7caab24308a82e8f10000000000000000000000000

这些示例演示了 hex 如何处理非常大的整数。 Python 的任意精度整数意味着大小没有实际限制。

十六进制表示随数字的大小而增长,显示了 Python 无缝处理大数字的能力。

自定义对象转换

您可以通过实现 __index__ 特殊方法使自定义对象与 hex 一起使用。 此示例创建一个自定义数字类。

custom_hex.py
class CustomNumber:
    def __init__(self, value):
        self.value = value
    
    def __index__(self):
        return self.value
    
    def __repr__(self):
        return f"CustomNumber({self.value})"

num = CustomNumber(42)
print(hex(num))  # 0x2a

CustomNumber 类实现了 __index__ 以返回其整数值。 当我们在实例上调用 hex 时,Python 使用此方法。

此模式对于需要支持十六进制转换同时保持其类型的数字包装器类很有用。

错误处理

当与非整数类型一起使用时,hex 函数会引发 TypeError。 此示例显示了正确的错误处理。

errors.py
try:
    print(hex("hello"))
except TypeError as e:
    print(f"Error: {e}")  # 'str' object cannot be interpreted as an integer

class NoIndex:
    pass

try:
    print(hex(NoIndex()))
except TypeError as e:
    print(f"Error: {e}")  # 'NoIndex' object cannot be interpreted as an integer

这些示例演示了 hex 对不支持类型的行为。 没有 __index__ 的字符串和对象会引发 TypeError

要使类与 hex 一起使用,请实现 __index__,如上一个示例所示。

十六进制格式化替代方案

此示例比较了 hex 与其他十六进制字符串格式化方法。

formatting.py
num = 255

# Using hex()
print(hex(num))            # 0xff

# Using format()
print(format(num, '#x'))   # 0xff
print(format(num, 'x'))    # ff
print(format(num, '04x'))  # 00ff

# Using f-strings
print(f"{num:#x}")         # 0xff
print(f"{num:x}")          # ff
print(f"{num:04x}")        # 00ff

这展示了将数字格式化为十六进制字符串的不同方法。 hex 提供了最简单的接口,但与 format 或 f-字符串相比,控制较少。

格式说明符允许控制前缀包含、填充和大小写,与单独使用 hex 相比,提供了更大的灵活性。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程