python模块--2017-7-31

如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失。因此,如果你想要编写一些更大的程序,最好使用文本编辑器先编写好,然后运行这个文件。 这就是所谓的创建脚本随着你的程序变得越来越长,你可能想要将它分成几个文件,这样更易于维护。你还可能想在几个程序中使用你已经编写好的函数,而不用把函数拷贝到每个程序中。

为了支持这个功能,Python 有种方法可以把你定义的内容放到一个文件中,然后在脚本或者交互方式中使用。这种文件称为模块模块中的定义可以 导入 到其它模块或 主模块 中。

模块是包含 Python 定义和声明的文件。文件名就是模块名加上.py 后缀。在模块里面,模块的名字(是一个字符串)可以由全局变量 __name__ 的值得到。例如,用你最喜爱的文本编辑器在当前目录下创建一个名为 fibo.py 的文件,内容如下:


6.1 深入模块

import 语句的一个变体直接从被导入的模块中导入名字到导入模块的符号表中。例如:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377


6.1.1 执行模块

当你用下面的方式运行一个 Python 模块

python fibo.py <arguments>

模块中的代码将会被执行,就像导入它一样,不过此时 __name__ 被设置为 "__main__" 也就是说,如果你在模块后加入如下代码:

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

就可以让此文件既可以作为可执行的脚本,也可以当作可以导入的模块,因为解析命令行的那部分代码只有在模块作为 “main” 文件执行时才被调用:

$ python fibo.py 50
1 1 2 3 5 8 13 21 34

如果模块是被导入的,将不会运行这段代码:

>>>
>>> import fibo
>>>

这种方法通常用来为模块提供一个方便的用户接口,或者用来测试(例如直接运行脚本会执行一组测试用例)


6.1.2 模块搜索路径

当导入一个名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会接着到 sys.path 变量给出的一系列目录中查找名为 spam.py 的文件。sys.path 变量的初始值来自这些位置:

  • 脚本所在的目录(或当前目录)。
  • PYTHONPATH (一个包含目录名的列表,与 shell 变量PATH 的语法相同)。
  • 与安装相关的默认值。

6.1.3 “编译过的”python文件

对于使用了大量标准模块的简短程序,有一个提高启动速度的重要方法,如果在spam.py所在的目录下存在一个名为spam.pyc的文件,它会被视为spam模块的已“编译”版本。

PY 与 PYC

最近在操作mininet的时候,在/home/mininet/mininet文件下面发现每个.py文件下面都有一个.pyc文件,开始以为是C/C++中的.c/cpp文件与.h文件的关系,后来经过查阅,原来Python的程序中,是把原始程序代码放在.py文件里,而python会在执行.py文件的时候。将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快下次执行文件的速度。

所以,在我们运行python文件的时候,就会自动首先查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。

其实并不是所有的.py文件在与运行的时候都会差生.pyc文件,只有在import相应的.py文件的时候,才会生成相应的.pyc文件


6.2 标准模块

Python 带有一个标准模块库,并发布有单独的文档叫Python 库参考手册(以下简称"库参考手册")。有些模块被直接构建在解析器里;这些操作虽然不是语言核心的部分,但是依然被内建进来,一方面是效率的原因,另一方面是为了提供访问操作系统原语,如系统调用的功能


6.3 dir( )函数

内置函数 dir() 用来找出模块中定义了哪些名字。它返回一个排好序的字符串列表:


6.4 包

包是一种管理 Python 模块命名空间的方式,采用“点分模块名称”。例如,模块名 A.B 表示包A 中一个名为 B 的子模块。就像模块的使用让不同模块的作者不用担心相互间的全局变量名称一样,点分模块的使用让包含多个模块的包(例如 Numpy 和 Python Imaging Library)的作者也不用担心相互之间的模块重名。

假设你想要设计一系列模块(或一个“包”)来统一处理声音文件和声音数据。现存很多种不同的声音文件格式 (通常由它们的扩展名来识别,例如: .wav, .aiff, .au),因此你可能需要创建和维护不断增长的模块集合来支持各种文件格式之间的转换。你可能还想针对音频数据做很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所以你还需要编写一组永远写不完的模块来处理这些操作。你的包可能会是这个结构(用分层的文件系统表示):

用户可以从包中导入单独的模块,例如:

from sound.effects import echo

还有另一种变化方式是直接导入所需的函数或变量:

from sound.effects.echo import echofilter

6.4.1 从包中导入*

6.4.2 包内引用





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值