目录
模块的四种形式
python看成手机--->pip看成应用管家-->模块就是应用软件
1系统自带应用软件-->不需要安装
2.需要下载的应用软件
3.自定义的应用软件
1.内置模块
python解释器启动自带的模块,time/random/os/sys...
2.pip安装的第三方模块
在cmd中输入pip install jieba
代码安装
在pycharm中安装
3.自定义模块
自定义代码
4.包(模块)
未来详细讲
import和from...import
import ...
# import time #定义同名变量存储模块名称空间地址
# python3解释器运行并且有导入语句才会发生,即使导入之后不使用模块中的任何信息
# 1.开辟内存空间,将内存空间命名为time
# 2.把time.py中的所有代码读入名称空间,然后运行
# 3.通过time.方法名使用time模块中的方法 #此时能找到time这个整体的地址,但找不到sleep的具体地址
# time.time()
# print(time) #不报错,当前执行文件已经获取了内存中time模块这个整体的地址
# sleep() #报错,当前执行文件没有获取内存中sleep()方法的具体地址,也就无法调用
#from 模块名 import 方法名
# from 模块名 import 方法名
# from time import sleep #定义同名变量存储导入的方法名地址及模块中的变量名地址
# 1.开辟内存空间,将内存空间命名为time
# 2.把time.py中的所有代码读入名称空间,然后运行
# 3.把sleep方法读入当前文件直接使用方法名,因此可以直接使用方法名
# sleep(1)
# print(sleep(1)) #不报错,当前执行文件已经获取了内存中具体的sleep()方法的地址
# time.sleep() #报错,当前执行文件没有获取内存中time这个模块的整体地址,也就无法通过time的这个整体的地址找到具体的某个方法的地址去调用
使用多个方法
# 使用多个方法
# from time import sleep, time # 特定导入一些功能
#
# print(time()) # 相当于time.time(),返回当前时间
# # 如果想导入非常多方法
# from time import * #导入了所有功能,相当于复刻了整个名称空间中的所有内容到当前执行文件开辟的内存空间中
# localtime()
# gmtime() #都能使用
优缺点
#import和from...import...的优缺点
#import
#优点:永不冲突
#缺点:每次导入多输入字符
#from...import...
#优点:少数人字符
#缺点:有可能冲突,
# print(sleep)
# sleep = 6
# print(sleep)
# def sleep():
# print('蔡启龙')
# print(sleep)
自定义模块
#用途:分文件存储代码-->函数与函数之间分开-->让代码更加清晰-->不同的模块敢不同的事
# import test_自定义模块
# print(test_自定义模块.abc)
# test_自定义模块.fm()
from test_自定义模块 import *
print(abc)
fm()
'''但是使用 import * 导入可能出现当前执行文件与模块文件全局变量重名的情况
解决方法:
在模块文件中的第一行使用 __all__ = ['abc','fm']
声明只允许被导入列表内的变量-->为什么是第一行(声明只对声明以下代码有效)以及为什么用字符串(变量在声明之后定义的)
只对 from ... import * 有限制作用,对单个导入以及对整体模块名导入无效
'''
print(i) #变量i未导入,打印时报错未定义
循环导入
先将当前文件夹设置为根路径,再打开
循环导入原因
针对#from ... import ...
而言
'''
1.导入模块则将该模块代码放入新的内存空间
2.在被导入模块内的第一行有语句继续导入模块,并且继续导入的模块文件为未执行的**当前执行文件**代码,则也会开辟新的内存空间
3.导入模块开辟新内存空间只会开辟一次
4.如果导入模块时开辟的内存空间已经存在,则会强制找 import 后面的变量,找不到就会报错,找到就正常运行其他代码
'''
#m1
from m2 import y
x=10
print('from m1')
#m2
from m1 import x
y = 20
print('from m2')
run m1
#当前执行文件为m1
#报错找不到找y
解决方法
第一种
变量定义在模块导入之前 #尽量不用,可能造成全局变量域混乱
第二种
将模块导入语句放入函数中,利用函数定义阶段只检测语法不执行代码的特性
补充
#m1
x=10
from m2 import y
print('from m1')
#m2
y = 20
from m1 import x
print('from m2')
#run m1
'''
打印结果:
from m1
from m2
from m1
'''
模块的搜索路径
引入
名称空间的搜索路径
局部-->全局-->内置
模块的四种形式
1.内置模块:python解释器启动自带的模块 time/random/os/sys
2.pip安装的第三方模块 #pip install jieba
或者pycharm安装
3.自定义模块
4.包(本质也是模块)-->未来详细讲
搜索顺序
1.内存
2.内置
3.自定义
#测试内存和自定义的搜索顺序
# import time
# import test_自定义模块
# print(test_自定义模块.abc)
# time.sleep(10) #顺带删掉test_自定义模块
# print(test_自定义模块.abc)
#测试出先内存找再自定义找
# #测试自定义和内置的搜索顺序
# import time
# print(time.abc)
# #报错,测试出先内置找再在定义找
#测试内存和内置的搜索顺序
import time
import jieba
print(jieba)
s = 'acf'
time.sleep(15)
print(jieba._lcut_all(s)) #不报错,证明先从内存中找测试出先从内存中找,再从内置中找
#因此自定义模块不能以内置的模块关键字名命名
python文件的两种用途
一个文件既可以是当前执行文件,也可以是模块文件
1.作为当前执行文件
2.作为模块文件
from test_自定义模块 import fm
#导入指定模块中的函数不想使用,但模块文件代码对该函数进行了测试调用,因而在导入语句执行阶段就会使该函数运行
#解决方法
#在文件中加入 if __name__ == '__main__': 判断文件是否为当前执行文件,如果是,if条件成立,再调用
#测试得到当test_自定义模块为模块文件时__name__为文件名
总结
__name__
是每个文件都有的变量,当该文件为执行文件时__name__
值为'__main__'
;当改文件为模块文件时__name__
值为文件名
__name__
是每个文件都有的变量,当__name__
为执行文件