【python】模块包

前言

模块化是python中的重要知识。随着我们接触的工程项目变得越来越大时,就需要把我们的运行代码进行拆解以便我们检查和项目的推进。有些时候,几个程序都需要同一个功能,那python就提供一种方法,把需要重复利用的代码放在同一个文件夹里面,并在脚本或者python交互式解释器中使用它们。重复利用代码的文件被称为模块。模块中定义的代码可以被导入到另一个模块或主模块

模块

模块就是包含了一个python定义和声明的“.py”文件。

介绍

我们新建一个文件,将其称为“fibs.py"
在文件中定义两个函数

def fib(n):a,b=0,1while b<n:print(b,end=' ')a,b=b,a+bprint()def fib2(n):result=[]a,b=0,1while b<n:result.append(b)a,b=b,a+breturn result

我们在跟我们所定义的fibs文件的同一个目录下面建立一个新的文件,并输入下列指令

import fibs
print(fibs)

运行一下,我们就能看到下面的这一个编译结果

<module 'fibs' from 'fibs.py'>

 通过结果,我们能知道这是一个叫做’fibs‘的模块,是从”fibs.py”这个文件获取的,这就说明我们成功导入了模块fibs了。

__name__变量

模块的模块名可以通过全局变量“__name__”获得。

import fibs
print(fibs.__name__)
print(__name__)

运行结果

fibs
__main__

我们发现,打印fibs中的__name__变量打出的是模块名字fibs,但是我们执行python文件打印本地的__name__变量时发现变量的值却变成了__main__。在python里面__name__是当前的模块名,当模块被直接运行时模块名就为__main__。通过python的这个特性,我们就可以在定义模块的时候通过查看当前的__name__变量值是否为__main__来判断当前文件是否被运行还是作为模块被导入。下面就是一个判断语句:

if __name__ =="__main__":print("直接运行")
else:print("被作为模板导入")

!!!python是不支持直接带点或者以数字开头的文件作为模块导入(有其他的方式可以绕过这个机制,但最好还是别用,要养成良好的编程习惯)。python中模块的文件名命名规则和变量命名规则是一样的。

dir函数

dir函数可以列出对象的模块标识符,标识符有函数,类和变量。当你为dir函数提供一个模块名的时候,它会返回模块所定义的名称列表。如果不提供参数的话,它返回当前模块中所定义的名称列表

import fibs
print(dir(fibs))
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']

结果中可以看到一些内置变量,同时也可以看到在fibs中定义的两个函数fib和fib2,使用dir函数可以方便我们去了解对象的构造

使用模块

import...

import fibs
fibs.fib(10)
print(fibs.fib2(5))

运行结果

1 1 2 3 5 8 
[1, 1, 2, 3]

这里是使用了import的语法,还有另一种语法是from...import...,这种语法方式可以让我们导入模块中一个指定的部分到当前的命名空间里面。

from... import...

from fibs import fib,fib2
fib(10)
print(fib2(5))
1 1 2 3 5 8 
[1, 1, 2, 3]

这两种放方式的运行结果是一样的。不过呢,使用from...import... 之后的内容就和定义在当前文件一样方便。使用这种方式导入后呢,使用该模块时就只需要使用关键字"import"后导入的名字即可,不再需要完整的包名前缀。

使用

python通过模块来组织代码,模块就是一个python文件,是通过“包”来加以组织的,而“包”是一个包含__init__.py的文件夹。代码,模块和包的三者关系就是:包包含模块而且至少包含一个__init__.py,模块包含代码。

简单来说,包就是文件夹,这个文件夹下面它必须包含__init__.py文件,该文件的内容可以为空。__init__.py用于表示当前文件夹是一个包。

例子

 我们在python_basic这个大的目录下建立一个名为package9的文件夹,在文件夹里面写入__init__(让package成为包的必要条件),fun1.py,fun2.py这三个文件,下面我向大家展示一下这三个文件究竟写了一些什么吧

__init__.py:
if __name__ =="__main__":print("为主程序使用")
else:print("package初始化")
fun1.py:
def print1():print("fun1")
fun2.py:
def print2():print("fun2")

