模块的四种形式
自定义模块
自定义一个.py文件,文件内都是自己写的函数,则称为自定义模块,可以导入并调用
第三方模块
已被编译为共享库或DLL的C或C++扩展
内置模块
使用C编写并链接到python解释器的内置模块
包
把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
import和from...import
一般使用import或者from...import导入模块
import time
time.time()
模块的重复导入会直接饮用之前创造好的结果,不会重复执行模块的文件,即重复导入会发生:spam=spam=模块名称空间的内存地址
from time import time
time()
使用import module
时,module本身被引入,但是保存它原有的命名空间,所以我们需要使用module.name这种方式访问它的 函数和变量。
from module import
这种方式,是将其它模块的函数或者变量引到当前的命名空间中,所以就不需要使用module.name这种方式访问其它的模块的方法了。
循环导入问题
# m1.py
form m2 import y
x = 10
print('m1:',x, y)
# m2.py
form m1 import x
y = 20
print('m2:',x, y)
运行m1,会发生报错:ImportError: cannot import name 'x'
解决方法一:
将定义变量放到导入模块之前
# m1.py
x = 10
form m2 import y
print('m1:',x, y)
# m2.py
y = 20
form m1 import x
print('m2:',x, y)
解决方法二:
将导入模块放到函数定义中
# m1.py
x = 10
def func1():
form m2 import y
print('m1:',x, y)
func1()
# m2.py
y = 20
def func2():
form m1 import x
print('m2:',x, y)
func2()
模块搜索路径的顺序
- 先从内存中已经导入的模块寻找
- 内置的模块中
- 环境变量sys.path中寻找
强调:sys.path
的第一个值是当前执行文件的所在的文件夹
python文件的两种用途
python文件总共有两种用途,一种是执行文件;另一种是被当做模块导入。
编写好的一个python文件可以有两种用途:
- 脚本,一个文件就是整个程序,用来被执行
- 模块,文件中存放着一堆功能,用来被导入
# m1.py
def f1():
print('m1')
f1()
# run.py
import m1
如果直接运行run.py,则会直接运行m1.py中的f1()
如果我们要防止这种事情发生,可以在m1.py文件中的f1()加上条件__name__ = '__main__'
,这样在运行run.py文件的时候就不会运行f1()了
如果是放在被调用文件,可以用来测试,如果放在启动文件中,则是用来防止启动文件被调用
# m1.py
def f1():
print('m1')
if __name__ = '__main__':
f1()