原本只想说下内建函数的,但越往下说,感觉东西越多,索性就讨论下内建模块。在开始内建模块之前,先来看下Python虚拟机从启动到结束的整个过程(以下参考《Python学习笔记》):
1. 创建解释器和主线程状态对象,这是整个进程的根对象。
2. 初始化内置类型。数字、列表等类型都有专门的缓存策略需要处理。
3. 创建 __builtin__ 模块,该模块持有所有内置类型和函数。
4. 创建 sys 模块,其中包含了 sys.path、modules 等重要的运⾏期信息。
5. 初始化 import 机制。
6. 初始化内置 Exception。
7. 创建 __main__ 模块,准备运⾏所需的名字空间。
8. 通过 site.py 将 site-packages 中的第三⽅扩展库添加到搜索路径列表。
9. 执⾏⼊⼝ py ⽂件。执⾏前会将 __main__.__dict__ 作为名字空间传递进去。
10. 程序执⾏结束。
11. 执⾏清理操作,包括调⽤退出函数,GC 清理现场,释放所有模块等。
12. 终⽌进程。
从上面的过程中,内建函数是在__builtin__模块中,但是这里需要先导入__builtin__模块,原因后面会说。然后可以通过dir()来查看这个模块的属性:
>>> import __builtin__
>>> dir(__builtin__)
在列出的属性中,我们可以分成三类:首先是异常类型(黑色下划线起、始),也就是try能捕获的错误类型;第二类(橙色下划线起、始)是Python的特殊方法,第三类(红色下划线起、始)就是内建函数。
对于模块的每个属性,可通过help() 函数获得帮助。内建模块属性的好处就是,它不需要import就能直接用。而内建函数一共80个左右,这些函数集对应了Python各类对象的常用相关操作。关于更多内建函数的使用,也可参考官方文档:https://docs.python.org/2/library/functions.html#built-in-funcs。
下面讨论下内建模块与之对应还有个模块名是:__builtins__,通常情况下,这个模块与__builtin__模块属性是一样的,因为__builtins__可看作是__builtin__的一个别名引用。它们的区别是:
1)可见性。对于__builtins__模块,在任何地方都是可见的。而__builtin__模块则需要导入才可见,这也是上面为什么在查看__builtin__属性时,需要导入的原因了;
2)在主模块中(__main__),两者没有区别;在非主模块中,__builtins__仅仅是__builtin__.__dict__这一个属性的引用,而非__builtin__本身。此时__builtins__是字典类型。__builtin__属性仍不变。
3)不同Python版本的差异,在Python2.X中,内建模块名是:__builtin__,而Python3.X中是:builtins。而__builtins__ 在两个版本中名字和属性都是一样的。