前言:
目前还在学习模块中,有新笔记再更新。。。
一、模块 Module
1.一个包含有一系列数据、函数、类等组成的程序组 |
|
2.是一个文件,模块文件名通常以‘.py’结尾 |
|
作用 |
1.让一些相关的数据、函数、类等有逻辑的组织在一起,使逻辑结构更加清晰 |
2.模块中的变量,函数和类等可提供给其它模块或程序使用 |
|
分类 |
|
4.用户自己编定的模块(可以作为其他人的第三方模块) |
二、模块的导入
实质:在本地创建变量来绑定模块/函数/数据
2.1 import语句
语法 |
Import 模块名1 [ as 模块新名1], 模块名2[as 模块新名2],… |
示例 |
Import math #导入数学模块 Import sys, os #导入sys和os模块 Import copy as cp |
作用 |
将一个模块整体导入到当前模块中 |
属性用法 |
模块名 . 属性名 例: math.cos(0) #用数学模块的cos属性,求0的cos >>>1.0 Math.pi #π |
查看 |
Help(obj)可以查看模块的文档字符串 例: Help(math) Help(math.cos) |
2.2 From import语句
语法 |
From 模块名 import 模块属性名 [as 属性名新名1], 模块属性名2 [as 属性新名2] |
作用 |
将某模块的一个或多个属性导入到当前模块的作用域 |
示例 |
From math import pi From math import sin #可以直接用sin,不用加‘math.’ |
和import区别 |
1.import math是整体导入,from import只导入模块中个别的函数 |
2.3 from import * 语句
语法 |
From 模块名 import * |
作用 |
将某模块的所有属性导入到当前的模块 |
示例 |
From math import * S = sin(pi/2) Print(factorial(10)) |
会污染当前名字空间, |
2.4 dir函数
语法 |
dir([ 对象 ]) 注:[]可略,返回一个字符串列表 |
作用 |
1.如果没有参数调用,则返回当前作用域内所有变量的列表 |
2.如果给定一个对象作为参数,则返回这个对象的所在变量(属性)列表 a.对于一个模块,返回这个模块的全部变量 b.对于一个类对象,返回类对象的所有变量,并递归基类对象的所有变量 c.对于其他对象,返回所有变量、类变量和基类变量 |
|
Import math:dir()下多了一个‘math’, 让math绑定一个模块 From math import sin:dir()下多了一个‘sin’ From math import *:dir()下创建了很多变量 |
三、模块的搜索
搜索模块的路径顺序 |
1.搜索程序运行时的路径(当前路径) |
2.sys.path提供的路径 a.把模块安装到sys.path路径里面去 b.# import sys # sys.path.append('存放mymod.py的路径') |
|
3.搜索内置模块 |
四、模块的加载
模块加载过程 |
在模块导入时,模块所有语句会执行 |
如果一个模块已经被导入,则再次导入时不会重新执行模块内的语句 就算原模块已经被修改,再次执行模块内的语句还是没变化,所以得用reload |
|
模块的重新加载 |
Import mymod Import imp imp.reload(mymod) #在运行时重新加载mymod模块 |
模块被导入和执行的过程 |
1.先搜索相关路径找模块(.py文件) |
2.判断是否有此模块对应的 .py文件,如果 .pyc文件比 .py文件新,则直接加载 .pyc文件 |
|
3.否则用模块 .py文件生成 .pyc并加载执行 |
|
pyc模块的编译 |
编译 解释执行 mymod.py --------> mymod.pyc ----------> python3 |
五、模块的属性
5.1 常见属性
__doc__属性 |
绑定模块文档字符串 |
|
__file__属性 |
绑定模块对应的文件路径 |
|
__name__属性 |
用来记录模块自身的名字 |
|
作用 |
1.记录模块名 |
|
2.判断是否为主模块 |
||
说明 |
1.当次模块作为主模块(即第一个运行的模块)运行时,__name__绑定__main__ |
|
2.当此模块不是主模块时,__name__绑定模块名(文件名去掉.py后缀) |
||
Mymod.py mymod2.py |
5.2 __all__列表
定义 |
用来存放可导出属性的字符串列表 |
作用 |
限定当用from xxx import * 语句导入时,只导入__all__列表内的属性 |
示例 Mymod4.py #Mymod4.py #__all__列表限定其他模块在用from mymod4.py import *导入时 # 只导入'myfun1', 'myfun3','name1' __all__ = ['myfun1', 'myfun3','name1'] def myfun1(): print('myfun1 被调用') def myfun2(): print('myfun2 被调用') def myfun3(): print('myfun3 被调用') name1 = 'aaaaaa' name2 = 'bbbbbbb' |
5.3 隐藏属性
定义 |
模块中以‘_’开头的属性,在from xxx import *语句导入时将不被导入 |
mymod5.py #mymod5.py ''' 示范隐藏属性 及其用法 模块中以‘_’开头的属性,在from xxx import *导入时将不被导入 ''' def f(): print('f函数被调用') def _f(): print('_f函数被调用') def __f(): print('__f函数被调用') name = 'aaa' _name = 'bbb' __name = 'ccc' #只导入了f和name, # 隐属性只对from import语句有作用 # 用import mymod5,还是可以使用隐藏属性 |
六、 数学模块 & 时间模块&系统模块
系统模块 |
此模块记录的都是运行时系统的信息 |
随机模块random |
用于模拟或生产随机输出的模块 |
七、自定义模块
Mymod.py #自定义模块 #Mymod.py '''示范 自定义模块 此模块有2个函数: myfac(n),mysum(n) 此模块有2个数据:name1, name2 ''' def myfac(n): print('正在计算%d的阶乘!' % n) def mysum(n): print('正在计算%d的和!' % n) name1 = 'Audi' name2 = 'TESLA' print('mymod Module已经被导入') #第一次导入时,会'mymod Module已经被导入' #但第二次导入,就不会; # 模块的导入只加载一次 |
test_mymod.py #导入并测试模块 #test_mymod.py # import sys # sys.path.append('存放mymod.py的路径') import mymod #导入模块,不加'.py' #模块名必须符合变量名的命名规则 #先在当前路径找mymod.py mymod.myfac(5) #>>> '正在计算5的阶乘!' mymod.mysum(100) print(mymod.name1) print(mymod.name2) name1 = 'Mr.wei' print(name1) # 在这儿定义一个name1,不会和mymod.py里的name1冲突 # 但如果from mymod import name1,name2就会冲突 |
mymod6.py #mymod6.py var = 100 def print_var(): print('var = ', var) def set_var(n): global var var = n |
test_mymod6.py 模块的全局变量 #test_mymod6.py from mymod6 import var var = 200 #赋值只能改变本模块内的全局变量 #全局只是在模块内全局,但python可以有很多模块 from mymod6 import print_var print_var() #100 from mymod6 import set_var set_var(300) print_var() #300 |