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
Python基础16-模块与包基础01相关推荐
- Python基础之模块和包
Python基础之模块和包 本节将介绍Python中的模块和包的概念及基本用法. 模块 简单来说模块就是一个python文件,我们可以将一些常量.函数.类等封装到一个模块中,然后在程序中使用该模块.模 ...
- python之路——模块和包
一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...
- python哪里下载import包-详解python中的模块及包导入
python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...
- Python 中的模块和包
原文引至:前端小吉米 对于python中的模块和包, 我简直就想说, js nmlgb 就是一个 trash... 在前端写js根本就没有什么模块和包, 全部都是全局... 真lj... 畅快了. 写 ...
- 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包
自学Python第九天- 模块.包.编码.文件操作.OS 模块.打包 模块 导入模块 程序入口 包 编码 文件操作 打开或创建文件 常用的文件打开模式 边读边写 文件对象的常用方法 读写 CSV Ex ...
- Python盒子:模块、包和程序
Python盒子:模块.包和程序 命令行参数 test2.py import sys print('Program arguments:', sys.argv) D:\MyPython>pyth ...
- python的人工智能模块_饮冰三年-人工智能-Python-17Python基础之模块与包
一.模块(module) 1.1 啥是模块 简单理解一个.py文件就称之为一个模块. 有的功能开发者自己无法完成,需要借助已经实现的函数\类来完成这些功能.例如:和操作系统打交道的类或者是随机数函数等 ...
- 带你学python基础:模块和包
一.什么是模块 在我们平时的开发过程中,或多或少会用到 Python 的一些内置的功能,或者说,还会用到一些第三方的库,我们用到的这些 Python 的内置的功能,和一些第三方的库,就可以说是一些模块 ...
- 【Python】第一模块,开发基础
Python开发工具课前预习 01 Python全栈开发课程介绍1 02 Python全栈开发课程介绍2 03 Python全栈开发课程介绍3 04 编程语言介绍(一) 05 编程语言介绍(二)机器语 ...
最新文章
- linux装nginx
- springboot 使用 redis 管理session
- Reflection带来的潜在威胁
- 五边形lisp程序_CAD LISP 程序
- 这些全国各地甜点,你都吃过了吗?
- JAVA读取2g数据的速度_Java 读取大容量excel
- python 学习2 /输入/ 输出 /列表 /字典
- .NET 的 WCF 和 WebService 有什么区别?(转载)
- CAN笔记(12) 同步
- Python中的numpy.sum()
- 使用cmd命令 关机
- 红冲发票,负数发票,作废发票
- JavaWeb项目启动时,自动执行指定方法
- 大数据分析平台搭建指南
- 笔记本开热点手机一直显示正在获取ip
- 抖音直播间千川投放有用吗?直播间投放分析有什么技巧
- bzoj4372 烁烁的游戏 动态点分治+线段树
- Elliptic Labs与全球领先的智能电视制造商签署首份概念验证协议
- H5 语音合成播报功能
- SpringBoot开发实用