十二、模块

十二、模块

1、引子:

1、什么是模块:

  模块就是一系列功能的集合体

    模块有三种来源:

    1.内置的模块

    2.第三方的模块

    3.自定义的模块

    模块的格式:

    1.使用python编写的.py文件

    2.已被编译为共享库或DLL的c或c++扩展

    3.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)

    4.使用c编写并连接到python解释器的内置模块

2、为何要用模块:

  1.使用内置的或者第三方模块的好处是:拿来主义,可以极大提升开发效率

  2.使用自定义模块的好处是:可以减少代码冗余(抽取我们自己程序中要公用的一些功能定义成模块,然后程序的各部分组件都去模块中调用共享功能)

3、如何使用模块:

  大前提:一定要区分开谁是执行文件,谁是被导入模块

2、模块功能关键字import:

1、列如:

文件名是spam.py,模块名则是spam

首次导入模块会发生:

1.会产生一个模块的名称空间

2.执行文件spam.py将执行过程中产生的名字都放到模块的名称空间中

3.在当前执行文件的名称空间中拿到一个模块名,该名字指向模块的名称空间

import spam

之后的导入,都是直接引用第一导入的成果,不会重新执行文件

import spam

import spam

import spam

在执行文件时访问模块名称空间中名字的语法:模块名,名字

import spam

print(spam.x)指名道姓的跟spam要名字x,肯定不会与当前执行文件中的名字冲突

x向当前执行文件的名称空间要名字

 

总结:import导入模块在使用时必须加上前缀:模块名

优点:指名道姓地向某一个名称空间要名字,肯定不会与当前名称空间中的名字冲突

缺点:但凡应用模块中的名字都需要加前缀,不够简洁

 

可以一行导入多个模块(不推荐)

import spam,os,time

 

可以为模块起别名(注意:模块名应该全为小写)

import spam as sm

 

3、模块功能关键字from...import...:

1、首次导入模块发生3件事:

1.创建一个模块的名称空间

2.执行文件spam.py将执行过程中产生的名字都放到模块的名称空间中

3.在当前执行文件中直接拿到一名字,该名字就是执行模块中相应的名字

from spam import money

 

总结from...import...

优点:使用时,无需再加前缀,更简洁

缺点:容易与当前名称空间中的名字冲突

*代表从被导入模块中拿到所有名字(不推荐使用)

from spam import money,read1,read2

from spam import * #__all__=['money','read1']

起别名:

from spam import read1 as r1

 

4、模块的循环导入问题:

1.解决方案一:把循环导入的语句放到名字定义的后面

print('正在导入m1')

x='m1'

from m2 import y

2.解决方案二:将循环导入语句放到函数内

print('正在导入m1')

def  f1():

  from m2 import y,f2

  print('m1.f1----y:',y)

  f2()

x='m1'

5、区分python文件的两种用途:

1.当文件被执行时__name__=='__main__'

2.当文件被导入时__name__=='模块名'

if __name__=='__mian__':

  f1()#此时是在执行文件本身,用于调试什么的

  f2()#被当做模块执行时,if __name___=='__mian__': 下的代码不会执行

 

6、模块的搜索路径:

1、模块搜索路径的优先级:

1.内存中已经加载过的

2.内置模块

3.sys.path #第一值是当前执行文件所在的文件夹

import sys

print(sys.path)

import time

time.sleep(3)

4.环境变量是以当前执行文件为准的

  强调:所有被导入的模块参照环境变量sys.path都是以执行文件为准的

7、绝对导入与相对导入:

1.绝对导入:以执行文件的sys.path为起点开始导入

  优点:执行文件与被导入的模块中都可以使用

  缺点:所有导入都是以:sys.path为起点,导入麻烦

2.相对导入:参照当前所在文件的文件夹为起始开始查找,称之为相对导入

  点符号:代表当前所在文件的文件夹,一个点代表上一级文件夹,2个点代表上一级的上一级的文件夹

  优点:导入更加简单

  缺点:只能在导入包中的模块时才能使用,不能在执行文件中用

 

posted @ 2018-10-11 15:44  Maple_feng  阅读(182)  评论(0编辑  收藏  举报