一、模块
1、什么是模块
模块就是一系列功能的集合体
模块大致分为四种类别:
1、一个py文件就是一个模块,文件名叫test.py,模块名叫test
2、一个包含有__int__.py文件的文件夹称之为包,包也是模块
3、使用c编写并链接到python解释器的内置模块
4、已被编译为共享库或者DLL的C或者C++的拓展
模块有三种来源:
1、自带的模块
2、第三方模块:pip3 install requests
3、自定义模块
2、为何要用模块
1、(自定义模块、第三方模块)拿来主义,为了提高开发效率
2、自定义模块是为了解决代码冗余问题
3、如何用模块
模块都是用来被导入使用的,不是用来运行的
首次导入模块发生的3件事情
1、执行py文件
2、产生py文件的名称空间,将py文件运行过程中产生的名字丢到该文件的名称空间中
3、在当前文件中产生一个名字,该名字指向2中产生的而名称空间
之后的导入,都是直接引用首次导入产生的名称空间,不会重复执行代码
二、模块的import引用
强调用:模块名.名字,指名道姓的问某一个模块要名字对应的值,不会与当前名称空间的名字发生冲突
强调2:无论是查看还是修改,都是以原模块为基准的,与调用位置无关
拓展:
可以以逗号为分隔符,在一行导入多个模块。
建议还是分开写如下
import time
import foo
import m
import time,foo,m #不建议
导入模块的规范
I、python内置模块
II、第三方模块
III、程序员自定义模块
例:
import time
import sys
import 第三方1
import 第三方2
import 自定义模块1
import 自定义模块2
import 自定义模块3
import...as...
如果文件名过长,可以起别名
import foooooooooooooo as f #f=fooooooooooooo
f.get()
5、模块是第一类对象
6、自定义模块的命名应该采用纯小写加下划线的风格
7、可以在函数内导入模块去使用
def func():
import foo
三、一个py文件有两种用途
1、被当成程序运行
2、被当作模块导入
二者的区别:
1、当文件被运行时,__name__的值为__main__
2、当文件被当作模块导入时,__name__的值为**
打main+回车
四、from+import
用import导入模块优缺点:
优点:肯定不会与当前名称空间中的名字冲突
缺点:加前缀显得麻烦
from...import...导入也发生了三件事
1、产生一个模块的名称空间
2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去
3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址
from foo import x
from foo import get
from foo import change
优点:不用加前缀,代码更精简
缺点:容易与当前名称空间混淆
拓展
一行导入多个名字(不推荐)
from foo import x, get, change
用*导入所有的名字(极其不推荐)
from foo import *
香是挺香的,但是非常容易发生冲突
五、循环导入的问题
尽量不要出现循环导入,把两个功能放到第三方去。
如果发生了循环导入,解决方法如下:
def f(): #定义一个函数来导入,定义阶段不会执行,
放在开头增加可读性
from m2 import y
print(y)
六、模块的搜索路径与优先级
1、内存中已经导入好的
2、内置的
3、sys.path #这是一个列表,记录的元素都是文件夹。临时加。
import sys
sys.path.append(r'D:python17day02')