包是一个内部带有__init__.py的文件夹,包也可以被导入,并且可以一并导入包下的所有模块。
包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来。
随着功能越写越多,我们无法将所有功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性。
在包中有一个__init__.py, 由它来帮我们管理模块。
导入包时发生的事情:
强调:
在python3中,即使包里面没有__init__.py文件,import 包仍然不会报错,而在python2中,包里面一定要有该文件,否则import 包报错
模块是一系列功能代码的集合体。
在Python中,一个.py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能
- 模块的三种来源: 1.python内置的模块: (python解释器的) 比如: sys\time\os\turtle 2.第三方的模块: (别人写的) 比如: requests 3.程序员自定义的模块: (自己写的) 比如: 自己定义的demo.py文件
- 模块的四种表现形式: 1.使用python编写的py文件。(了解) 2.编译后的共享库DLL或者是C或者C++库。(了解) 3.包下面带有__init__.py的一组py文件。 - 包 - __init__.py - demo.py - demo2.py 4.python解释器下的py文件。 - python解释器下的文件夹 - 一个个的py文件
鼠标右键创建py文件
在py文件编写python代码
在一个文件中,通过import关键字导入模块
import 模块名
注意: import 模块时,模块不能加.py后缀
在使用模块阶段,必须要注意,谁是执行文件,谁是被导入文件(被导入的模块)
模块在首次导入时,导入的模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名。
在文件开头导入模块属于全局作用域,在函数内导入的模块则属于局部的作用域。
模块在导入时发生的事情:
import foo #导入模块foo a=foo.x #引用模块foo中变量x的值赋值给当前名称空间中的名字a foo.get() #调用模块foo的get函数 foo.change() #调用模块foo中的change函数 给模块起别名 as import 模块 as 模块的别名
- m1.py print(‘正在导入m1‘) from m2 import y x=‘m1‘ - m2.py print(‘正在导入m2‘) from m1 import x - run.py import m1 #执行run.py会报错 - 解决循环导入问题: 1.需要查找的名字放在导入模块的上方 2.在函数内部导入,将模块加载到局部名称空间中
编写好的一个python文件可以有两种用途: 一:脚本,一个文件就是整个程序,用来被执行 二:模块,文件中存放着一堆功能,用来被导入使用 print(__name__) __name__的值: 1、在文件被直接执行的情况下,等于‘__main__‘ 2、在文件被导入的情况下,等于模块名 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑 if __name__ ==‘__main__‘ func()
模块的查找顺序:
强调:sys.path的第一个路径是当前执行文件所在的文件夹
import sys print(sys.path) import sys print(sys.modules) #查找内存中存在的模块
原文:https://www.cnblogs.com/wddxx/p/13669205.html