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) 打 ...
随机推荐
- Beats:使用 Filebeat 导入 JSON 格式的日志文件
转载自:https://blog.csdn.net/UbuntuTouch/article/details/108504014 在今天的文章中,我来用另外的一种方式来展示如何导入一个 JSON 格式的 ...
- 【原创】推流录屏软件OBS使用教程--录屏
之前有录屏需要,写了一篇关于ffmpeg录屏的文章,反响还不错,但是直接用ffmpeg门槛有些高,今天写一篇图形界面的录屏推流工具OBS的使用教程.这次先写OBS的录屏教程 下载安装 点击 OBS官网 ...
- 2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化
接上回 上一篇我们简单介绍了基于SpringBoot实现简单的Web开发,本节来看Web开发中必不可少的内容--数据持久化 先看项目结构: 1. 创建数据表 打开mysql,打开数据库 test (没 ...
- oneplus8手机蓝牙连接tws耳机无法双击退出语音助手
通过蓝牙协议栈我们知道,蓝牙耳机可以通过发送AT指令唤醒或者退出语音助手 唤醒语音助手: AT+BVRA=1 退出语音助手: AT+BVRA=0 但是实际操作中发现双击可以唤醒但再次双击却无法退出语音 ...
- python今日分享(内置方法)
目录 一.习题详解 二.数据类型的内置方法理论 三.整型相关操作 四.浮点型相关操作 五.字符串相关操作 六.列表相关操作 今日详解 一.习题详解 1.计算1-100所有数据之和 all_num = ...
- Java代码审计之实战某博客
对某博客的代码审计 在gitee上面找了一个个人博客项目,来进行实战代码审计,主要还是学习为主 技术菜菜,哪里错误希望师傅们指正 1.SQL注入 先了解Java Web中的数据传输流程 graph T ...
- kali配置
IP设置 配置文件:/etc/networking/interface 临时IP ifconfig eth0 192.168.31.111/24 永久IP auto eth0 #iface eth0 ...
- File常用的方法操作、在磁盘上创建File、获取指定目录下的所有文件、File文件的重命名、将数据写入File文件
文章目录 1.基本介绍 2.构造方法 3.常用的方法 4.代码实例 4.1 创建文件和目录(目录不存在) 4.1.1 代码 4.1.2 测试结果 4.2 测试目录存在的情况.直接写绝对的路径名 4.2 ...
- 5.-GET请求和POST请求
一.定义 无论是GET请求还是POST,统一由视图函数接收请求,通过判定request.method区分具体的请求动作 二.GET处理 GET请求方式中,如果有数据需要传递给服务器,通常会用查 ...
- Java:既然有了synchronized,为什么还要提供Lock?
摘要:在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块.既然已经提供了synchronized关键字,那为何在Java的SDK包中,还会提供Lock接口呢?这是不是 ...