模块的四种形式
模块
就是从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名是test.py的话,它的对应模块名就是test)
包
用来从逻辑上组件模块,本质就是一个目录(必须带有一个__init__.py
文件)
导入模块
本质就是把python文件解释一遍
导入包
本质就是执行该报下的__init__.py
文件;如果要导入包下面的模块:需要先导入包,然后从包下的__init__.py
文件中再导入该包下的模块
python可以看成是手机–>pip看成应用管家-->模块就是应用软件
1.系统自带软件--》不需要安装
2.需要下载的软件
3.自定义软件
1.python内置模块:python解释器启动自带的time/random/os/sys
2.pip安装的模块,pip install jieba
3.自定义模块--》自定义代码
4.包(模块)-》未来详细讲
import与from..import..
import
以time为例:
import time
1.开辟内存空间,内存空间命名为time
2.把time.py中所有代码读入空间,然后运行
3.通过time.方法名使用time模块中的方法
#test.py import time import time as t #变量名t指向time模块的名称空间 from time import sleep from time import sleep,localtime
优点:永不冲突
缺点:每次导入多输入几个字符,非常麻烦
from...import...
以time里的sleep为例
from time import sleep
1.开辟内存空间,内存空间命名为time
2.把time.py中所有代码读入空间,然后运行
3.把sleep()方法读入import和from import,因此可以直接使用方法名
# *__all__=[''] #test.py __all__ = ['f1','f2'] def f1(): print(1) def f2(): print(2) def f3(): print(3) from test import * test.f3() #无法运行 import test test.f3() # 3
优点:少打几个字符
缺点:容易冲突
循环导入
#m1.py from m2 import y x = 10 print('m1:',x,y) #m2.py from m1 import x y = 20 print('m2:',x,y)
过程:m1.py --> m2.py --> m1.py ...
结果:x/y在这个过程中一直没有生成
解决方案一
#m1.py x = 10 from m2 import y print('m1:',x,y) #m2.py y = 20 from m1 import x print('m2:',x,y) # m2: 10 20 # m1: 10 20 # m2: 10 20
过程:m1.py -->10 20 --> m2.py -->10 20--> m1.py --> x = 10 20
解决方案二
# m1.py def f1(): from m2 import y print(y) x = 10 # m2.py def f1(): from m1 import x y = 20 # y = 20
过程:f1() --> m2.py --> y = 20
4.模块的搜索路径
先从内存中寻找
from m2 import y print(y) import time time.sleep(10) # 10s内删除了m2 from m2 import y print(y)
再从内置中寻找
from time import time print(time)
然后从自定制寻找
x = 10
最后从环境变量中寻找
Python文件的两种用途
作为模块文件,模块可以有多个
作为执行文件,执行文件只有一个
# m1.py x = 10 if __name__ == '__main__': print(x) # m2.py import m1
if __name__ == ‘__main__‘:
这段代码在pycharm里面只需要打一个main然后tab即可打出来,不需要一个字一个字打
当运行m1时__name__ == ‘__main__‘
所以会输出x
运行m2时__name__ != ‘__main__‘(if条件不成立)
会报错