我们在同一个目录下创建一个文件,注意:不在package9这个文件夹里面。

我们姑且将其称为a吧

a.py: 

 在a这个文件里面,我们写入以下的几行代码:

from package9.fun1 import print1
from package9.fun2 import print2print1()
print2()

我们在a里面导入了package9包里面的print1和print2这两个函数,并调用了print1和print2

运行一下a这个文件

package初始化
fun1
fun2

这里我们了解了这么去创建你的包以及怎么去调用你的包的模块中的函数。当然啦,你的包拥有无限的可能,你可以根据需要工程的需要来创建。

在多目录下使用包

我们刚刚那个例子中只有一个目录,那假如是多目录呢

当你导入一个模块或者包的时候,python解析器对模块的位置搜索顺序是

  1. 寻找当前的目录
  2. 不在就去搜索变量下的每一个目录
  3. 都没有的话,就去查看默认路径。

__path__ 

包支持一个属性:__path__,在包的文件代码执行前,它被初始化为一个包含__init__.py的目录名称的列表。这个变量是可以修改的,用于对包中包含的模块和子包进行搜索。这个功能可以用于扩展包中的模块集。

总结

接下来,我们会来谈谈模块中的标准库知识敬请关注。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396098.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3.x Web MVC实战:实现流缓存的request

上一节《Spring Boot 3.x Filter实战&#xff1a;记录请求日志》实践最后遇到了request对象的流不可重复读的问题&#xff0c;本小节我们将通过流数据缓存以及流的装饰器模式来解决这个问题。如果觉得对你有帮助&#xff0c;记得点赞收藏&#xff0c;关注小卷&#xff0c;后续更…

Linux部署MySQL8.0

目录 一、部署前准备1.1、查看系统版本和位数&#xff08;32位或64位&#xff09;1.2、下载对应安装包 二、开始部署1、将安装包解压并且移动到目标安装目录2、准备MySQL数据和日志等存储文件夹3、准备MySQL配置文件 my.cnf4、创建mysql单独用户组和用户&#xff0c;将安装目录…

<数据集>灭火器识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3262张 标注数量(xml文件个数)&#xff1a;3262 标注数量(txt文件个数)&#xff1a;3262 标注类别数&#xff1a;1 标注类别名称&#xff1a;[extinguisher] 使用标注工具&#xff1a;labelImg 标注规则&#xf…

无人机培训机构推广运营理论技术

一、市场定位与品牌建设 在无人机培训行业的激烈竞争中&#xff0c;精准的市场定位是成功的第一步。首先&#xff0c;需明确目标学员群体&#xff0c;如航拍爱好者、农业植保服务者、应急救援人员或专业无人机操作员等。基于目标群体的需求&#xff0c;构建差异化的品牌形象。…

FlexBV电路查看软件

FlexBV - Macbook, iPhone, PC/Laptop & Electronics BoardViewer with PDF Cross Referencing 免费。 支持tvw&#xff0c;cad格式。 支持Windows,Linux,Mac。 而且我发现cad格式是文本的&#xff01;意味着可以自由编辑&#xff01;

git拉取代码出现“remote: The project you were looking for could not be found.”错误分析

git拉取代码出现“remote: The project you were looking for could not be found.”错误分析 如果输入的远程地址正确&#xff0c;那么极大可能是用户未登录或多个用户登录无法正确获取你想要的用户&#xff0c;如下图所示&#xff0c; 由于之前有同事在我电脑登录git账号&a…

leetcode 103.二叉树的锯齿形层序遍历

1.题目要求: 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。2.做题思路:由题我们可以判断&#xff0c;树中每到偶数…

spring过滤器和拦截器的区别

1出身不同。 过滤器来自servlet&#xff0c;拦截器来自spring框架。 2触发时机 不同请求的执行顺序是&#xff1a;请求进入容器 > 进入过滤器 > 进入 Servlet > 进入拦截器 > 执行控制器 过滤器先执行&#xff0c;会在servlet请求之前和相应之后进行处理。 拦…

写一个Vue2和vue3的自定义指令(以复制指定作为示例)

