python内置函数 H
Python 解释器内置了很多函数和类型,任何时候都能使用。
H
名称 | 描述 |
---|---|
hasattr | 检查对象是否具有指定的属性。 |
hash | 获取对象的哈希值。 |
help | 获取模块、关键字、属性、方法、类、函数等的帮助信息。 |
hex | 将整数转换为其对应的十六进制(hexadecimal)表示形式的字符串。 |
hasattr(object, name)
hasattr()
是 Python 中的一个内置函数,用于检查对象是否具有指定的属性。这个函数接受两个参数:对象和属性名(作为字符串)。如果对象具有指定的属性,则返回 True
;否则返回 False
。
object
:你想要检查其属性的对象。name
:你想要检查的属性的名称,作为字符串传递。
该实参是一个对象和一个字符串。如果字符串是对象的属性之一的名称,则返回 True
,否则返回 False
。(此功能是通过调用 getattr(object, name)
看是否有 AttributeError
异常来实现的。)
hasattr()
函数在以下场景中特别有用:
- 动态访问属性:在不知道对象是否具有某个属性时,可以使用
hasattr()
来安全地检查,然后决定是否尝试访问该属性。 - 对象验证:在验证对象是否满足某些条件时,可以使用
hasattr()
来检查对象是否具有必需的属性。 - 扩展性和灵活性:在编写需要与其他模块或对象交互的代码时,使用
hasattr()
可以使代码更加灵活,因为它可以处理不同对象可能具有的不同属性集。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.is_student = True
def getPerson(self):
pass
# 创建一个 Person 类的实例
person = Person("Alice", 30)
# 使用 hasattr() 检查属性是否存在
print(hasattr(person, 'name')) # 输出: True
print(hasattr(person, 'age')) # 输出: True
print(hasattr(person, 'is_student')) # 输出: True
print(hasattr(person, 'address')) # 输出: False
class Child(Person):
def __init__(self, name, age):
self.child_name = name
self.age = age
def getChild(self):
pass
child = Child('Bob', 7)
print(hasattr(person, 'child_name')) # 输出: False
print(hasattr(child, 'child_name')) # 输出: True
# 子类的__init__覆盖了父类的__init__,所以没有name属性
print(hasattr(child, 'name')) # 输出: False
print(hasattr(person, 'getChild')) # 输出: False
print(hasattr(child, 'getPerson')) # 输出: True
注意事项:
hasattr()
只检查对象是否具有指定的属性,而不检查该属性的值或类型。- 对于继承的情况,如果子类没有覆盖父类的属性,那么
hasattr()
也会认为子类具有该属性。 - 与
getattr()
不同,hasattr()
不会引发异常,它只是简单地返回一个布尔值来表示属性是否存在。如果你尝试使用getattr()
访问不存在的属性且没有提供默认值,它会引发AttributeError
。
hash(object)
hash()
是 Python 的内置函数,用于获取对象的哈希值。哈希值是一个整数,通常用于快速比较对象是否相等或在哈希表等数据结构中存储对象。
返回该对象的哈希值(如果它有的话)。哈希值是整数。它们在字典查找元素时用来快速比较字典的键。相同大小的数字变量有相同的哈希值(即使它们类型不同,如 1 和 1.0)。
备注:对于具有自定义 __hash__()
方法的对象,请注意 hash()
会根据宿主机的字长来截断返回值。
# 获取整数的哈希值
print(hash(123)) # 输出一个整数,每次运行可能不同
# 获取字符串的哈希值
print(hash("hello")) # 输出一个整数,每次运行可能不同
# 尝试获取列表的哈希值会引发 TypeError
# print(hash([1, 2, 3])) # TypeError: unhashable type: 'list'
注意事项:
- 不可变对象:只有不可变对象(如整数、浮点数、字符串、元组等,且元组中的元素也必须是不可变的)才有哈希值。可变对象(如列表、字典、集合等)没有哈希值,因为它们的值可以在运行时改变,这会导致哈希值的不一致。
- 哈希冲突:不同的对象可能有相同的哈希值,这称为哈希冲突。Python 的哈希函数试图最小化这种冲突的可能性,但并不能完全避免。
- 哈希值不变性:对于同一个不可变对象,在程序的整个执行期间,其哈希值是不变的。
哈希值与相等性
在 Python 中,如果两个对象相等(即 ==
运算符返回 True
),那么它们的哈希值必须相同。但是,哈希值相同并不意味着两个对象一定相等。这是因为哈希函数的设计是为了尽可能减少冲突,但并不是为了检测相等性。
哈希在数据结构中的应用
哈希值在 Python 的许多内置数据结构中都有应用,特别是哈希表(在 Python 中实现为字典)。字典使用哈希值来快速查找键对应的值。当你尝试访问字典中的一个键时,Python 会计算该键的哈希值,并使用这个哈希值来快速定位到存储该键-值对的位置。
自定义对象的哈希值
如果你定义了自己的类,并且想要让它的实例具有哈希值(即可用于字典的键或集合的元素),你需要实现 __hash__()
方法。同时,为了保持一致性,你还应该实现 __eq__()
方法来定义相等性。通常,如果两个对象相等,它们的哈希值也应该相同。但是,请注意,如果对象是可变的,那么最好不要实现 __hash__()
方法,因为这可能会导致不可预测的行为。
实现自己的哈希表或类似的数据结构,并希望处理哈希冲突,你可以考虑以下策略:
- 链地址法:如上所述,当发生哈希冲突时,在冲突的位置创建一个链表,并将新的元素添加到链表中。
- 开放寻址法:当发生哈希冲突时,使用某种探测序列(如线性探测、二次探测或双重哈希)来查找下一个可用的槽。
- 再哈希:当发生哈希冲突时,使用另一个哈希函数来计算新的哈希值,并尝试将该值用作新的槽位置。
请注意,这些策略都有其优缺点,并且选择哪种策略取决于你的具体需求和约束条件。在大多数情况下,Python 的标准字典实现已经足够高效,你不需要自己实现哈希表或处理哈希冲突。
help()
help()
help(request)
help()
是一个内置函数,用于获取模块、关键字、属性、方法、类、函数等的帮助信息。当你在交互式解释器或 Python 脚本中调用 help()
时,它会启动一个内置的帮助系统,并提供关于所请求对象的详细文档。
启动内置的帮助系统(此函数主要在交互式中使用)。如果没有实参,解释器控制台里会启动交互式帮助系统。如果实参是一个字符串,则在模块、函数、类、方法、关键字或文档主题中搜索该字符串,并在控制台上打印帮助信息。如果实参是其他任意对象,则会生成该对象的帮助页。
请注意,如果在调用 help()
时,目标函数的形参列表中存在斜杠(/),则意味着斜杠之前的参数只能是位置参数。详情请参阅 有关仅限位置形参的 FAQ 条目。
该函数通过 site
模块加入到内置命名空间。
在 3.4 版本发生变更: pydoc
和 inspect
的变更使得可调用对象的签名信息更加全面和一致。
help() # 获取关于 help() 函数本身的帮助信息
help(print) # 获取 print 函数的帮助文档
help(list) # 获取 list 类的帮助文档
help(list()) # # 获取 list 类的帮助文档
help()
函数在脚本执行完成后会保持打开状态,阻止脚本结束。如果你想要在脚本中打印帮助信息而不保持帮助系统打开,你可以将帮助信息重定向到一个字符串或文件。
import sys
from io import StringIO
# 保存原来的标准输出
old_stdout = sys.stdout
# 创建一个字符串IO对象来捕获输出
new_stdout = StringIO()
# 将标准输出重定向到字符串IO对象
sys.stdout = new_stdout
# 调用 help 函数
help(print)
# 获取捕获的输出
help_text = new_stdout.getvalue()
# 恢复原来的标准输出
sys.stdout = old_stdout
# 打印或处理 help_text
print(help_text)
help()
函数在交互式解释器中特别有用,因为它可以动态地显示帮助信息,并允许用户通过交互来探索 Python 的不同部分。- 在复杂的程序中,如果你想要提供自己的帮助文档或用户指南,可能需要实现更复杂的文档系统,例如使用
docstrings
和pydoc
。 - 当你调用
help()
时,它通常会打开一个交互式帮助系统,你可以在其中输入命令来浏览不同的主题或退出帮助系统。在脚本中,你可能不希望这种交互式的行为,因此可以考虑上述的重定向方法。
help()
函数是一个很好的工具,用于快速了解 Python 的内置函数、模块和其他对象的用法和文档。当你在编写代码或探索新的 Python 库时,它可以帮助你快速上手。
hex(x)
hex()
是一个内置函数,用于将整数转换为其对应的十六进制(hexadecimal)表示形式的字符串。十六进制是计算机中经常使用的一种数字表示方法,它使用16个不同的符号来表示数值,这16个符号包括0-9和A-F。
将整数转换为带前缀 “0x” 前缀的小写十六进制数字符串。 如果 x 不是一个 Python int
对象,则它必须定义返回一个整数的 __index__()
方法。 下面是一些例子:
>>> hex(255)
'0xff'
>>> hex(-42)
'-0x2a'
如果要将整数转换为大写或小写的十六进制字符串,并可选择有无“0x”前缀,则可以使用如下方法:
>>> '%#x' % 255, '%x' % 255, '%X' % 255
('0xff', 'ff', 'FF')
>>> format(255, '#x'), format(255, 'x'), format(255, 'X')
('0xff', 'ff', 'FF')
>>> f'{255:#x}', f'{255:x}', f'{255:X}'
('0xff', 'ff', 'FF')
另见 format()
获取更多信息。
另请参阅 int()
将十六进制字符串转换为以 16 为基数的整数。
备注:如果要获取浮点数的十六进制字符串形式,请使用 float.hex()
方法。
hex()
函数总是返回字符串,并且字符串的前缀是 '0x'
,表示这是一个十六进制数。
如果转换的数是负数,hex()
函数会返回带有负号的十六进制字符串。