以Mark Lutz著的《Python学习手册》为教程,每天花1个小时左右时间学习,争取两周完成。 --- 写在前面的话
2013-7-22 22:00 学习笔记
1,每一个Python文件都是一个模块。模块将变量名封装进了自包含的软件包,这一点可以避免变量名的冲突。
2,导入模块不同于C语言中的#include,并非只是把一个文本内容插入到另一个文件中。导入其实是运行时运算。
3,import会依次搜索以下目录:
- 程序的主目录
- PYTHONPATH目录
- 标准链接库目录
- 任何.pth文件的内容
这个四个组件组合起来就是sys.path。
4,import b 会加载如下文件:
- 源代码文件b.py
- 字节码文件b.pyc
- 目录b(包导入)
- 编译扩展模块(通常用C/C++编写),导入时使用动态链接(Linux的b.so以及Windows的b.dll或b.pyd)
- 用C编写的编译好的内置模块,并通过静态链接至Python
- ZIP文件组件,导入时会自动解压缩
- 内存内映像(对于frozen可执行文件)
- Java类(在Jython中)
- .NET组件(在IronPython中)
如果在相同目录下找到b.py和b.so,Python会遵循一定的标准进行挑选,但这个挑选顺序并不能保证永远不变,因此不要依赖这个挑选标准。
5,以字节码的形式分发程序,可以避免公开源代码。
6,第三方扩展通常使用标准链接库中的distutils工具来自动安装,一般会附带一个setup.py脚本。
7,from会把变量名复制到另一个作用域,避免使用模块来引用。*表示复制模块中的所有变量。例如:
import module1
module1.printer('hello world')
from module1 import printer
printer('hello world')
from module1 imort *
printer('hello world')
8,默认情况下,import导入只发生一次,因为该开销较大。
9,import和from都是赋值语句。前者将整个模块对象赋值给一个变量名,后者将一个或多个变量名赋值给另一个模块中同名的对象。from语句会让变量的位置变得更隐秘和模糊。
10,模块M的命名空间可以通过属性__dict__或dir(M)获得。
11,需要注意模块导入后的作用域。例如有一个模块文件moda.py
X = 88
def fun():
global X
X = 99
导入该模块:
X = 11
import moda
moda.fun()
print X,moda.X
输出结果为:
11 99
12,reload是Python中的内置函数,而不是语句。传递给reload函数的是已经存在的模块对象,而不是变量名。关于reload有一些注意点:
- reload会在模块当前命名空间内执行模块文件的新代码
- 文件中顶层赋值语句会使得变量名换成新值
- 重载会影响所有使用import读取模块的客户端
- 重载不会影响之前使用from来读取模块属性的客户端