模块的使用
1、导入模块的时候,重复导入多次,效果等同导入一次
(看看自己的内存里有没有,如果已经存在,就不干活,没有才导入)
import time import time import time ... # 重复导入,不用的担心报错
2、导入模块,给这个模块创建一个命名空间,在这个命名空间中执行代码
3.模块里面的变量名不影响当前文件里面的同名的变量
(注意:模块本身的名字不能和当前文件中的变量名重名,因为导入模块后,模块名想当于当前文件的全局变量)
import re def findall(): return '11' l = 'abcd' print(re.findall('a',l)) #['a'] re模块里面的函数名 print(findall()) #11 当前文件的函数名
import name as new_name
import time as a print(a.time()) #10000000000 # a.time (time.time,把前面的time重命名成a)
什么时候用这种方式
1.前面的名字太长 重新命名一个简洁的 2.当import的模块和我的文件中的变量同名的时候 3.兼容多个模块的时候 if 是MySQL数据库: import MySQL as db elif 是oracle数据库: import oracle as db db.open db.write ......
注意: 重名名之后,之前的名字失效
导入多个模块注意事项:
1.先导入内置的模块 2.再导入扩展模块: (requests beautifulsoup django selenium paramiko 等) 3.最后导入自定义的模块 (空行隔开)
from collections import namedtuple #也支持as重命名 from collections import namedtuple as abcd namedtuple = 1 ## namedtuple 就会发生重新赋值
import name #引用name模块中的方法较多的时候,用这个
from name import * #不推荐使用
from name import a #当 引用name模块中的1,2个方法的时候,用这个(节省内存)
from name import * 中:
1.把my_module中所有的不是以下划线(_)开头的名字都导入到当前位置 2.*受到 __all__ = [变量名........]的限制, 如果没有__all__,默认全部 定义了__all__,列表中有的变量名才可以用
自定义模块
为了不使模块中的变量直接 调用 或 打印,整个模块文件要加一个判断
if __name__ == ‘__main__’: 模块代码 print(11) ... #在模块自身文件中执行,name==main #在需要导入的当前文件中执行,name == 模块名
import me
当一个py文件被当做一个模块导入的时候,会自动生成一个pyc文件
pyc文件是这个代码编译之后的文件,节省了每一次导入代码之后还要编译的时间
很智能,先检测,没有pyc文件,新创建一个,如果检测pyc文件修改了,在重新编译并覆盖
模块搜索路径
在第一次导入某个模块时(比如my_module),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用,如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找my_module.py文件。
所以模块的查找顺序是:
内存中已经加载的模块->内置模块->sys.path路径中包含的模块
需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。
在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载
sys.path 自己可以修改
1 >>> import sys 2 >>> sys.path.append('/a/b/c/d') #放到后面,会被最后搜索(前提是前面找不到) 3 >>> sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索
注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找
sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理。
#首先制作归档文件:zip module.zip foo.py bar.py import sys sys.path.append('module.zip') import foo,bar #也可以使用zip中目录结构的具体位置 sys.path.append('module.zip/lib/python') #windows下的路径不加r开头,会语法错误 sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\a')
官网解释:
官网链接:https://docs.python.org/3/tutorial/modules.html#the-module-search-path
当一个命名为my_module的模块被导入时,解释器首先会从内建模块中寻找该名字,找不到,则去sys.path中找该名字
sys.path从以下位置初始化
执行文件所在的当前目录
PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
依赖安装时默认指定的
注意:在支持软连接的文件系统中,执行脚本所在的目录是在软连接之后被计算的,换句话说,包含软连接的目录不会被添加到模块的搜索路径中
在初始化后,我们也可以在python程序中修改sys.path,执行文件所在的路径默认是sys.path的第一个目录,在所有标准库路径的前面。这意味着,当前目录是优先于标准库目录的,需要强调的是:我们自定义的模块名不要跟python标准库的模块名重复,除非你是故意的,傻叉。
dir()函数:
内建函数dir是用来查找 模块中定义的名字 ,返回一个有序字符串 列表
import my_module dir(my_module)
如果没有参数,dir()列举出 当前定义的名字
dir()不会列举出内建函数或者变量的名字,它们都被定义到了标准模块builtin中,可以列举出它们,
import builtins dir(builtins)
包:
为了组织好模块,会将多个模块分为包。
简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件。
(一群模块文件的集合 + __init__文件)
python2里面必须有 init
python3 可以没有
1..关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个
包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。