目录

初识模块和包

Python常用的内置模块

关键字import和from

import、from查找的路径

如何调用

__name__与模块执行

__name__的用法(单元测试)


初识模块和包

我们把功能相近或相关的py文件组成模块,这样分开写代码便于维护,形成公用的模块避免重复实现。我们已经用到过time、functools、os、sys、cv2等。

模块分为三类,根据来源的“你我他”分为以下三类:

  1. Python内置模块,称其为第二人称“你的”模块,安装了Python就有的模块。
  2. 第三方模块,称其为第三人称“他的”模块。用pip安装第三方模块,实际上和内置模块没太大区别,安装了就变成了“内置”的了。请参考AI基础02-CV基本操作1里面pip的操作。
  3. 自定义模块,也就是第一人称“我的”模块。我的地盘听我的。

模块是可以被导入的,用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会做以下事情:

  1. 被import的文件从头到尾执行一遍
  2. 引入变量名到当前文件,仅仅引入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相关推荐

  1. Python基础之模块和包

    Python基础之模块和包 本节将介绍Python中的模块和包的概念及基本用法. 模块 简单来说模块就是一个python文件,我们可以将一些常量.函数.类等封装到一个模块中,然后在程序中使用该模块.模 ...

  2. python之路——模块和包

    一.模块 1.什么是模块? 常见的场景:一个模块就是一个包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用Python编 ...

  3. python哪里下载import包-详解python中的模块及包导入

    python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...

  4. Python 中的模块和包

    原文引至:前端小吉米 对于python中的模块和包, 我简直就想说, js nmlgb 就是一个 trash... 在前端写js根本就没有什么模块和包, 全部都是全局... 真lj... 畅快了. 写 ...

  5. 自学Python第九天- 模块、包、编码、文件操作、OS 模块、打包

    自学Python第九天- 模块.包.编码.文件操作.OS 模块.打包 模块 导入模块 程序入口 包 编码 文件操作 打开或创建文件 常用的文件打开模式 边读边写 文件对象的常用方法 读写 CSV Ex ...

  6. Python盒子:模块、包和程序

    Python盒子:模块.包和程序 命令行参数 test2.py import sys print('Program arguments:', sys.argv) D:\MyPython>pyth ...

  7. python的人工智能模块_饮冰三年-人工智能-Python-17Python基础之模块与包

    一.模块(module) 1.1 啥是模块 简单理解一个.py文件就称之为一个模块. 有的功能开发者自己无法完成,需要借助已经实现的函数\类来完成这些功能.例如:和操作系统打交道的类或者是随机数函数等 ...

  8. 带你学python基础:模块和包

    一.什么是模块 在我们平时的开发过程中,或多或少会用到 Python 的一些内置的功能,或者说,还会用到一些第三方的库,我们用到的这些 Python 的内置的功能,和一些第三方的库,就可以说是一些模块 ...

  9. 【Python】第一模块,开发基础

    Python开发工具课前预习 01 Python全栈开发课程介绍1 02 Python全栈开发课程介绍2 03 Python全栈开发课程介绍3 04 编程语言介绍(一) 05 编程语言介绍(二)机器语 ...

最新文章

  1. linux装nginx
  2. springboot 使用 redis 管理session
  3. Reflection带来的潜在威胁
  4. 五边形lisp程序_CAD LISP 程序
  5. 这些全国各地甜点,你都吃过了吗?
  6. JAVA读取2g数据的速度_Java 读取大容量excel
  7. python 学习2 /输入/ 输出 /列表 /字典
  8. .NET 的 WCF 和 WebService 有什么区别?(转载)
  9. CAN笔记(12) 同步
  10. Python中的numpy.sum()
  11. 使用cmd命令 关机
  12. 红冲发票,负数发票,作废发票
  13. JavaWeb项目启动时,自动执行指定方法
  14. 大数据分析平台搭建指南
  15. 笔记本开热点手机一直显示正在获取ip
  16. 抖音直播间千川投放有用吗?直播间投放分析有什么技巧
  17. bzoj4372 烁烁的游戏 动态点分治+线段树
  18. Elliptic Labs与全球领先的智能电视制造商签署首份概念验证协议
  19. H5 语音合成播报功能
  20. SpringBoot开发实用

热门文章

  1. CSS之定位(固定定位)
  2. git 合并两个分支的某个文件
  3. 远程桌面linux服务器配置,linux平台下远程桌面服务器的安装和设置
  4. 微信小程序开通腾讯云开发实践流程附详细图解
  5. 对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分
  6. jsp 出现cannot be resolved to a type问题解决办法
  7. path,classpath
  8. 大型网站系统架构系列:分布式消息队列(二)
  9. 蓝懿教育九月二十七日记录
  10. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...