Day 15 模块
模块
模块是一系列功能的集合,而函数是一个功能的几何体,因此模块可以看成是一堆函数的集合体,一个py文件内部就可以放一堆函数,因此一个py文件就可以看成是一个模块,如果这个py文件的文件名为module.py,模块名则是module
为什么要用模块
- 用第三方或内置的模块是一个拿来主义,可以极大地提升开发效率
- 自定义模块,将我们自己程序中用到的公共功能,写入一个Python文件,然后程序的各部分组件可以通过导入的方式来应用自定义模块的功能
模块的形式
- 自定义模块:在一个py文件中写入一堆函数,则它被称之为自定义模块
- 第三方模块:已经被便以为共享库或DLL的C或C++扩展
- 内置模块:python解释器的内置模块
- 包:把一系列模块组织到一起的文件夹(文件夹下有一个 init.py文件,该文件夹称之为包)
模块的导入
一般使用import和from...import...导入模块
import 和from...import.. 会把导入文件内的代码运行一遍
import 模块名
import time
import首次导入模块发生了三件事
- 打开模块对应文件
- 执行模块对应文件中的代码,将执行过程中产生的名字都丢到模块的名称空间
- 在当前执行文件的名称空间拿到一个模块名
- 重复导入模块会引用之前内存中的模块名称空间,不会重复执行模块文件中的代码
from 模块名 import 具体的功能
from time import sleep
import首次导入模块发生了三件事
- 打开模块对应文件
- 执行模块对应文件中的代码,将执行过程中产生的名字都丢到模块的名称空间
- 在当前执行文件的名称空间中拿到一个名字,该名字指向我们导入的具体功能
- 重复导入模块会引用之前内存中的模块名称空间,不会重复执行模块文件中的代码
循环导入
为什么会有循环导入的问题
- m1文件需要导入m2文件中的y
- m2文件需要导入m1文件中的x
- 代码自上而下运行,m1需要m2的y,然后回去m2的名称空间找y,凡是需要运行m2的代码,m2的代码第一句是去找m1的x,然后又回去uyunxingm1的代码,m1的第一行代码又是去找m2的y
- 就是说m1只能运行第一行代码,m2页只能运行第一行代码,所以出现了循环导入的问题
解决方法一:
将需要用到的变量名放在import导入语句前面,这样的话当m1执行导入语句的时候,会首先在m2中找到需要导入的y,把他存入模块的名称空间,然后在执行m2中的模块导入语句,会执行m1中的代码,当运行到m1中的导入语句时,会从内存空间中去找y
解决方案二:
将模块导入语句放入函数中,当需要导入模块时候的时候调用函数,这样的话,可以把模块导入的函数和变量放在文件最前面(注意如果调用函数在变量前面,那么这样写毫无意义)
名字的执行顺序:内置(python解释器启动的时候)->全局(文件执行的时候)->局部(函数调用的时候)
模块的搜索路径
- 去内存中找
- 去内置模块中找
- 去环境变量中找
python文件的两种用途
- 模块文件:被当做模块给导入,可以有多个
- 运行文件:被当做执行文件执行,只能有一个
main 表示这个文件是执行文件
if name='main' 表示当这个文件被当做执行文件时,才会执行if下面的代码,如果被当做模块文件的话 不会执行if一下的代码
浙公网安备 33010602011771号