python 模块和包

2023-11-08

在这里插入图片描述

前言

Python是一种简单易学、功能强大的编程语言,而其模块和包的概念更是为我们提供了一种有效管理和组织代码的方式。模块是Python程序的基本组成单元,它是一个包含函数、变量和类的文件。而包则是由多个模块组成的一个目录,可以帮助我们更好地组织和复用代码。

在本系列的文章中,我们将从基础知识开始,逐步介绍Python模块和包的概念、语法和使用方法。

模块

什么是模块

在Python中,模块是一种组织和复用代码的方式。它是一个包含函数、变量和类的文件,以 .py 为文件扩展名。模块可以被其他程序导入和使用,以提供特定功能或实现特定任务。

Python模块使代码更易于管理和组织,同时也促进了代码的可重用性。通过将相关的功能放入不同的模块中,可以使代码更具可读性和可维护性。此外,模块还可以帮助开发人员对功能进行封装,以便在不同的项目中共享和复用代码。

导入模块

在 python 中,有以下的方式来导入模块:

  • import 模块名
  • from 模块名 import 功能名
  • from 模块名 import *
  • import 模块名 as 别名
  • from 模块名 import 功能名 as 别名

import 导入模块

前面我们也见过,当我们生成随机数的时候需要导入 random 模块,那么在 python 中可以使用 import 模块名 来导入模块。

当我们以 import 模块名 的形式导入模块的时候,使用 模块名.功能 来使用模块中的方法。

import random  # 导入random模块

result = random.randint(1,10)  # 生成1-9之间的随机数
print(result)

使用 import 模块名 也可以导入多个模块,但是不推荐 import 模块1,模块2...

from 模块名 import 功能

我们使用 import 模块名 导入的是该模块下的所有代码,我们也可以只导入该模块下的指定方法,并且我们调用方法的时候可以直接使用方法,而不需要加模块名。

from random import randint  # 导入random模块下的randint方法

result = randint(1,10)
print(result)

from 模块名 import *

from 模块名 import 功能from 模块名 import * 是相似的,只是前面一种导入方法,导入的是指定的功能,而后面一种方法导入的是该模块下的所有方法,两种导入方法调用功能的时候都只需使用功能() ,而不需要加上 模块名.功能。

from math import *

print(sqrt(9))  # 3.0
print(pow(3,2))  # 9.0

as定义别名

如果我们觉得模块名或者方法名太长写的时候太麻烦的时候,我们可以使用别名。
import 模块名 as 别名 来别名模块名,from 模块名 import 功能 as 别名 别名功能名。

import time as t
t.sleep(2)  # 程序会停止两秒再结束
from time import sleep as slp
slp(2)

当我们使用别名之后,之前的名字不能再继续使用,否则会报错

from time import sleep as slp
sleep(2)

在这里插入图片描述

制作模块

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则。

我们创建一个 python 文件,并且在该文件中定义一个 add_num 方法。

在这里插入图片描述

我们可以对该模块内的 add_num 方法进行测试,看方法是否能实现指定功能。

def add_num(a,b):
    return a + b

print(add_num(1,2))  # 3

每实现一个模块中的方法,我们就需要进行测试,那么当我们测试完成之后,需不需要将测试代码给删除呢?如果不删除会有什么影响呢?

我们在 Test文件中导入该模块并使用该模块下的方法。
在这里插入图片描述
在这里插入图片描述

这里 3 很显然是我们测试代码里面的测试结果,import 模块名 会将该模块下的所有代码都导入,但是我们删除了测试代码的话,下次再测试又需要重新写,那我们该怎么做既能实现测试功能,又不影响其他功能呢?

使用 if __ name __ == '__ main __': 作为条件,来使该代码只会在该模块下执行,出来该模块所在的文件就不会执行测试代码。

__ name __ 是系统变量,是模块的标识符,值是:如果是自身模块,值是__ main __,否则是模块所在的文件名

我们在模块所在文件打印 __ name __。
在这里插入图片描述
在这里插入图片描述

然后在导入该模块的文件下运行代码。
在这里插入图片描述
在这里插入图片描述

我们在模块所在文件加上对应条件并执行代码。

def add_num(a,b):
    return a + b

if __name__ == '__main__':
    print(add_num(1,2))  # 3

然后在导入该模块的文件下调用该模块的对应方法。

import my_module1
print(my_module1.add_num(3,5))

在这里插入图片描述
在这里插入图片描述
这里并不会执行我们的测试代码,这样就解决了我们的问题。

注意:如果使用 from .. import ..from .. import * 导入多个模块的时候,且模块内有同名功能。当调用这个同名功能的时候,调用到的是后面导入的模块的功能。

