python模块的含义
模块简介
模块的本质
模块是内部具有一定功能(代码)的py文件
python模块的历史
python刚开始的时候其他编程语言的程序员都看不起,甚至给python起了个外号:调包侠
随着时间的发展,发展项目的复杂度越来越高,python的模块功能越来越好用,上面那一帮人也不得不用一下python,然后发现python真香!
python模块的表现形式
- py文件(py文件也可以称之为模块文件)
- 含有多个py文件的文件夹(按照模块功能的相似度 分在同一个文件夹 这个文件夹叫包)
- 已被编译为共享库或者DLL的c或C++扩展(了解)
- 使用C编写并连接到python解释器的内置模块(了解)
模块的分类
- 自定义模块:自己写的模块文件,如py文件
- 内置模块:Python解释器提供的模块
- 第三方模块:别人写的模块文件。很多大佬写的模块很好用。
导入模块的两种句式
强调
- 一定要搞清楚谁是被执行文件 谁是导入文件
- py文件是纯英文 不会用中文或空格
- 导入模块文件不需要填写后缀名
import句式
# 以import a为例研究底层原理
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
import流程推导
如图:
- 先运行左边
import a
代码所在的py文件。产生执行文件的全局名称空间,里面什么也没有。 - 看见
import a
,产生a.py文件的全局名称空间,开始运行a.py文件。 - 在a.py全局名称空间产生name这个名字
- 在a.py全局产生func1、func2、change函数名
- 模块运行完毕 标志
import a
运行完毕 被执行文件名称空间多一个名字a,对应着a模块。
- a.py运行完毕回来执行
print(a.name)
,此时调用的name是a.py里面的name,结果是'jason'。 - 再继续往下
a.func1()
,调用的是a.py模块的func1。
练习
print(name)
的 结果是什么?
a.change()
修改的是a.py文件名称空间内的全局name,修改不到执行文件的。
所以print(name) # kevin
from...import...句式
# 以from a import name,func1为例研究底层原理
"""
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
"""
- 这里
print(name)
输出的就是a.py文件中的'jason'
- 如果在执行文件中改了name的值,那也就拿不到模块文件中的'jason'了。pycharm还会对name标黄。
补充说明
import与from...import...两者优缺点
import句式
由于使用模块名称空间中的名字都需要模块名点的方式才可以用
所以不会轻易的将被执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块名点才可以from...import...句式
指名道姓的导入模块名称空间中需要使用的名字 不需要模块名点
但是容易跟执行文件中名字冲突重复导入模块
解释器只会导入一次 后续重复的导入语句并不会执行
结果:
起别名
import ..... as ...
from ..... import ..... as ...
from a import name as n,func1 as f1
例子:
结果:
例子:
结果:
例子:
结果:
- 涉及到多个模块导入
import say
import tell
如果模块功能相似度不高 推荐使用第一种 相似度高可以使用第二种
import say, tell
循环导入
1.循环导入
两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字 极容易报错
2.如何解决循环导入问题
1.确保名字在使用之前就已经准备完毕
2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
流程推导
- 运行md1.py文件,产生md1全局名称空间,
import md2
去执行md2模块 - 运行md2.py文件,产生md2全局名称空间,注意这里
import md1
此时md1名称空间已经展开,此时会回到md1文件继续运行 - 运行
name = 'from md1'
代码,在md1全局产生name名字。 - 运行
print(md2.name)
代码,此时会去md2找name这个名字,显然没有,所以报错!!
报错信息还会提示你,可能是由于循环导入(circular import):
解决
- 确保名字在使用之前就已经准备完毕 把这个12345这个流程顺序搞明白!
- 在函数体代码里写import代码
判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ == '__main__':
print('哈哈哈 我是执行文件 我可以运行这里的子代码')
上述脚本可以用来区分所在py文件内python代码的执行
使用场景
1.模块开发阶段
2.项目启动文件
"""
from a import * *默认是将模块名称空间中所有的名字导入
__all__ = ['名字1', '名字2'] 针对*可以限制拿的名字
"""
运行md.py文件:
结果:
限制import * 导入的方法
星号可以一次性导入所有名字 这样很容易产生名字冲突
可以用一个东西 限制星号的导入 也就是在模块文件里加代码__all__
会报错:这也表示限制成功了!!
双下all只针对星号导入,如下导入方法,双下all无法限制!!!
模块的查找顺序(重要)
1.内存
import aaa
import time
time.sleep(15)
print(aaa.name)
aaa.func1()
# 在内存开辟名称空间!!删除文件只是删除硬盘中的数据 程序结束之后 内存中跟程序相关的数据删掉了 内存释放了 再次运行就找不到了
2.内置
import time
print(time)
print(time.name)
"""
以后在自定义模块的时候尽量不要与内置模块名冲突
"""
# 1. 有自定义模块 和 内置模块时 优先找内置
# 2. 在内置模块 和 自定义模块重名时 会把pycharm搞懵 你调用模块时pycharm 会把自定义和内置的名字都列出来
3.执行文件所在的sys.path(系统环境环境)
一定要以执行文件为准!!!
我们可以将模块所在的路径也添加到执行文件的sys.path中即可
import sys
print(sys.path) # 列表
sys.path.append(r'D:\pythonProject03\day17\mymd')
import ccc
print(ccc.name)
将路径导入到sys.path列表 把pycharm都玩懵了 还飘红 但是可以执行
绝对导入和相对导入
"""
再次强调:一定要分清楚谁是执行文件!!!
模块的导入全部以执行文件为准
"""
绝对导入
from mymd.aaa.bbb.ccc.ddd import name # 可以精确到变量名
from mymd.aaa.bbb.ccc import ddd # 也可以精确到模块名
ps:套路就是按照项目根目录一层层往下查找
相对导入
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入只能用于模块文件中 不能在执行文件中使用 一旦使用相对导入 就表示这个文件是模块文件 不是执行文件。
'''
相对导入使用频率较低 一般用绝对导入即可 结构更加清晰
'''
流程推导
# 1.你要在a.py文件用from...import导入
# 2.出发点必须是整个项目路径 一层层用点 点出来
# 3.如下图python_goldclass就是我项目路径下的一个包 helloworld是个py文件
执行文件是谁问题(重要)
上图在第5步这里出问题,因为此时的执行文件是md.py,此时我们只看md文件的路径,md.py文件路径下没有一个叫b的模块!!! 所以报错 No module named 'b'
修改成如下则没问题:
如果路径很深这样导入会很麻烦,要写很长:
所以此时就可以使用相对导入,用点表示在当前模块文件所在路径找!!
相对导入只能用于模块文件中 不能在执行文件中使用!!! 会直接将这个文件定死为模块文件?
包
大白话:多个py文件的集合>>>:文件夹
内部含有双下init.py文件的文件夹 (python2必须要求 python3无所谓了)
python3你是一个有py文件的文件夹 你就是包
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
from aaa import md1, md2
2.如果直接导入包名
import aaa
导入包名其实就是导包下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字
定位功能
python模块的含义的更多相关文章
- python模块介绍- multi-mechanize 性能测试工具
python模块介绍- multi-mechanize 性能测试工具 2013-09-13 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 3739 ...
- python 模块之-time
python 模块time import time # 1 time() :返回当前时间的时间戳 time.time() #1473525444.037215 #------------------- ...
- 【转】Python模块学习 - fnmatch & glob
[转]Python模块学习 - fnmatch & glob 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特 ...
- Python 模块 re (Regular Expression)
使用 Python 模块 re 实现解析小工具 概要 在开发过程中发现,Python 模块 re(Regular Expression)是一个很有价值并且非常强大的文本解析工具,因而想要分享一下此 ...
- 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块
简介 一个用于提取简体中文字符串中省,市和区并能够进行映射,检验和简单绘图的python模块. 举个例子: ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘 ...
- Python - 模块(二)
目录 Python - 模块(二) re re下面的方法 logging os Python - 模块(二) re re模块提供了正则表达式的相关操作 主要字符介绍: . 通配符,除了换行符之外的任意 ...
- python模块(转自Yuan先生)
模块&包(****) 模块(modue)的概念: 在计算机程序的开 ...
- python模块详解 | selenium(持续更新中)
目录: 关于selenium Selenium 安装Selenium 安装浏览器驱动 配置环境变量 selenium方法详解 定位元素 元素操作 浏览器操作 鼠标事件 浏览器事件 设置元素等待 多表单 ...
- Python——模块&包&异常
模块&包&异常 一. 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义(变量)和Python语句. 模块能定义函数 ...
- 使用C/C++写Python模块
最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...
随机推荐
- 利用 Nginx 反向代理搭建本地 yum 服务器
在政府,医院等单位有网络安全要求,对内外网进行物理隔离,然而内网主机无法访问互联网下载安装包,通过Nginx 反向代理搭建本地yum服务器实现内网主机安装包下载. Centos 8.2 部署 Ngin ...
- DevOps图示
- DophineSheduler上下游任务之间动态传参案例及易错点总结
作者简介 淡丹 数仓开发工程师 5年数仓开发经验,目前主要负责百得利MOBY新车业务 二手车业务及售后服务业务系统数仓建设 业务需求 在ETL任务之间调度时,我们有的时候会需要将上游的 ...
- C++面向对象编程之reference
1.声明 reference 一定要有初值,指针可以不用设初值 2. int& r = x; 表示 r 代表 x, r 用起来就是 x ,而且 reference 设完初值后再也不能代表其他变 ...
- Filter 筛选器(二)之 ExceptionFilter
public class MyExceptionFilter : IAsyncExceptionFilter { private readonly ILogger<MyExceptionFilt ...
- 前端枚举enum的应用(Element)封装
什么是枚举Enum 枚举 Enum是在众多语言中都有的一种数据类型,JavaScript中还没有(TypeScript有).用来表示一些特定类别的常量数据,如性别.学历.方向.账户状态等,项目开发中是 ...
- 使用dotnet-monitor sidecar模式 dump docker运行的dotnet程序.
前情概要 随着容器和云技术的发展, 大量的应用运行在云上的容器中, 它们的好处是毋庸置疑的, 例如极大的提高了我们的研发部署速度, 快速的扩缩容等等, 但是也存在一些小小的问题, 例如难以调试. 基于 ...
- 用昇腾AI护航“井下安全”
摘要:基于CANN(异构计算架构)打造的"智能矿山安全生产管理平台",能够更便捷和更高效地服务于更多矿山安全生产建设. 本文分享自华为云社区<华为携手云话科技助力矿山智能化, ...
- C# 8.0 中的 Disposable ref structs(可处置的 ref 结构)
官方文档中的解释: 用 ref 修饰符声明的 struct 可能无法实现任何接口,因此无法实现 IDisposable. 因此,要能够处理 ref struct,它必须有一个可访问的 void D ...
- Java 编码那些事(一)
编码 做Web的同学,最开始一定遇到过乱码问题,工作这么久,一定听说过Unicode, GB2312等编码.典型的记事本选择的四种选项:ANSI,Unicode,Unicode big endian, ...