文章目录 一、自定义指令是什么&#xff1f;二、自定义指令有啥用&#xff1f;三、自定义指令怎么用&#xff1f;1.自定义指令的参数2.自定义指令的钩子函数&#xff08;1&#xff09;五个钩子函数的说明&#xff08;2&#xff09;钩子函数的参数(主要参数&#xff1a;el和valu…

【活动预告】研讨会+开源集市,IoTDB “登录” GOTC 2024!

由开源中国与上海浦东软件园联合举办的 GOTC 2024 即将开幕&#xff01;本次大会结合 “GOTC&#xff08;全球开源技术峰会&#xff09;” 与 “GOGC&#xff08;全球开源极客嘉年华&#xff09;”&#xff0c;将集结全球范围内对开源技术充满热情的开发者、社区成员、创业者、…

Oracle是如何保证数据不丢的

上一篇文章给大家梳理了一条更新语句在Oracle数据库中是如何执行的&#xff0c;我们也提到只要更新记录成功写入到在线重做日志文件&#xff0c;Oracle就能保证数据不会丢失。同时也向大家解释了&#xff0c;其实这个时候数据并没有写入到数据文件&#xff0c;因此这个时候仍然…

为什么不用postman做自动化

面试的时候被问到&#xff1a;为什么不用postman做自动化 打开postman&#xff0c;看到用例集管理、API 管理、环境管理这三个功能&#xff0c;用户体验感算得上品牌等级了 为什么不用呢&#xff0c;文心一言给了一些答案 不适合大规模自动化测试&#xff1a;Postman 主要是为…

React 后台管理项目 入门项目 简洁清晰保姆级内容讲解

序章 React Hook的后台管理项目&#xff0c;从0到1搭建&#xff0c;内容非常丰富涵盖项目搭建、路由配置、用户鉴权、首页报表、用户列表、前后端联调等功能&#xff0c;推荐指数&#xff1a;5颗星&#xff01; 视频学习链接: React 通用后台管理-零基础从0到1详细的入门保姆…

数据结构(5.5_3)——并查集的进一步优化

Find操作的优化(压缩路径) 压缩路径——Find操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点下 代码&#xff1a; //Find "查"操作优化&#xff0c;先找到根节点&#xff0c;再进行"路径压缩" int Find(int S[], int x) {…

50 mysql 的 “where 1 = 1“ 的优化处理

前言 问题是来自于 chinaunix 问题 ”mysql查询后面加 where 1 1 影响效率吗?” mysql 中在 java 代码中我们经常会使用到 ”where 1 1 and username ‘jerry’ ” 之类的条件 然后 我们这里 来看一下 “where 1 1” 的相关处理 where 条件在 select_lex, QUP_shared…

LeetCode面试150——14最长公共前缀

题目难度&#xff1a;简单 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 横向扫描 3.2 纵向扫描 3.3 分治 3.4 二分查找 参考文献 1 题目描述 编写一个函数来查找字符串数组中的最长…

【面试题】设计模式-责任链模式

设计模式-责任链模式 前言责任链简历案例代码小结 前言 我们知道&#xff0c;设计模式是面试时经常被问到的问题之一&#xff0c;这是因为设计模式能够体现出代码设计的美感&#xff0c;且在很多框架的底层也都会使用到各种设计模式&#xff0c;所以对设计模式的考察&#xff…

用Manim创建条形图【BarChart】

BarChart是Manim库中用于创建条形图的函数。它允许用户通过一组值创建一个条形图&#xff0c;其参数可以调整条形的外观和布局。 BarChart(values, bar_namesNone, y_rangeNone, x_lengthNone, y_lengthNone, bar_colors[#003f5c, #58508d, #bc5090, #ff6361, #ffa600],bar_w…

js第四天-函数

例1&#xff1a;选出最大值&#xff1a; <script>function getmax(x, y) {return x > y ? x : y}let max getmax(1, 3)</script> 例2&#xff1a;返回数组的最大值 <script>function getArrValue(arr []) {let max arr[0]for (let i 1; i < arr.…

基于Hadoop的共享单车分布式存储与计算

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景研究目的和意义国内外研究现状总体研究思路数据可视化每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 共享单车的普及带…