from my_module1 import add_num
print(add_num(-3,5))  # 2

def add_num(a,b):
    return abs(a) + abs(b)
from my_module1 import add_num

def add_num(a,b):
    return abs(a) + abs(b)
print(add_num(-3,5))  # 8

模块的定位顺序

当导入一个模块,Python解析器对模块位置的搜索顺序是:

  1. 当前文件所在的目录下的所有文件
  2. 如果不在当前目录,python 则搜索在shell变量pythonpath下的每个目录
  3. 如果前面两个路径都找不到,python会查看默认路径

注意:

  • 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
  • 使用 from 模块名 import 功能 的时候,如果功能名字重复,调用到的是最后定义或导入的功能。

__ all __

但我们使用 from 模块名 import * 导入模块的时候,我们可以指定导入的方法,而不是全部方法,我们只需要在模块中定义 __ all __ = ['方法1',‘方法2'] ,这样就只会导入 __ all __ 中的方法。

__all__ = ['add_num']
def add_num(a,b):
    return a + b

if __name__ == '__main__':
    print(add_num(1,2))

def sub(a,b):
    return a - b

在这里插入图片描述

from my_module1 import *
print(sub(1,2))

在这里插入图片描述

这里会直接提示错误。
在这里插入图片描述

Python包是一种用于组织和管理Python代码的方式。它是一个包含模块、子包和资源文件的目录,可以在Python程序中被导入和使用。包的主要目的是将相关的功能和数据组织到一个单独的单元中,以便于重用和维护。

一个包通常包含一个名为 __init__.py 的特殊文件,用于标识该目录为一个包。它可以包含其他Python模块文件(以.py为扩展名)和子包(也是一个包的目录)。

在pycharm上如何创建包

在这里插入图片描述

当我们创建完成一个包之后,我们会发现该包下会自动产生一个 __ init __.py 的文件。

在这里插入图片描述

导入包

我们首先需要在包下创建几个模块文件。

add_num.py

def add_num(a,b):
    return a + b

sub_num.py

def sub_num(a,b):
    return a - b

导入包有两种方式:

  • import 包名.模块
  • from 包名 import *

import 包名.模块 导入包

当我们使用 import 包名.模块 导入包的时候,我们以 包名.模块名.功能 来使用相关功能。

import mypackage.add_num
import mypackage.sub_num
print(mypackage.add_num.add_num(10,20))  # 30
print(mypackage.sub_num.sub_num(50,20))  # 30

from 包名 import * 导入包

当我们使用 from 包名 import * 导入包的时候,我们需要在 __ init __.py 文件中添加 __ all __ = [ ] 来设置允许导入的模块列表。

__all__ = ['add_num','sub_num']

使用 模块名.功能 的方法来使用相应的功能。

from mypackage import *
print(add_num.add_num(10,20))  # 30
print(sub_num.sub_num(50,20))  # 30

如果我们将 __ init __ 文件中的 __ all __ = [ ] 给删除或者注释掉的话,会出现什么情况乱。
在这里插入图片描述
在这里插入图片描述
所以但我们使用 from 包名 import * 导入包的时候一定要记得设置 __ init __ 文件里的 __ all __ = [ ] 来设置允许导入的模块列表。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 模块和包 的相关文章

随机推荐

  • LRU算法java实现

    1 lru简介 LRU是Least Recently Used的缩写 即最近最少使用 常用于页面置换算法 是为虚拟页式存储管理服务的 即当一个数据最近一段时间没有被访问 未来被访问的概率也很小 当空间被占满后 最先淘汰最近最少使用的数据 2
  • Android动态来改变App桌面图标

    时不时的我们就会发现 一些我们常见的应用 比如某宝 某东 在一些特殊的日子中 比如双十一 元旦 为了迎合这样一个日子的气氛 在桌面的应用图标就会发生改变 其实对于这样的一个桌面图标更换 Android中为我们提供了AndroidManife
  • spring data jpa 关联查询返回自定义对象

    Override public List
  • Linux性能检测常用的10个基本命令

    1 uptime 该命令可以大致的看出计算机的整体负载情况 load average后的数字分别表示计算机在1min 5min 15min内的平均负载 2 dmesg tail 打印内核环形缓存区中的内容 可以用来查看一些错误 上面的例子中
  • vue3组件库搭建并且发布到npm保姆教程连载一

    前言 小时候的梦想是拥有一个自己的组件库 开玩笑哈 接触前端后 很多时候在npm install的时候 我在想我们安装的这些依赖发布者是如何将依赖发布到npm 并且可以让别人使用的 未知是让人害怕的 经过一系列学习和探索后 我也拥有了自己的
  • 【python数据挖掘课程】二十六.基于SnowNLP的豆瓣评论情感分析

    这是 Python数据挖掘课程 系列文章 前面很多文章都讲解了分类 聚类算法 而这篇文章主要讲解如何调用SnowNLP库实现情感分析 处理的对象是豆瓣 肖申克救赎 的评论文本 文章比较基础 希望对你有所帮助 提供些思路 也是自己教学的内容
  • 全国青少年电子信息智能创新大赛(决赛)python·模拟三卷,含答案解析

    全国青少年电子信息智能创新大赛 决赛 python 模拟三卷 一 程序题 第一题 描述 现有 n 个人依次围成一圈玩游戏 从第 1 个人开始报数 数到第 m 个人出局 然 后从出局的下一个人开始报数 数到第 m 个人又出局 如此反复到只剩下
  • Google分布式三篇论文---BigTable

    Google s BigTable 原理 翻译 题记 google 的成功除了一个个出色的创意外 还因为有 Jeff Dean 这样的软件架构天才 官方的 Google Reader blog 中有对BigTable 的解释 这是Googl
  • TensorRT(2):TensorRT的使用流程

    TensorRT系列传送门 不定期更新 深度框架 TensorRT 文章目录 一 在线加载caffe模型 序列化保存到本地 二 反序列化直接加载保存后的trt模型 以caffe分类模型为例 简单介绍TRT的使用流程 这里不涉及量化 就以fp
  • 测试的艺术:代码检查、走查与评审

    软件开发人员通常不会考虑的一种测试形式 人工测试 大多数人都以为 因为程序是为了供机器执行而编写的 那么也该由机器来对程序进行测试 这种想法是有问题的 人工测试方法在暴露错误方面是很有成效的 实际上 大多数的软件项目都应使用到一下的人工测试
  • 详解Shell 脚本中 “$” 符号的多种用法

    通常情况下 在工作中用的最多的有如下几项 1 表示执行脚本传入参数的个数 2 表示执行脚本传入参数的列表 不包括 0 3 表示进程的id Shell本身的PID ProcessID 即脚本运行的当前 进程ID号 4 Shell最后运行的后台
  • 解决uni-toast被弹窗组件遮挡

    在App vue uni toast设置层级比popup高就行 uni toast z index 999999
  • 输入文本就可建模渲染了?!OpenAI祭出120亿参数魔法模型!

    转自 https new qq com omn 20210111 20210111A0CBRD00 html 2021刚刚开启 OpenAI又来放大招了 能写小说 哲学语录的GPT 3已经不足为奇 那就来一个多模态 图像版GPT 3 今天
  • 微信小程序事件和页面跳转

    一 页面跳转 1 非TabBar页面 一个小程序拥有多个页面 我们通过wx navigateTo进入一个新的页面 我们通过下边点击事件实现页面跳转进行代码实现及参考 wx navigateBack 回退到上一个页面 wx redirectT
  • 【单片机毕业设计】【mcuclub-310】红外遥控器

    设计简介 项目名 基于单片机的红外遥控器的设计 标准版 单片机 STC89C52 功能简介 1 利用红外发射电路 通过按不同的按键发送不同的数据值 2 利用红外接收电路 接收发送端发送的数据 3 通过数码管显示数据 资料预览 效果图 发送端
  • MiniGPT-4本地部署的实战方案

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • Ubuntu22下OpenCV4.6.0+contrib模块编译安装

    目录 第一章 Ubuntu22下OpenCV4 6 0 contrib模块编译安装 第二章 ubuntu22下C kdevelop环境搭建 OpenCV示例 第三章 C 下OPENCV驱动调用海康GigE工业相机 文章目录 目录 Ubunt
  • K8S常用资源认识

    文章目录 一 Namespace 二 Pod 三 Label 四 Deployment 五 Service 一 Namespace namespace是kubernetes系统中的一种非常重要的资源 它的主要作用是用来实现多套环境的资源隔离
  • 基于栈与基于寄存器的指令集架构

    用C的语法来写这么一个语句 C代码 a b c 如果把它变成这种形式 add a b c 那看起来就更像机器指令了 对吧 这种就是所谓 三地址指令 3 address instruction 一般形式为 op dest src1 src2
  • python 模块和包

    文章目录 前言 模块 什么是模块 导入模块 import 导入模块 from 模块名 import 功能 from 模块名 import as定义别名 制作模块 模块的定位顺序 all 包 导入包 import 包名 模块 导入包 from