python 模块

一、模块

1.import....

一个py文件就可以作为一个模块

模块的导入:直接导入文件的名字,不需要带着后缀

模块中的函数调用:模块名.函数名()

导入模块的时候做了三件事:1.首先开辟了一个新的命名空间my_moudle

             2.执行了my_moudle内的代码

             3.将my_moudle里面的名字和命名空间绑定在一起了

注意:模块在一个程序中只会被导入一次,不会重复导入(为了节约资源)那么,如何实现模块在程序中只会被导入一次呢?

当导入一个文件之后,会将模块存储在内存中,当再次导入的时候,就会到内存中查看是否导入过这个模块,如果已经导入过了,就不用再导入了。是通过sys里面的module方法

1 import sys
2 for i in sys.modules:  #查看是否导入过这个模块
3     print(i)

导入的模块有自己的命名空间(可以给导入的模块起一个别名,就产生了一个命名空间,这个命名空间只和别名相关)

import  my_moudle  as mm<br>print(mm.money)
1 #mysql.py
 2 def sqlparse():
 3     print('from mysql sqlparse')
 4 #oracle.py
 5 def sqlparse():
 6     print('from oracle sqlparse')
 7 
 8 #test.py
 9 db_type=input('>>: ')
10 if db_type == 'mysql':
11     import mysql as db
12 elif db_type == 'oracle':
13     import oracle as db
14 
15 db.sqlparse() 
View Code

2.from ...import...(也支持别名)

  这种形式导入啥就能用啥,不导入的一律不能用

  这个被import导入的名字就相当于属于全局变量了

1 from tmp import read1
2 read1()
3 from tmp import read
4 read()

参数问题和返回值问题都和函数一样(在哪返回在哪接收,在哪传参的在哪给参)

 1 from zeze import read1
 2 money = 1000
 3 read1()
 4  
 5 # -------------------
 6 from zeze import read2
 7 def read1():
 8     print('==========')
 9 read2()
10 read1()
from..import..
1 #测试三:导入的函数read1,被当前位置定义的read1覆盖掉了
2 from zeze import read1
3 def read1():
4     print('==========')
5 read1()
View Code

需要特别强调的一点是:python中的变量赋值不是一种存储操作,而只是一种绑定关系,如下:

1 from zeze import money,read1
2 money=200#将当前位置的名字money绑定到了200
3 
4 print(money)#打印当前的名字
5 read1()#读取zeze.py中的名字money,仍然为100

 

from...import *

*与all一起用的,首先会把模块中的所有不是‘_’开头的内容导入进来

可以通过__all__来控制导入的内容,但是只和*有关

*和__all__配合:__all__['read1','read2'],all里面导入什么,*里面就有什么,如果不用all,就都导入进来了。

 

1 # from my_moudle import *
2 # from my_moudle import _money
3 # print(read1)
4 # print(read2)
5 # print(_money)
6 # print(read)

3.把模块当做脚本执行

 
 1 #mytmp.py
 2 import mokuai
 3 print(mokuai.money)
 4 # 如果想让自己定义的模块,像和re模块的调用一样,执行的时候不显示什么,调用的时候才显示,为了 让tmp也一样不显示里面的内容,就在tmp模块里面判断一下 if __name__=='__main__':
 5 
 6 
 7 #tmp.py
 8 money = 100
 9 def read1():
10     print('read1',money)
11     return 'hello'
12 
13 def read2():
14     print('read2')
15 
16 if __name__=='__main__':
17      read1()
18      read2()

4.模块搜索路径

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

lib里面放的是内置模块

扩展模块一般在site-packages中

sys.path:注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理。

千万不要自己定义这些你熟悉的模块或关键字啊啥的作为自己的模块名

5.编译python文件

为了提高加载模块的速度,强调:提高的是加载速度而绝非运行速度。python解释器会在__pycache__目录中下缓存每个模块编译后的版本,格式为:module.version.pyc。通常会包含python的版本号。

1.以pyc为后缀的就为编译文件

2.编译pyc文件的时候,只有在导入文件的时候才做(就是作为一个模块的时候他才去编译)

posted @ 2018-07-16 10:20  ivanthor  阅读(82)  评论(0)    收藏  举报