学习python的day16之模块和包
一、模块
python模块(Module)是一个python文件,以.py结尾,包含了python对象定义和python语句。
模块能定义函数,类和变量,模块里也能包含可执行的代码
1.1导入模块
1.1.1导入模块的方式
import 模块名
from 模块名 import 功能名
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
1.1.2导入方式详解
1.1.2.1import
语法
#1.导入模块
import 模块名
import 模块名1,模块名2...
#2.调用模块
模块名.功能名()
体验
import math print(math.sqrt(9)) ''' 输出: 3.0 '''
1.1.2.2 form....import....
语法
from 模块名 import 功能名1,功能名2.....
体验
from math import sqrt print(sqrt(9)) ''' 输出: 3.0 '''
功能调用不需要书写模块名.功能名
1.1.2.3 from...import *
语法
from 模块名 import *
体验
from math import * print(sqrt(9)) ''' 输出: 3.0 '''
功能调用不需要书写模块名.功能名
1.1.2.4 as定义别名
语法:
#定义模块别名
import 模块名 as 别名
体验:
import math as tt print(tt.sqrt(9)) ''' 输出: 3.0 '''
定义别名之后,就不可以使用math.sqrt()来调用函数
#功能定义别名
from 模块名 import 功能名 as 别名
体验:
from math import sqrt as tt print(tt(9)) ''' 输出: 3.0 '''
与定义模块名一样,定义别名后,只能使用别名调用函数
1.2制作模块
在python中,每个python文件都可以作为一个模块,模块的名字就是文件的名字 ,也就是说自定义模块名必须符合标识符命名规则.
1.2.1
定义模块
新建一个python文件,命名为my_module1.py,并定义testA函数
def testA(a,b): return a+b
1.2.2测试模块
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会在py文件中添加一些测试信息,例如,在my_module1.py文件中添加测试信息.
def testA(a,b): print(a + b) #测试信息 if __name__ == '__main__': testA(1,3)
1.2.3调用自定义模块
import my_module1 my_module1.testA(1,9) ''' 输出: 10 '''
1.3 模块定位顺序
当导入一个模块,python解释器对模块位置的搜索顺序是:
1.当前顺序
2.如果不在当前目录,python则搜索shell变量PYTHONPATH下的每个目录
3.如果都找不到,python会查找默认路径,UNIX,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中.变量包含当前目录,PYTHONPATH和由安装过程决定的默认路径 .
注意:将上面的话总结后则为以下两点
1.自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
2.使用 from 模块名 import 功能名 的时候,如果功能名字重复,调用到的是最后定义或导入的功能
体验:
自定义一个模块,模块名为random.py,调用
import random num = random.randint(1,5) print(num) ''' 输出: Traceback (most recent call last): File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/03-模块定位顺序.py", line 2, in <module> num = random.randint(1,5) AttributeError: module 'random' has no attribute 'randint' 进程已结束,退出代码 1 '''
定义一个函数名与调用模块的功能名相同的函数
#例1
from time import sleep def sleep(a): print(a) sleep(2) ''' 输出: 2 '''
#例2 from time import sleep def sleep(): print('sdsd') sleep(2) ''' 输出: Traceback (most recent call last): File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/03-模块定位顺序.py", line 21, in <module> sleep(2) TypeError: sleep() takes 0 positional arguments but 1 was given '''
拓展:使用 import 模块名 不用担心功能名字重复
import time print(time) time = 1 print(time) ''' 输出: <module 'time' (built-in)> 1 '''
与模块同名的变量名能覆盖模块---因为在python中,数据是通过引用来传递的,因为是同名,所以引用是一样的,后面的数据把前面的数据覆盖。
1.4 __all__
如果一个模块中有__all__变量,当使用from xxx import * 导入时,只能导入列表中的元素。
#my_module2.py def testA(): print('testA') def testB(): print('testB') #my_module3.py __all__ = ['testA'] def testA(): print('testA') def testB(): print('testB') #04-__all__列表.py from my_module2 import * testA() testB() ''' 输出: testA testB ''' from my_module3 import * testA() ''' 输出: testA ''' from my_module3 import * testB() ''' 输出: Traceback (most recent call last): File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/04-__all__列表.py", line 11, in <module> testB() NameError: name 'testB' is not defined '''
二、包
包将有联系的模块组织起来 ,即放在同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py的文件,那么这个文件夹就称之为包。
注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为。
1.新建包
my_module1.py
def info_print1(): print('my_module1')
my_module2.py
def info_print2(): print('my_module2')
2.导入包
方法一
import 包名.模块名
包名.模块名.目标
import mypackage.my_module1 mypackage.my_module1.info_print1() ''' 输出: my_module1 '''
方法二
必须在__init__.py文件中添加__all__ = [],控制允许导入的模块列表
语法
from 包名 import *
模块名.目标
体验:
__init__.py
__all__ = ['my_module1']
导入包中__init__.py文件内__all__列表中包含的模块
from mypackage import * my_module1.info_print1() ''' 输出: my_module1 '''
导入包中__init__.py文件内__all__列表中不包含的模块
from mypackage import * my_module2.info_print2() ''' 输出: Traceback (most recent call last): File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/05-导入包.py", line 18, in <module> my_module2.info_print2() NameError: name 'my_module2' is not defined '''
三、总结
导入模块的方法
import 模块
from 模块 import 功能名
from 模块 import *
导入包
import 包名.模块名.功能名
from 包名 import *
__all__ = [] : 允许导入的模块或功能列表