Python3 hex() 函数(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Python 编程语言中,进制转换是一个基础但重要的操作场景。无论是开发底层协议解析工具,还是处理加密算法,或是调试内存地址信息,开发者经常需要将十进制数值快速转换为十六进制形式。此时,Python3 hex() 函数 就像一座连接十进制与十六进制世界的桥梁,帮助开发者高效完成这一转换任务。本文将从基础用法、原理剖析到实战案例,循序渐进地讲解这一函数的核心知识,帮助读者建立完整的认知体系。


什么是 Python3 hex() 函数?

hex() 是 Python 内置函数之一,其全称是 "hexadecimal" 的缩写。它的核心功能是将一个整数(十进制)转换为对应的十六进制字符串。这个转换过程类似于数学中将数字从基数 10 转换到基数 16 的运算,但通过 hex() 函数,开发者无需手动计算,即可直接获得结果。

基础用法示例

decimal_number = 255  
hex_result = hex(decimal_number)  
print(hex_result)  # 输出:0xff  

negative_number = -42  
hex_negative = hex(negative_number)  
print(hex_negative)  # 输出:-0x2a  

关键点解析

  1. 返回值格式:结果字符串以 0x 前缀标识十六进制,负数会直接添加 - 符号
  2. 参数类型限制:仅支持整数类型(int),浮点数会引发 TypeError
  3. 不自动补零:与某些语言不同,hex() 不会自动补全到固定位数

进一步理解十六进制转换原理

要深入掌握 hex() 的用法,需要理解 进制转换的本质。可以将其想象为不同语言之间的翻译:

比喻
十进制是人类日常交流的“母语”,而十六进制是计算机系统内部的“方言”。hex() 函数就像一位翻译官,将十进制的“数字故事”用十六进制的语法重新表达。

转换步骤分解(以 255 → 0xff 为例)

  1. 十进制 → 二进制:255 的二进制表示为 11111111
  2. 二进制 → 十六进制:将二进制每4位分组(1111 1111),对应十六进制的 ff
  3. 添加前缀:最终结果为 0xff

其他进制函数对比

Python 还提供 bin()(二进制)、oct()(八进制)等函数,它们的使用逻辑与 hex() 完全一致:

print(bin(10))   # 0b1010  
print(oct(10))   # 0o12  
print(hex(10))   # 0xa  

实战案例:hex() 函数的常见应用场景

案例1:调试内存地址

在开发中,hex() 常用于将内存地址(整数形式)转换为可读的十六进制字符串:

class Test:  
    pass  

obj = Test()  
memory_address = id(obj)  
print(hex(memory_address))  # 输出类似:0x7f8b2c0a13d0  

案例2:颜色编码处理

网页开发中,颜色常以十六进制表示(如 #ff0000 表示红色)。通过 hex() 可快速生成:

def rgb_to_hex(r, g, b):  
    return f"#{hex(r)[2:]:0>2}{hex(g)[2:]:0>2}{hex(b)[2:]:0>2}"  

print(rgb_to_hex(255, 0, 0))  # 输出:#ff0000  

技巧[2:] 用于去除 0x 前缀,0>2 表示不足两位时补零

案例3:加密算法中间步骤

在对称加密算法中,十六进制字符串常用于中间数据的存储与传输:

def encrypt_data(plain_text):  
    # 简化示例:将 ASCII 码转换为十六进制  
    hex_data = ''.join([hex(ord(c))[2:] for c in plain_text])  
    return hex_data  

print(encrypt_data("AB"))  # 输出:4142  

异常处理与函数限制

常见错误类型

  1. TypeError:当输入非整数类型时触发
    hex(3.14)  # 抛出:TypeError: 'float' object cannot be interpreted as an integer  
    
  2. ValueError:间接引发,例如通过 int() 转换十六进制字符串时格式错误
    int("0x1G", 16)  # 抛出:ValueError: invalid literal for int() with base 16: '0x1G'  
    

解决方案

  • 类型检查:在调用 hex() 前,使用 isinstance() 确保参数为整数
    def safe_hex(n):  
        if not isinstance(n, int):  
            raise TypeError("Input must be an integer")  
        return hex(n)  
    
  • 异常捕获:通过 try-except 处理可能的错误
    try:  
        result = hex(float("3.14"))  
    except TypeError as e:  
        print(f"Error: {str(e)}")  
    

进阶技巧:与其他函数的组合使用

技巧1:十六进制字符串 → 整数转换

通过 int() 函数可逆向操作:

hex_str = "0xff"  
decimal_value = int(hex_str, 16)  # 结果为 255  

技巧2:自定义十六进制格式

使用格式化字符串控制输出长度:

number = 15  
formatted_hex = f"0x{number:04x}"  # 输出:0x000f  

技巧3:批量转换与列表推导式

处理多个数值时,结合列表推导式提升效率:

numbers = [10, 255, 0, -1]  
hex_list = [hex(n) for n in numbers]  
print(hex_list)  # 输出:['0xa', '0xff', '0x0', '-0x1']  

性能与替代方案

性能对比

hex() 函数是 Python 的 C 语言层实现,性能优异。与手动编写转换逻辑相比,其速度优势显著:

import timeit  

def manual_hex(n):  
    hex_chars = "0123456789abcdef"  
    result = ""  
    while n > 0:  
        result = hex_chars[n % 16] + result  
        n = n // 16  
    return "0x" + result  

print(timeit.timeit("hex(1000000)", number=100000))          # 约 0.02 秒  
print(timeit.timeit("manual_hex(1000000)", number=100000))  # 约 1.2 秒  

替代方案:format() 函数

对于需要自定义格式的场景,可使用 format()

print(format(255, "#x"))   # 输出:0xff  
print(format(-42, "#X"))   # 输出:-0X2A(大写形式)  

结论

Python3 hex() 函数 是开发者工具箱中不可或缺的实用工具,它简化了十进制与十六进制之间的转换,为调试、数据处理和系统开发提供了高效支持。通过本文的讲解,读者不仅掌握了其基础用法,还了解了如何结合其他函数实现进阶功能,以及如何处理常见问题。

在实际项目中,建议将 hex() 与类型检查、格式化技巧结合使用,确保代码的健壮性与可读性。随着对进制转换原理的深入理解,开发者能够更灵活地应对网络编程、数据加密、硬件交互等复杂场景的需求。

掌握这一函数后,读者可以进一步探索 Python 的 bitstring 库、struct 模块等进阶工具,逐步构建起完整的二进制数据处理能力体系。

最新发布