Python基础16-模块与包基础01
目录
初识模块和包
Python常用的内置模块
关键字import和from
import、from查找的路径
如何调用
__name__与模块执行
__name__的用法(单元测试)
初识模块和包
我们把功能相近或相关的py文件组成模块,这样分开写代码便于维护,形成公用的模块避免重复实现。我们已经用到过time、functools、os、sys、cv2等。
模块分为三类,根据来源的“你我他”分为以下三类:
- Python内置模块,称其为第二人称“你的”模块,安装了Python就有的模块。
- 第三方模块,称其为第三人称“他的”模块。用pip安装第三方模块,实际上和内置模块没太大区别,安装了就变成了“内置”的了。请参考AI基础02-CV基本操作1里面pip的操作。
- 自定义模块,也就是第一人称“我的”模块。我的地盘听我的。
模块是可以被导入的,用import,在前面的博客中曾经from functools import reduce。
回忆在Java里面的包,实际上就是.class所在的文件夹。Python里面并非如此,初识Python包的时候,先记住一个特征,后面再仔细研究。如果文件夹里面有__init__.py的空文件,那么这个文件夹就是个包。否则这个文件夹就只是个文件夹。包可以用来组成模块,这样可以更好的组织代码,避免名字冲突。
Python常用的内置模块
Python常用的内置模块有time、random、os(操作系统相关)、sys(解释器相关)、json、pickle、logging(日志)、re(正则表达式)等。后面一个一个学习。
关键字import和from
import都干了些什么?from...import又会干些什么?
import会做以下事情:
- 被import的文件从头到尾执行一遍
- 引入变量名到当前文件,仅仅引入import后面的那个变量名
我们用一个实验来说明,在一个文件夹下创建三个py文件,__init__.py、test.py、calc.py内容如下,执行test.py以后,发现calc.py中的两个print都执行了。说明import时候,被import的py文件从头到尾执行了一遍。引入的变量calc,通过calc可以调用add和sub两个函数。
# test.py
import calcprint(calc.add(3, 5))
print(calc.sub(3, 5))
# from calc begin
# from calc end
# 8
# -2
# calc.py
print('from calc begin')def add(x, y):return x + ydef sub(x, y):return x - yprint('from calc end')
我们还可以from ... import xxx,import还是会把被import文件从头到尾执行一遍,但是引入的变量只是import后面的那个变量。如果想全部引入,可以from ... import *,但是并不推荐这样做,因为引入的多余的对象会让代码看起来产生歧义,引发更多人为造成的错误。所以,用什么就import什么是比较好的习惯,就像前面博客里from functools import reduce,用了reduce就只引入reduce。
# test.py
from calc import addprint(add(3, 5))
# from calc begin
# from calc end
# 8
import、from查找的路径
上面的例子,可以找到calc是因为calc是因为calc和test在同一层级。我们改变一下calc的位置,新建一个包就叫my_module,将calc放进my_module里面,执行上面的代码,会报错找不到calc。那么Python是怎么找到被引入的模块的呢?Python是从sys.path里面找到的。程序开始执行前,会把py文件的当前路径放进sys.path里面,之后所有的import都在这个sys.path里面找,和sys.path的子目录没有关系。
我们重新调整一下结构,程序入口bin.py,逻辑在main.py,被使用的模块放在calc.py里面。由于被执行的程序是bin.py,所以在sys.path里面加入的是bin.py所在的目录,之后程序不管执行到哪里,import的时候都会去sys.path的目录去找被引入的模块。main.py里面引入calc,如果直接写import calc,在sys.path中的d:/dev/day21里面是找不到calc.py的。因为正确的写法是from my_module import calc。
# calc.py
def add(x, y):return x + ydef sub(x, y):return x - y
# main.py
from my_module import calc# 由于被执行的程序是bin.py,所以在sys.path里面加入的是bin.py所在的目录
# 之后程序不管执行到哪里,import的时候都会去sys.path的目录去找被引入的模块
# main.py里面引入calc,如果直接写import calc,在sys.path中的d:/dev/day21里面是找不到calc.py的
# 因此正确的写法是from my_module import calc。def run():print(calc.add(3, 5))
# bin.py
from my_module import mainmain.run()
# 8
如何调用
当我们在bin.py里面就是要直接使用calc的add函数怎么办呢?我们可以用这种“点”的方式,找到对应模块、包的路径。我们重新调整一下,创建包web1、web2、web3,web3下有模块calc。
# web1.web2.web3.calc.py
def add(x, y):return x + ydef sub(x, y):return x - y# print(__name__)
# bin.py
from web1.web2.web3.calc import addprint(add(3, 8))
# 11
__name__与模块执行
__name__是Python内置的一个变量。如果模块被直接执行,那么模块的__name__的值是'__main__'。如果模块被import,那么模块的__name__的值是模块的路径(希望我这么不太准确的描述没有问题)。我们以如何调用这一节为例,在web1.web2.web3.calc.py里面加一行代码打印__name__的值。
如果我们直接执行calc.py,那么打印出来的就是__main__。
如果我们执行bin.py,那么打印出来的就是web1.web2.web3.calc。
# web1.web2.web3.calc.py
def add(x, y):return x + ydef sub(x, y):return x - yprint(__name__)
# 直接执行calc,那么calc里面的__name__的值是__main__
# bin.py
from web1.web2.web3.calc import addprint(add(3, 8))
# 11
# 如果执行bin.py,里面import calc,那么calc里面的__name__的值是web1.web2.web3.calc
__name__的用法(单元测试)
根据上一节所述的__name__的值,我们应该在每个py文件被执行的代码前面加上if __name__ == '__main__'判断。
这样,模块自身被执行的代码,只有在自己被直接执行(单元测试)的时候才被执行,被import的时候不会被执行,这是用户希望的那样。这个用法和Java里每个类的main方法的用法有些类似。从现在起,养成好习惯,在每个py文件里面自觉加上if __name__ == '__main__'判断。
print(__name__)
if __name__ == '__main__':print('写单元测试代码')
next
相关文章:

