目录

* 一、为什么要有模块 <https://www.cnblogs.com/nickchen121/p/11070439.html#一为什么要有模块>
* 二、import 与 from...import...
<https://www.cnblogs.com/nickchen121/p/11070439.html#二import-与-from...import...>
* 三、循环导入问题 <https://www.cnblogs.com/nickchen121/p/11070439.html#三循环导入问题>
* 3.1 解决方案一 <https://www.cnblogs.com/nickchen121/p/11070439.html#解决方案一>
* 3.2 解决方案二 <https://www.cnblogs.com/nickchen121/p/11070439.html#解决方案二>
* 四、模块的搜索路径 <https://www.cnblogs.com/nickchen121/p/11070439.html#四模块的搜索路径>
* 五、Python文件的两种用途
<https://www.cnblogs.com/nickchen121/p/11070439.html#五python文件的两种用途>
* 六、包 <https://www.cnblogs.com/nickchen121/p/11070439.html#六包>
一、为什么要有模块

面条版代码--》函数版代码--》文件版代码(模块)--》文件夹版(包)

代码会变得更加简洁,清晰,模块化

一个模块里会有多个函数,相当于一个大功能细分成多个小功能

* 自定义模块
* 第三方模块,如requests
* 内置模块,如time
* 包(文件夹)
二、import 与 from...import...
markdown_add_index.py import time 1. 打开time文件 2.
使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间 3.
test.py中会有一个time变量指向time模块的名称空间,如果导入方式为`import time as t`,则就是t变量指向time模块的名称空间
from time import sleep 1. 打开time文件 2.
使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间 3.
test.py中会有一个sleep变量指向time模块名称空间中的sleep,如果导入方式为`from time import
sleep,localtime`,则是由一个sleep变量和一个localtime变量指向time模块名称空间中的sleep和localtime
三、循环导入问题
# m1.py from m2 import y x = 10 # m2.py from m1 import x y = 20
为什么会有循环导入问题:

* m1文件需要导入m2文件的y
* m2文件需要导入m1文件的x
*
代码自上而下运行,m1需要m2的y,然后会去m2的名称空间找到y,但是找y前,需要运行m2的代码,m2的代码第一句是去找m1的x,然后又回去运行m1的代码,m1的第一行代码又是去寻找m2的y
* 就是说m1只能运行第一行,m2也只能运行第一行,所以出现了循环导入问题
3.1 解决方案一
# m1.py x = 10 from m2 import y # m2.py y = 20 from m1 import x
* 但是这样做,对所有的变量都需要这样做,才能解决问题,所以治标不治本的
3.2 解决方案二
# m1.py def f1(): from m2 import y x = 10 f1() # m2.py def f2(): from m1
import x y = 20 f2()
名字的执行顺序:内置(python解释器启动的时候)-->全局(文件执行的时候)-->局部(函数调用的时候)

四、模块的搜索路径

1.去内存中找
# test.py import m1 # 从m1.py文件中导入的,然后会生成m1模块的名称空间 import time #
删除m1.py文件,m1模块的名称空间仍然存在 time.sleep(10) import m1 # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的
2.去内置模块中找
# time.py print('from time') # test.py import time # 无任何打印,所以他先去内置模块中找了
3.环境变量中找
import sys print(sys.path) # b/a/m1.py # b/test.py import m1 # 报错
sys.path.append('b/a') import m1
五、Python文件的两种用途

* 模块文件,被当做模块给导入,有多个
* 运行文件,被当做执行文件执行,只能有一个
* 搜索路径以执行文件为基准 # m1.py def f1(): print('from f1') f1() # test.py import m1
m1.f1() # 运行两次
* __name__ # m1.py def f1(): print('from f1') if __name__ == '__main__': #
__name__在m1.py被当做模块导入时是模块名,作为执行文件时是'__main__' f1() markdown_add_index.py import
m1 m1.f1() # 运行两次
六、包

* 模块太大了,合理的分配模块的函数 # m1.py f1 f2 f3 f4 # m2.py f1 f2 # m3.py f3 f4
* 所以得用文件夹管理,文件夹命名为m1,导入m1就是导入m1中的__init__

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信