文章目录
- 9.1 dir()
- 9.2 hash()
- 9.3 help()
- 9.4 id()
- 9.5 type()
9.1 dir()
dir() 是 Python 中的一个内置函数,用于返回一个对象的所有属性和方法的列表。当dir()不带参数调用时,它会返回当前作用域中的变量、方法和定义的类型列表。如果dir()带有一个参数,它将返回该对象的所有属性和方法。
这里有一些使用 dir() 的例子:
# 列出当前作用域中的变量和函数
print(dir())# 列出一个模块的所有函数和变量
import math
print(dir(math))# 列出一个类的所有属性和方法
class MyClass:def __init__(__self__):passdef my_method(self):passmy_instance = MyClass()
print(dir(my_instance))# 列出内置函数和异常
print(dir(__builtins__))
当dir()用于模块时,它通常返回模块的公共函数、变量和类的列表。当dir()用于对象实例时,它返回该实例的属性和方法的列表,包括从父类继承来的那些。
需要注意的是,dir()返回的列表可能包含特殊的方法名(如__init__、__str__等),这些方法名以双下划线开头和结尾,并且在Python中具有特殊的意义。此外,dir()返回的列表并不是固定的,因为它可能包括由对象定义的动态属性。
在调试和了解对象结构时,dir()是一个非常有用的工具。
9.2 hash()
hash() 是 Python 中的内置函数,用于返回一个对象的哈希值(hash value)。哈希值是一个整数,它是通过哈希算法计算得出的,该算法旨在对于不同的输入(即不同的对象)尽可能产生不同的输出(即哈希值)。
哈希值主要用于数据结构如字典(dict)的键(key),因为它们需要能够快速并且唯一地标识一个对象。字典通过使用哈希表来存储键值对,其中键的哈希值用于快速查找对应的值。
哈希算法的一个关键特性是,如果两个对象的哈希值相同(这种情况称为哈希冲突),那么这两个对象不一定相等;但如果两个对象相等(即使用 == 运算符比较结果为 True),则它们的哈希值必须相同。
需要注意的是,不是所有的对象都可以被哈希。例如,列表(list)和字典(dict)等可变对象就不能被哈希,因为它们的内容可以改变,这会导致哈希值不再有效。只有不可变(immutable)的对象,如整数、浮点数、字符串和元组(如果元组的内容也是不可变的),才能被哈希。
下面是一些使用 hash() 函数的例子:
# 字符串的哈希值
hash_value_str = hash("hello")
print(hash_value_str) # 输出一个整数# 整数的哈希值
hash_value_int = hash(123)
print(hash_value_int) # 输出一个整数# 元组的哈希值(如果元组内容不可变)
hash_value_tuple = hash((1, 2, 3))
print(hash_value_tuple) # 输出一个整数# 列表不能被哈希
# hash_value_list = hash([1, 2, 3]) # 这会抛出 TypeError# 尝试哈希一个不可哈希的类型会抛出 TypeError
try:hash_value_dict = hash({"key": "value"}) # 抛出 TypeError
except TypeError as e:print(e) # 输出错误信息
在上面的例子中,字符串、整数和不可变元组都可以被哈希,并会返回相应的整数哈希值。而尝试哈希一个列表(可变对象)或字典会抛出 TypeError 异常。
9.3 help()
help() 是 Python 中的一个内置函数,它提供了一个交互式的帮助系统。当你在 Python 解释器或交互式环境中调用 help() 时,它会打开一个帮助会话,你可以在这个会话中查询模块、关键字、属性、方法等的帮助信息。
你可以通过以下几种方式使用 help() 函数:
不带参数调用:这将启动一个交互式的帮助系统,你可以在其中输入模块、类、方法或函数的名称来获取相应的帮助信息。```python
help()
```
查询模块:你可以直接查询某个模块的帮助信息。
```
python
help(module_name)
```
查询关键字:你可以查询 Python 语言的关键字。
```
python
help('keywords')
```
查询函数或方法:你可以查询某个函数或方法的帮助信息。
```
python
help(function_name)
```
查询类:你可以查询某个类的帮助信息,包括其方法、属性等。
```
python
help(class_name)
```
查询字符串方法:你可以查询字符串等内置类型的方法。
```
python
help('string methods')
```
当你输入一个查询后,help() 会显示与该查询相关的详细信息,包括函数的参数、返回值、用途等。
这里是一个简单的例子,展示如何使用 help() 查询一个内置函数的帮助信息:
# 查询 print 函数的帮助信息
help(print)
输出将类似于以下内容:
Help on built-in function print in module builtins:print(...)print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)Prints the values to a stream, or to sys.stdout by default.Optional keyword arguments:file: a file-like object (stream); defaults to the current sys.stdout.sep: string inserted between values, default a space.end: string appended after the last value, default a newline.flush: whether to forcibly flush the stream.
help() 函数是 Python 中获取代码帮助的一个非常有用的工具,尤其是在你忘记某个函数或方法的用法时。
9.4 id()
id() 是 Python 的内置函数,它返回一个对象的“身份”标识符,这个标识符通常是一个整数。这个“身份”标识符是对象在内存中的唯一地址,它对于该对象的生命周期来说是恒定的,即只要对象存在,它的 id() 值就不会改变。
在 Python 中,对象的身份是唯一的,即使两个对象的内容完全相同(例如两个包含相同元素的列表),它们的 id() 值也会是不同的,因为它们在内存中的地址是不同的。
下面是一些使用 id() 的例子:
# 获取整数的身份标识符
print(id(123)) # 输出一个整数,代表这个整数的内存地址# 获取字符串的身份标识符
print(id("hello")) # 输出一个整数,代表这个字符串的内存地址# 获取列表的身份标识符
my_list = [1, 2, 3]
print(id(my_list)) # 输出一个整数,代表这个列表的内存地址# 即使两个列表内容相同,它们的身份标识符也不同
other_list = [1, 2, 3]
print(id(other_list)) # 输出另一个整数,与 my_list 的 id 不同# 身份标识符在对象的生命周期中保持不变
print(id(my_list)) # 再次打印 my_list 的身份标识符,值应该与前面相同
id() 函数通常用于调试和性能分析,因为它可以帮助你了解对象在内存中的位置。但是,需要注意的是,由于对象的身份标识符是内存地址的整数表示,所以它可能因程序的运行环境和垃圾回收等因素而变化,因此不应该被用于持久化对象的唯一标识。
在 Python 中,更常用的对象是持久化标识的是对象的哈希值,通过 hash() 函数获得。然而,哈希值对于不可变类型是固定的,但对于可变类型则可能随着对象内容的改变而改变。
9.5 type()
type() 是 Python 中的一个内置函数,它用于返回一个对象的类型。当你对一个对象使用 type() 函数时,它会返回这个对象的数据类型。
这里有一些使用 type() 函数的例子:
# 获取整数的类型
print(type(123)) # <class 'int'># 获取字符串的类型
print(type("hello")) # <class 'str'># 获取列表的类型
my_list = [1, 2, 3]
print(type(my_list)) # <class 'list'># 获取自定义类的实例类型
class MyClass:passobj = MyClass()
print(type(obj)) # <class '__main__.MyClass'># 获取模块的类型
import math
print(type(math)) # <class 'module'># 获取函数的类型
def my_function():passprint(type(my_function)) # <class 'function'>type() 函数也可以用来动态地创建类型。例如,你可以使用 type() 函数来动态地创建一个新的类:python
# 动态地创建一个新的类
MyNewClass = type('MyNewClass', (object,), {'hello': lambda x: x * 2})# 创建该类的实例并调用其方法
instance = MyNewClass()
print(instance.hello(5)) # 输出 10
在这个例子中,type() 函数接受三个参数:
- 类名(字符串)
- 基类的元组(通常至少包含一个对象,通常是 object,表示新类继承自基本对象类型)
- 一个字典,其中包含了新类的属性和方法
type() 函数在这种情况下被用作一个元类(metaclass)来创建类。元类是创建类的“类”,它们用于控制类的创建行为。在大多数应用中,你不需要直接使用元类,但是了解它们的概念和用法可以帮助你更深入地理解 Python 的面向对象编程。