Python模块和包:导入&制作模块、name、模块定位顺序(文件名与模块名重复、功能名与功能名重复、函数名与功能名重复、变量名与模块名重复)、from 模块名 import *__all__列表、包

一、模块

  • Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句。
  • 模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。

二、导入模块

1、导入模块的方式:

  • 1.import 模块名
  • 2.from 模块名 import 功能名1, 功能名2, 功能名3…
  • 3.from 模块名 import *
  • 4.import 模块名 as 别名
  • 5.from 模块名 import 功能名 as 别名

2.1、调用模块的方式

  • 导入模块:import 模块名
  • 调用模块:模块名.功能名()
  • 注意:模块名不能与当前目录里的文件重名,否则优先调用当前目录同名文件
import math
print(math.sqrt(9))  # 3.0

2.2、调用模块的方式

  • 导入模块:from 模块名 import 功能名1, 功能名2, 功能名3…
  • 调用模块:功能名()
  • 调用时直接使用功能,省去了写模块名
  • 相当于是from 模块名 import * 的具体化
  • 注意:模块名不能与当前目录里的文件重名,否则优先调用当前目录同名文件;功能名不能与当前文件里的函数重名,否则优先使用后定义或后导入的同名功能
from math import sqrt
print(sqrt(2))  # 1.4142135623730951

2.3、调用模块的方式

  • 导入模块:from 模块名 import *
  • 调用模块:功能名()
  • 调用时直接使用功能,省去了写模块名
  • 相当于是from 模块名 Import 功能名1, 功能名2,……的宽泛化
from math import *
print(sqrt(3))  # 1.7320508075688772

2.4、调用模块的方式

  • 定义模块:import 模块名 as 别名
  • 调用模块:别名.功能名()
  • 为了提高效率,模块原有的名字使用不太方便,用as别名
  • 定义了别名,就不能再使用原模块名,只能使用别名,否则报错

2.5、调用模块的方式

  • 定义模块:from 模块名 import 功能名 as 别名
  • 调用模块:
  • 为了提高效率,功能原有的名字使用不太方便,用as别名
  • 定义了别名,就不能再使用原功能名,只能使用别名,否则报错
# 模块别名
import time as t
t.sleep(2)
print("hello")

# 功能别名
from time import sleep as sl
sl(2)
print("hello")

三、制作模块

  • 在Python中,每个Python文件都可以作为⼀个模块模块名就是文件的名字。也就是说⾃定义模块名必须要符合标识符命名规则。
  • 可以把项目中频繁使用的代码封装到模块里,需要时导入模块调用功能

1、定义模块
需求:新建⼀个Python⽂件,命名为my_module1.py ,并定义 testA 函数。
在这里插入图片描述

2、测试模块,注意事项

  • 在实际开中,当⼀个开发⼈员编写完⼀个模块后,为了让模块能够在项⽬中达到想要的效果,这个开发⼈员会⾃⾏在py⽂件中添加⼀些测试信息.,例如,在 my_module1.py ⽂件中添加测试代码。
  • 此时,⽆论是当前⽂件,还是其他已经导⼊了该模块的⽂件,在运⾏的时候都会⾃动执⾏ testA 函数的调⽤。

在这里插入图片描述
在这里插入图片描述

输出:
3  # 我们并未导入测试信息,但测试信息也同时输出了,因此要把测试信息去掉
5
  • 如何解决?
  • 每个模块都是一个py文件,每个文件都有自己的名字,name__是系统变量,是每一个py文件的标识符。**如果__name__在自身模块里运行,它的值就是__main,如果__name__被调入其它文件里运行,它的值是模块名即文件名。**

在这里插入图片描述

输出:__main__

在这里插入图片描述

输出:my_module1

在这里插入图片描述

输出:3

在这里插入图片描述

输出:5

四、模块定位顺序

当导⼊⼀个模块,Python解析器搜索模块时按由近到远的顺序进行搜索

  1. 当前目录(当前py文件所在的文件夹)
  2. 解释器安装目录:如果不在当前⽬录,Python则搜索在shell变量PYTHONPATH下的每个⽬录。(pythonpath:python解释器默认安装的目录)
  3. 如果以上目录都找不到,Python会察看默认路径。UNIX下,默认路径⼀般为/usr/local/lib/python/
  4. 总的来说,Python解析器按由近及远搜索

模块搜索路径存储在system模块的sys.path变量中。变量⾥包含当前⽬录,PYTHONPATH和由安装过程决定的默认⽬录。

注意:

  • 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
  • 使用from 模块名 import 功能名 的时候,如果功能名字重复,调用到的是最后定义或导⼊的功能。

