文章目录
333_了解模块
课程:模块和包
目标
- 了解模块
- 导入模块
- 制作模块
- all
- 包的使用方法
一、模块
Python模块(Module),是一个Python文件,以.py结尾,包含了python对象定义和python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码。
334_导入模块之方法一
1.1 导入模块
1.1.1 导入模块的方式
- import模块名
- from 模块名 import 功能名
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
1.1.2 导入方式详解
1.1.2.1 import - 语法
#1.导入模块
import 模块名
import 模块名1,模块名2....
#2.调用功能
模块名.功能名()
- 体验
import math
print(math.sqrt(9)) # 3.0
调用模块,代码实现如下所示:
#需求:math模块下sqrt() 开平方计算
"""
1.导入模块
2.测试是否导入成功;调用该模块内的sqrt功能
"""
#方法一:import 模块名;调用模块:模块名.功能名
import math
print(math.sqrt(9))
运行结果:
335_导入模块之方法二
1.1.2.2 from … import …
- 语法
from 模块名 import 功能1,功能2,功能3....
- 体验
from math import sqrt
print(sqrt(9))
第二种方法导入模块,代码实现如下所示:
# 方法二:from 模块名 import 功能1,功能2.....;功能调用(不需要书写模块名.功能名)
from math import sqrt
print(sqrt(9))
运行结果:
336_导入模块之方法三
1.1.2.3 from…import *
- 语法
from 模块名 import *
- 体验
from math import *
print(sqrt(9))
第三种方法导入模块,代码实现如下所示:
#方法三:from 模块名 import *;功能调用(不需要书写模块名.功能名)
from math import *
print(sqrt(9))
运行结果:
337_定义别名
1.1.2.4 as定义别名
- 语法
#模块定义别名
import 模块名 as 别名
#功能定义别名
from 模块名 import 功能 as 别名
- 体验
#模块名
import time as tt
tt.sleep(2)
print('hello')
#功能别名
from time import sleep as sl
sl(2)
print('hello')
定义别名后,原模块名将会报错,无法使用,代码显示如下所示:
#需求:运行后暂定2秒再打印hello
"""
1.导入time模块或导入time模块的sleep功能
2.调用功能
3.打印hello
"""
#1.模块别名
import time as tt
#tt.sleep(2)
time.sleep(2) #定义别名后,原模块名将会报错,无法使用
print('hello')
运行结果:
给功能起别名,调用模块,代码实现如下所示:
#需求:运行后暂定2秒再打印hello
"""
1.导入time模块或导入time模块的sleep功能
2.调用功能
3.打印hello
"""
#1.模块别名
# import time as tt
# #tt.sleep(2)
# time.sleep(2) #定义别名后,原模块名将会报错,无法使用
# print('hello')
#2.功能别名
from time import sleep as sl
sl(2)
print('hello')
运行结果:
338_了解制作模块
1.2 制作模块
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则。
339_制作模块之定义模块
1.2.1 定义模块
新建一个Python文件,命名为my_module.py,并定义testA函数。
def test(a,b):
print(a + b)
制作第一个模块文件,代码实现如下所示:
#需求:一个函数 完成任意两个数字的加法运算
def testA(a,b):
print(a + b)
340_制作模块之测试和调用模块
1.2.3 测试模块
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如:在my_module1.py文件中添加测试代码。
def testA(a,b):
print(a + b)
testA(1,1)
此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会执行testA函数的调用。
解决办法如下:
def testA(a,b):
print(a + b)
#只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行testA函数调用
if __name__ == '__main__':
testA(1,1)
制作模块之测试,代码实现如下所示:
#需求:一个函数 完成任意两个数字的加法运算
def testA(a,b):
print(a + b)
#测试信息
#testA(1,1)
print(__name__)#如果name的运行是在自己当前文件里面,那么它的取值就是带下划线的__main__,
# 如果name的调用不是在当前文件里面,得到的结果将是
运行结果:
修改测试代码,情况展示如下所示:
#需求:一个函数 完成任意两个数字的加法运算
def testA(a,b):
print(a + b)
#测试信息
#testA(1,1)
print(__name__)#如果name的运行是在自己当前文件里面,那么它的取值就是带下划线的__main__,
# 如果name的调用不是在当前文件里面,得到的结果将是
#__name__是系统变量,是模块的标识符,它的值分为两种情况;如果是自身模块值是__main__,否则值是当前默模块的名字
if __name__ == '__main__':
testA(1,1)
运行结果:
341_了解模块定位顺序
1.3 模块定位顺序
当导入一个模块,Python解析器对模块位置的搜索顺序是:
1.当前目录
2.如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
3.如果都找不到,python会查看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
注意:
- 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
- 使用from 模块名 import 功能名的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
342_模块定位顺序之注意点1
自己的文件名不要和已有模块名重复,否则导致模块功能无法使用。
#1.自己的文件名不能和已有模块名重复,如果重复导致模块无法使用 —— random
import random
num = random.randint(1,5)
print(num)
运行结果:
343_模块定位顺序之注意点2
使用from 模块名 import 功能名的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
#2.当使用from 模块名 import 功能名,导入模块功能的时候,如果功能名字重复,导入的功能名是后定义或后导入的同名功能
#场景 time.sleep()
from time import sleep
#定义函数 sleep
def sleep():
print('我是自定义的sleep')
sleep(2)
运行结果:
如果功能名字重复,调用的是后写的功能名,代码实现如下:
#2.当使用from 模块名 import 功能名,导入模块功能的时候,如果功能名字重复,导入的功能名是后定义或后导入的同名功能
#场景 time.sleep()
def sleep():
print('我是自定义的sleep')
from time import sleep
#定义函数 sleep
# def sleep():
# print('我是自定义的sleep')
sleep(2)
运行结果:
344_拓展:名字重复的严重性
#拓展:名字重复
#问题:import 模块名 是否需要担心功能名字重复的问题 -- 不需要
import time
print(time)
time = 1
print(time)
#问题:为什么变量也能覆盖模块? -- 在python语言中,数据是通过引用来传递的。
运行结果:
345_all列表
1.4 all
如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素。
- my_module1模块代码
__all__ = ['testA']
def testA():
print('testA')
def testB():
print('testB')
- 导入模块的文件代码
from my_module1 import *
testA()
testB()
如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素。
#定义多个功能,把某个功能添加到__all__
__all__ = ['testA']
def testA():
print('testA')
#因为testB函数没有添加到all列表,只有all列表里面的功能才能导入
def testB():
print('testB')
运行结果:
346_了解包
二、包
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py文件,那么这个文件夹就称之为包。
347_制作包
2.1 制作包
[NEW] – [Python Package] – 输入包名 – [OK] – 新建功能模块(有联系的模块)。
注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为。
2.1.1 快速体验
1.新建包mypackage
2.新建保内模块:my_module1 和 my_module2
3.模块内代码如下
#my_module1
print(1)
def info_print1():
print('my_module1')
#my_module2
print(2)
def info_print2():
print('my_module2')
348_导入包之方法一
2.2 导入包
2.2.1 方法一
import 包名.模块名
包名.模块名.目标
2.2…1.1 体验
#方法一
"""
1.导入
import 包名.模块名
2.调用功能
包名.模块名.功能名()
"""
#导入mypackage包下的模块1,使用这个模块内的info_print1函数
import mypackage.my_module1
mypackage.my_module1.info_print1()
运行结果:
349_导入包之方法二
2.2.2 方法二
注意:必须在__init__.py文件中添加__all__ = [],控制允许导入的模块列表。
from 包名 import *
模块名.目标
导入包之方法二,代码实现如下所示:
#方法一
"""
1.导入
import 包名.模块名
2.调用功能
包名.模块名.功能名()
"""
#导入mypackage包下的模块1,使用这个模块内的info_print1函数
# import mypackage.my_module1
# mypackage.my_module1.info_print1()
#方法二:注意设置__init__.py文件里面的all列表,添加的是允许导入的模块
"""
from 包名 import *
模块名.目标
"""
from mypackage import *
my_module1 .info_print1()
修改__init__文件中的all列表参数,代码实现如下所示:
运行结果:
350_模块和包的总结
三、总结
- 导入模块方法
import 模块名
from 模块名 import 目标
from 模块名 import *
- 导入包
import 包名。模块名
from 包名 import *
- all = []:允许导入的模块或功能列表