python 06.05
1.模块
模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体,一个.py文件就可以放一堆函数,因此,一个.py文件就可以当成一个模块。
模块可以存放多个函数,然后把多个函数分成多个文件,一个模块具有很大功能。
模块的形式;
1.自定义模块
2.第三方库,需要自己下载,如requests
3.内置模块,python中自带的,可以直接调用,如time
4文件夹模块,在python中称为包。
使用模块方式:import /from ...import
2.import与 from...import
import time 导入时发生的三件事情
1.打开time文件
2.把time文件内的内容读入python解释器的内存,然后把文件内的名字放入特定的模块time的名称空间
3.test.py中会有一个time变量指向time模块的名称空间,如果导入方式为import time as t,则就是t变量指向time模块的名称空间
from time import sleep
1.打开time文件
2.把time文件内的内容读入python解释器的内存,然后把文件内的名字放入特定的模块time的名称空间
3.test.py中会有一个sleep变量指向time模块名称空间中的sleep,如果导入方式为`from time import sleep,localtime`,则是由一个sleep变量和一个localtime变量指向time模块名称空间中的sleep和localtime
3.循环导入问题
# m1.py
from m2 import y
x = 10
# m2.py
from m1 import x
y = 20
解决方法一:
# m1.py
x = 10
from m2 import y
# m2.py
y = 20
from m1 import x
导入之前让变量提前生成,但是又发现了一个新问题,会执行两次print
#  print(__name__)  # 在当前执行文件内打印它为'__main__',在导入时打印它为文件名
解决方法二:
# m1.py
def f1():
    from m2 import y
x = 10
f1()
# m2.py
def f2():
	from m1 import x
y = 20
f2()
把需要导入的名字y封装到函数体内部。名字的执行顺序:内置--》全局--》局部,
# 调用函数的时候才会用到y,调用函数之前,全局变量x已经生成了,m2能找到x,y就能够生成,
# m1就能找到y,问题就解决了
4.模块的搜索路径
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
5.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()
    
# test.py
import m1
m1.f1()  # 运行两次
                    
                
                
            
        
浙公网安备 33010602011771号