学习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__ = [] : 允许导入的模块或功能列表

posted @ 2020-11-13 17:15  as_scheduled  阅读(95)  评论(0编辑  收藏  举报