配置用户通过Telnet登录设备的身份认证(AAA本地认证)
背景信息 用户通过Telnet登录设备时,设备上必须配置验证方式,否则用户无法成功登录设备。设备支持不认证、密码认证和AAA认证三种用户界面的验证方式,其中AAA认证方式安全性最高。 采用AAA本地认证方式实现用户通过Telnet登录设备的身份认证&…
【自考】信息系统开发与管理(二)——章节详读
自考的第二阶段结束了,这一阶段是对书的详读过程。每章节读完,画一个导图。将其总结成一张网。织网的过程就是思考的过程。织网不断进行中……!宏观方面:1~3章第一章 管理信息系统导论在研究一…

ios技术篇-CoreData
ios技术篇-CoreData 上一篇: iOS技术篇-CocoaPods 目录 下一篇:

中山大学计算机学院运动会,喜讯!我院获2019中大校运会教工组团体第二名
11月2日,中山大学2019年运动会在南校园举行,来自全校68个院系、附属医院、部门共3200余名师生参加比赛。由37名职工运动员组成的中山七院代表队参加教工组田径赛、趣味田径及球类等全部15项比赛,经过激烈角逐,最终以团体总分173分…

Python基础17-模块与包基础02、常用模块之time、random
目录 名字冲突与避免 设置BASE_DIR保证程序能找到模块位置 time random 名字冲突与避免 在test.py里写下面一段代码,用正则表达式包re进行匹配,匹配出123开头的字符。如果我们在test.py同级写一个re.py,那么Python解释器在进行导入时就会…

Hadoop学习笔记(1) ——菜鸟入门
Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: 【百度百科】一个分布式系统基础架构,由Apache基金会所开发。用户能够在不了解分布式底层细节的情况下。开发分布式程序。充分利用集群的威力进行快…

HTTP协议简介
HTTP协议HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在…

计算机组成原理读写周期波形图,第3章存储器层次结构-1讲述.ppt
第3章存储器层次结构-1讲述计算机组成原理 * 计算机组成原理 ——存储器层次结构(1) 2016-3-18 几个基本概念 1、存储器:计算机系统中的记忆设备,用来存放程序和数据。 2、存储元:存储器的最小组成单位,用以存储1位二进制代码。 3…

iOS架构篇-4 架构模式MVVM
iOS架构篇-4 架构模式MVVM MVVM原理MVVM 登录例子View:ViewModel:Model:如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!读者有什么想看的相关技术篇章,欢迎评论留言!QQ交流群:908058499MVVM原理 #mermaid-svg-s6n4t9QkR9OeNy45 .label{fon…

CV00-01-开篇与环境搭建
目录 Intro 环境搭建 TensorFlow搭建 PyTorch搭建 PaddlePaddle搭建 Intro 从今天起学习CV,为期6个月,以三个真实项目为背景学习CV。 目前是第一个项目——车道线检测。时间两个月(共8周),每周五、周日晚上在线…

Spring MVC环境中的文件上传功能实现
在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像、商品图片、邮件附件等等。其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上传和下载有或多或少的…

iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署)
iOS架构篇-5 CI/CD(持续集成、持续交付、持续部署) CI CI是指持续集成,代码的更新会定期自动构建、测试并合并到公共仓库中,方便多分支时解决冲突问题 CD CD是指持续交付和/或持续部署,开发人员改动代码会自动测试提交到仓库,运维实施人员将其部署到生产环境中,方便部…

计算机函数模式的用处是啥,请问怎么理解计算机中的函数?
你的理解有点外行看热闹的意思,呵呵。代码本身就是抽象的,所以“计算机中的函数是一种对代码进行抽象的方式”不能说不对,但是也和没说一样。至于“我们使用抽象出来的函数,而不用关心函数里面的代码是如何组织的”,只…

CV00-03-CV基本操作2
基本操作2 Similarity Transform相似变换 Similarity Transform相似变换:图像形状大小不变,位置发生变化。比如:做平移、旋转。相似变换具有保角性、保比例性,经过相似变换以后原有的角度和比例保持不变。确定一个相似变换矩阵需…

