模块的使用

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,但都必须遵循这个原则。

 

posted @ 2017-10-20 17:13  静静别跑  阅读(164)  评论(0编辑  收藏  举报