您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 本文主要介绍Python的模块和包,重点介绍模块和包的导入以及使用。 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
模块
什么是模块呢?简单理解的话:模块就是一个后缀名是.py的模板文件。模块主要是用于封装函数和变量。我们可以将实现某一个功能的所有函数封装放在同一个.py文件中以作为一个模块提供给其他模块使用。比如操作日期的模块time。其对应模板文件就是time.py。
导入模块
导入模块的方式有两种:
import 模块名1 [as 别名1], 模块名2 [as 别名2],… 使用这种格式的import语句,会导入指定模块中所有的成员(包括变量,函数、类等)from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],… 使用这种格式的import语句,只会导入模块中指定的成员,而不是全部成员。 用第一种方式导入time模块,可以使用该模块下所有的函数
import time
start_time = time.time()
print(start_time)
time.sleep(4)
print(time.time() - start_time)
可以看出导入time之后可以使用其模块内的所有成员 用第二种方式导入time模块中的sleep函数,则time函数是使用不了的。
from time import sleep
print(sleep())
PS:如果模块名中出现空格就无法使用import引入模块了,这是因为Python 是以空格来隔离一行语句中的不同元素的。针对有空格的模块名的导入,可以通过__import__ 函数来导入。比如:现在有一个名为hello test.py 的模板文件,可以以__import__("hello test") 这种方式导入。
自定义模块
自定义模块说白了就是自行创建一个模板文件,然后使用其文件名作为模块名导入到其他模板文件中。定义了一个名为hello的模板文件,然后在hello_test.py文件中导入。 hello.py文件
def say():
print('苦逼程序员唱着苦逼的歌')
say()
print(__name__)
这里需要注意的是hello.py文件是放在Python项目的根目录下。 hello_test.py文件
import hello
hello.say()
运行hello_test之后,输出的结果是:
苦逼程序员唱着苦逼的歌
hello
苦逼程序员唱着苦逼的歌
我们看到输出了两遍,这显然不是我们想要的结果。我们期望的是say函数只执行一遍,也就是在hello_test调用的地方执行。而不是在hello.py文件中还执行一遍。那么这个问题该如何处理呢?
__name__ 控制模块方法的调用
这里可以将hello模块中调用say函数的代码块放在__name__ == '__main__' 表达式中。就像下面这样:
if __name__ == '__main__':
say()
这个__name__ == '__main__' 语句相当于Java中的main函数,他的意思是只有表达式成立时才执行say()函数,否则不执行say()函数。 当运行hello模块自身时__name__ 等于__main__ ,也就是说该表达式成立。 而当导入模块运行时__name__ 等于hello,也就是说此表达式不成立。当然运行其他程序时也不会执行该判断语句中的测试代码。 hello.py文件
def say():
print('苦逼程序员唱着苦逼的歌')
print(__name__)
if __name__ == '__main__':
say()
运行hello.py文件的结果是:
__main__
苦逼程序员唱着苦逼的歌
运行hello_test.py文件的结果是:
hello
苦逼程序员唱着苦逼的歌
可以看出say函数只被执行了一次。
包
Python包简单的理解就是文件夹,只不过这个文件夹下必须存在一个名为__init.py 的文件。这个文件主要的作用就是告诉Python要将该目录当成一个包,可以在该文件中写一些初始化的代码。
包的主要作用就是方便对各个模块进行管理。因为当项目越来越大时不可能将所有的模块都放在项目的根目录下。如下图在flask-tutorial项目下就有biz,model,view这几个包。当然flask文件夹也是一个包,因为其下面也有__init__.py 文件。
导入包
包的导入跟模块的导入类似它有三种导入方式:
- import 包名[.模块名 [as 别名]]
包名就是文件的名字,通过这种方式导入包的话导入的实际上包下的**init.py文件**。能使用到的成员也就是该文件下公共的变量和函数。 - from 包名 import 模块名 [as 别名]
通过这种方式导入的就是包下具体的某个模块,能实际使用的变量和函数也是该模块下所有的成员。 - from 包名.模块名 import 成员名 [as 别名]
通过这种方式导入的就是包下某个模块具体的成员。
Python查找包或模块文件的顺序
这里说下Python查找模块文件的顺序:
- 在当前目录,即当前执行的程序文件所在的目录下查找。
- 到PYTHONPATH(环境变量)下的每个目录下查找
- 到Python默认的安全目录下查找
以上所有涉及到的目录,都保存在标准模块sys的sys.path变量中。通过此变量我们可以看到指定程序文件支持查找的所有目录。也就是说,如果要导入的模块没有存在sys.path显示的目录中,那么导入该模块并运行程序时,Python解释器就会抛出ModuleNotFoundError(未找到模块)异常。 解决"Python找不到指定模块"的方法有3种,分别是:
- 向sys.path中临时添加模块文件存储位置的完整路径;
- 将模块放在sys.path变量中已包含的模块加载路径中;
- 设置path系统环境变量。
当然在实际项目中通常不会这么操作。实际项目中都是先创建一个Python项目,然后设置这个项目的虚拟环境。虚拟环境指定的项目的目录为根目录 。其他包或者模块的导入只需要写入包名或者模块名即可。就像下面这样:
from flaskr.biz import user_service
import flaskr.biz
总结
本文详细介绍了模块和包的相关知识点,希望对读者朋友们有所帮助。
Python知识图谱
为了更好帮助更多的小伙伴对Python从入门到精通,我从CSDN官方那边搞来了一套 《Python全栈知识图谱》,尺寸 870mm x 560mm,展开后有一张办公桌大小,也可以折叠成一本书的尺寸,有兴趣的小伙伴可以了解一下------扫描下图中的二维码即可购买。
我本人也已经用上了,感觉非常好用。图谱桌上放,知识心中留。
我是码农飞哥,再次感谢您读完本文。
|