模块
一.模块的定义与分类
1.模块是什么?
模块就是一系列功能的结合体
2.为什么要使用模块?
从文件级别组织程序,更方便管理,随着程序的发展,功能越来越多,为了方便管理
拿来主义,提升开发效率
一定要区分哪个是执行文件,哪个是被导入文件(************)
3.模块的分类
python语言中,模块分为三类:
第一类:内置模块,也叫做标准库
第二类:第三方模块
第三类:自定义模块
二.import
1.import的使用
import就是导入的意思
使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
2.你如果想访问模块中名字 必须用模块名.名字的方式
2.第一次导入模块执行三件事:
右键运行run.py文件首先会创建一个run.py的名称空间
首次导入模块(md1.py)(******)
1.执行md.py文件
2.运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
3.在执行文件中产生一个指向名称空间的名字(md)
多次导入不会再执行模块文件,会沿用第一次导入的成果(******)
3.被导入的模块有独立的名称空间
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当作全局名称空间,这样我们在编写自己的模块是,不需要担心定义在自己模块中全局变量会在被导入,与使用者的全局变量冲突。
#md py文件 money = 1000 def read1(): print('md',money) #run py文件 import md money = 9999 def read1(): print('from run read1') print(money) #9999 print(md.money) #1000 read1() #from run read1 md.read1() #md1000
4.为模块起别名
import mdddddddddddddddd as md
好处可以将很长的模块名改成很短的,方便使用
有利于代码的扩展和优化:
举例:
#mysql.py def sqlparse(): print('from mysql sqlparse') #oracle.py def sqlparse(): print('from oracle sqlparse') #test.py db_type=input('>>: ') if db_type == 'mysql': import mysql as db elif db_type == 'oracle': import oracle as db db.sqlparse()
5.导入多个模块
import os,sys,json # 这样写可以但是不推荐 #推荐写法 import os import sys import json
多行导入模块:易于阅读,易于编辑,易于搜索,易于维护
三.from..import...
1.from..import..的使用
from md impot money print(money) #1000
2.from..import..与import对比
唯一的区别就是:from..import..能够将变量,或者函数直接导入到当前的名称空间中,用的时候无需再加上前缀
缺点是:容易与当前的执行文件中变量名起冲突
from..import*能够将导入模块中的名字全部加载过来,但是不推荐使用,因为如果模块中名字太多,分不清或者找不到这些名字
__all__可以指定当所在py文件被当做模块导入的时候
可以限制导入者能够拿到的名字个数
money = 1000 def read1(): print('md',money) __all__ = ['money','read1','read2'] #当导入此模块时 from md import*时 只会导入__all__中的名字
3.模块循环导入问题
模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码
在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方在程序出现了循环/嵌套导入后的异常分析、解决方法如下
1.方式1
将循环导入的句式写在文件最下方()
2.方式2
函数内导入模块
#执行文件 run import m1 m1.f1() #m1.py模块 #方法一 print('正在导入m1') x = 'm1' from m2 import y#首次导入m2 #方法二 print('正在导入m1') def f1(): from m2 import y,f2 print('m1.f1>>>y:',y) f2() x = 'm1' #m2.py模块 #方法一 print('正在导入m2') y = 'm2' from m1 import x#第二次导入m1 #方法二 print('正在导入m2') def f2(): from m1 import x print('m2.f2>>>x:',x) y = 'm2'
四. __name__的用法
python为我们内置了全局变量__name__,
当文件被当做脚本执行时:__name__ 等于'__main__'
当文件被当做模块导入时:__name__等于模块名
if __name__ == '__main__': run()
五.模块的查找顺序
模块的查找顺序
1.先从内存中找
2.内置中找
3.sys.path中找(环境变量):
一定要分清楚谁是执行文件谁是被导入文件(******)
是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹
注意py文件名不应该与模块名(内置的,第三方)冲突
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)