模块
如果从Python解释器退出并再次输入,您所做的定义(函数和变量)将丢失。
一个.py文件就是一个模块,模块名就是没有后缀的文件名。全局变量__name__保存的是当前模块的名称。最顶层的主模块__name__ 是 __main__。
通过import可以把其他模块定义的东西引入到当前模块下使用:
modulename.functionname(),也可以分配一个当前模块下的名字,如: name= modulename.functionname(),然后直接调用name。
模块搜索顺序:
1,先从built-in module 找
2,再从sys.path找
sys.path包含input script所在目录及安装时的一些默认路径及PYTHONPATH 类似java的环境变量path。
>>> import sys
>>> sys.path
['C:\\Users\\lenovo\\Desktop', 'F:\\Program Files\\Python36\\python36.zip', 'F:\\Program Files\\Python36\\DLLs', 'F:\\Program Files\\Python36\\lib', 'F:\\Program Files\\Python36', 'F:\\Program Files\\Python36\\lib\\site-packages']
>>> sys.path.append('C:\\Users') #增加路径
>>> sys.path
['C:\\Users\\lenovo\\Desktop', 'F:\\Program Files\\Python36\\python36.zip', 'F:\\Program Files\\Python36\\DLLs', 'F:\\Program Files\\Python36\\lib', 'F:\\Program Files\\Python36', 'F:\\Program Files\\Python36\\lib\\site-packages', 'C:\\Users']
>>>
模块加载速度
为了加快加载模块的速度,Python在__pycache__目录下缓存每个模块编译好的版本,名字为module.version.pyc。读取.pyc文件的程序不比读取.py文件的程序运行得更快,.pyc文件唯一快的地方在于它们加载的速度。
dir()
用于列出模块定义了哪些variables, modules, functions, etc。
不带参数的dir()列出当前模块的(不包含内置模块)。
>>> import fibo
>>> dir(fibo)
['__name__', 'fib', 'fib2']
Packages
sound/ #主文件夹
__init__.py #初始化主文件夹,此文件可以是空内容,主要表明sound是个package
formats/ #子文件夹
__init__.py #表明子文件夹也是一个包
wavread.py #子包下的具体模块
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ #Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ #Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
如下导入的模块echo(没有py后缀),调用模块中的函数必须用全称
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
如下导入的echo模块,调用时则只要简称
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
如下只导入了echo的echofilter函数,可以直接调用,但需要注意原模块会不会有同名函数被覆盖。
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
模块可以,但函数不能这样导入。
import sound.effects.echo. echofilter
关于import *
import是用来导入模块的,所以import后面一般接模块名。但也可以接package,这时并不会导入package里面的模块,而仅仅是执行package下的__init__.py。通常__init__.py的内容就是import该包内的一些模块,从而间接import包内许多模块。
from sound.effects import * 导入子包effects包 下所有模块,但不建议import *,效率低。并且如果子包的__init__.py中有代码 __all__ = [“echo”, “surround”, “reverse”]则import *只会引入这三个模块,而不是所有模块。
相对路径
以上说的是绝对路径,而相对路径通过一个点是一个父亲。如果sound也只是一个子包, surround是当前模块,那么:
from . import echo
from .. import formats
from ..filters import equalizer #只两个点
如果当前模块是__main__(顶层包)只能用绝对路径导入。