[LeetCode] [C++] 第一轮刷题总结(持续更新~~~)
LeetCode 解题报告 LC_1_解题报告LC_2_解题报告LC_3_解题报告LC_4_解题报告LC_5_解题报告LC_6_解题报告LC_7_解题报告LC_206_解题报告LC_237_解题报告LC_344_解题报告 LeetCode 1. Two Sum 解题思路:两次循环遍历数组,找到两个元素和等于target 注意点&…

Android Studio 在项目中引用第三方jar包
在Android Studio项目中引用第三方jar包的方法: 步骤: 1、在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {jniLibs.srcDirs [libs]}} 点击【Sync Now】,会生成jniLibs文件夹 找到…

android专栏目录
android专栏目录 Android基础篇 android专题-数据库room android专题-蓝牙扫描、连接、读写 Android专题-常用第三方框架 Android高级篇 Android架构篇-1 项目组织架构 Android架构篇-2 国际化多语言 Android架构篇-3 网络接口封装 Android架构篇-4 架构模式MVVM Android架…

东北大学计算机分数线2017,东北大学2017年本科一批录取分数线(全国)
东北大学2017年全国各省各批次集中录取时间为7月6日-27日,在各省录取结束的分批次分科类录取最低分将在本页面持续更新公布,考生录取结果可通过关注东北大学招生办官方微信公众号(neuzs-1923)录取专区查询,最终录取结果请以考生收到的录取通知…

CV00-04-卷积
卷积概念 由于不好进行文字描述(懒),我直接推荐一个博客图像卷积,讲解图像卷积的概念。 图像卷积操作(convolution),或称为核操作(kernel),是进行图像处理的…

unity项目build成webgl时选择生成目录(解决方法)
在unity里点击File>>Build Settings...>>勾选你要生成的Scenes>>选择webgl>>后面Development Build不要勾选:点击build后会让你选择生成的目录,此处要慎重选择,否则会报错! 不要选择到项目所在目录&#…

STL中的nth_element()方法的使用
STL中的nth_element()方法的使用 通过调用nth_element(start, startn, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后&…

Android架构篇-2 国际化多语言
Android架构篇-2 国际化多语言 实现功能: 1.默认采用系统语言 2.语言切换后实时生效 3.支持中英文 4.我的->设置->切换语言 思路:app首次初始设置为系统语言,用户在app内切换语言时发送语言切换事件,刷新所有页面 在AppBaseActivity、AppBaseFragment通过EventB…

齐鲁工业大学计算机读研,齐鲁工业大学考研难吗
齐鲁工业大学考研难吗?1、齐鲁工业大学考研难度算是比较容易。不在大学考研难度排名前100名单之内。2、考研究生难易程度还是看招生院校的地域、名气、排名等因素,生源不同,竞争力度也不同。发达地区特别是像北京,上海这样的大城市…

Python基础18-常用模块之os、sys、json、pickle、shelve、xml、re、logging、configparse、hashlib等
目录 os、os.path sys json pickle、shelve、xml、re、logging、configparse、hashlib未完待续…… os、os.path Python的os模块里面定义了常用的路径、文件操作。 os.curdir # curdir相对路径的当前路径“点” os.pardir # pardir相对路径的父目录“点点”。 os.sep …

剑指offer 重建二叉树 python
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 样例 输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} 返回二叉树头节点想法: 使用递归,既…

C#中的Liststring泛型类示例
在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时,List<string>泛型类是一个用于存储一系列字 符串(strings)的极其优秀的解决办法。下面一起有一些List<string>泛型类的示例,一起来看看吧。 List示例 下面是一个使用C#创建一个…

计算机检索的优点,专利检索与分析系统拥有哪些优势?
专利检索与分析系统拥有哪些优势?现在很多朋友都在了解专利检索与分析系统又有哪些优势,因为他们需要使用这些系统,不少朋友都会利用业余时间搞各种发明专利,并申请发明专利,在申请之前,人们就需要对专利进…

Android架构篇-1 项目组织架构
Android架构篇-1 项目组织架构 模块化分层 1.结构清晰,各模块代码分离,符合高内聚低耦合,快速定位查找代码 2.团队协作开发灵活,互不影响,各模块完成后合并即可完成整体app 3.抽离公共层、模块层、业务层,方便维护管理 分层架构图 App下的Home(首页)、Mine(我的)、Log…

Python基础19-面向对象基础
目录 面向对象概述 面向对象的一种实现 类的相关知识 对象的相关知识 面向对象属性的查改增删操作 类属性的查改增删 对象属性的查改增删 关于类、对象属性容易混淆额或忽略的地方的说明 面向对象概述 编程发展至今有面向过程编程、函数式编程、面向对象编程三大流派&…

《一杯沧桑》有感
《一杯沧桑》 “每一个人的一生, 都是一仅仅杯子。 仅仅是杯子的大小不一样。 有些杯子, 它能够装下一片汪洋, 而有些杯子, 它却装不下一点忧伤。 …