示例1:当前文件名exercise与模块名random不同,程序正常运行
在这里插入图片描述
示例2:新建一个文件,文件命名为random与模块名random相同,在文件random中不写任何代码,然后返回exercise右键运行……
在这里插入图片描述
在这里插入图片描述
程序报错,因为import random后,Python解析器会按由近到远的顺序搜索同名模块。在本地目录下搜索到random.py,然后导入这个文件,就不会再去搜索pythonpath下面的random模块,导致错误。

  • 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
    在这里插入图片描述
    示例3:当使用from 模块名 import 功能名,如果导入的功能名重复,导入的是后定义或后导入的同名功能。
# 模块random的randint()
from random import randint
print(randint(1, 5))

# 自定义函数randint()
def randint():
    print("这是自定义的randint函数")

输出:3  # 程序正常运行
# 模块random的randint()
from random import randint


# 自定义函数randint()
def randint():
    print("这是自定义的randint函数")

print(randint(1, 5))

输出:报错
在这里插入图片描述
报错分析:print语句位置不同,调用randint,调用到的同名功能不同

  • 使用from 模块名 import 功能名 的时候,如果功能名字重复,调用到的是最后定义或导⼊的功能。

五、扩展名重复的问题

1、使用import 模块名,导入模块,如果要使用的功能名重复?
答:无须担心,因为这种导入方式,调用时使用模块名.功能名(),这不会重复

2、同一个py文件,变量名与模块名重名,后面的同名变量覆盖前面的模块

import time  # 导入time模块
print(time)  # 打印time模块名,返回mudule time built-in

time = 1  # 同时在同一个py文件中定义一个同名变量time,赋值1
print(time)  # 打印time,程序正常运行,返回变量值1。说明同名变量覆盖了模块。

输出:(程序正常运行)
<module 'time' (built-in)>
1

分析:Python中,数据都是通过引用传递的,time引用time模块,time也引用数值1,后引用的覆盖前面引用的,即给time变换了引用。

六、from 模块名 import *和__all__列表

  • __all__是模块文件中的一个变量名,这个变量的取值是一个列表数据。
  • 当使⽤ from 模块名 import * 导⼊时,默认导入模块的所有代码,但如果⼀个模块⽂件中有 all 变量,这种方式导入,只能导⼊这个__all__列表中的元素所携带的功能,不在__all__列表的代码都不会导入。
    在这里插入图片描述
    在exercise文件里调用my_module1
    在这里插入图片描述
    运行,报错,testA调用成功,testB调用失败。
    在这里插入图片描述
import my_module1

my_module1.testA()
my_module1.testB()

输出:  # 这说明其它导入方式不受__all__列表的限制,功能都可以导入
这是testA
这是testB

七、包 Python Package

包将很多有联系的模块组织在⼀起,即放到同⼀个文件夹下就是包,文件夹名就是包名,并且在这个⽂件夹会自动创建⼀个名字为 init.py ⽂件,那么这个⽂件夹就称之为包。

八、制作包

  1. [New] — [Python Package] — 输⼊包名 — [OK] — 新建功能模块(有联系的模块)。
  2. 注意:新建包后,包内部会⾃动创建 init.py ⽂件,这个⽂件控制着包的导⼊⾏为。
    在这里插入图片描述

需求:

  • 新建包 mypackage
  • 新建包内模块: my_module1 和 my_module2
    1.右键,new,Python package
    2.点击新建的包mypackage,右键,点击Python File
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

九、导入包、调用功能

方法一:

  • 导入包:import 包名.模块名
  • 调用功能:包名.模块名.⽬标
# 方法一,
# 导入mypackage包下的模块1,将来使用这个模块内的printinfo1函数
import mypackage.my_module1
mypackage.my_module1.printinfo1()

输出:
1
这是my_module1.py

在这里插入图片描述
也可以在其它文件里调用这个包,使用包里的功能
在这里插入图片描述

方法二:

  • 导入包:from 包名 import *
  • 调用功能:模块名.⽬标
  • 注意:必须在 _init_.py ⽂件中添加 _all_ = [] ,控制允许导⼊的模块列表,只有__all__列表里的模块才会被导入。
    在这里插入图片描述
    在这里插入图片描述
输出:
1
这是my_module1.py

测试把__init__.py里的__all__注释掉,看看能不能调用。结果是报错。
在这里插入图片描述
十、模块和包小结
模块,是一个普通的py文件,这个文件里有变量、函数、类等,这个文件里可以书写大量代码,可以导入,然后其他的文件就可以灵活调用这个模块当中的功能。
在这里插入图片描述

PS: source,itheima

猜你喜欢

转载自blog.csdn.net/weixin_47008635/article/details/114766416