Python模块和包全解析,一篇文章就够!

目录

1. 创建模块

2. 导入模块

3. 使用模块中的函数和变量

4. 什么是包?

5. 导入包和模块

5.1 相对导入(Relative Import)

5.2 绝对导入(Absolute Import)

6. 使用包中的模块

7. 包的初始化和清理

8. 常见的第三方包管理工具

pip

virtualenv 和 venv

9. 常见的 Python 包

10. 如何发布自己的包

总结


前面的所有文章中,我们都是用python 解释器来编程,也就是说,我们关闭编辑器,再次进入,什么都没有,包括变量,和许多方法。这时,你就想,该如何保存这些变量和方法呢?

所以,今天我们来学习,解决上面问题的方法,使用模块。

当谈到Python的模块和包时,许多人可能会感到头疼。模块(Module)是Python中组织代码的基本方式。它允许你将代码分割成可重用的单元。一个模块可以包含函数、类和变量的定义,以及可执行的代码。模块使得代码更具可读性和维护性,同时也方便了代码的重用。这一点和函数很像,但是确包含了函数。下面认真来看看:

1. 创建模块

要创建 Python 模块,只需要以下三步:

  1. 创建一个新的 .py 文件。
  2. 在文件中编写代码。
  3. 将文件保存为 .py 文件。

例如,创建一个名为 my_module.py 的模块,并包含以下代码:

def say_hello():print("Hello, world!")

保存文件后,使用 import 语句导入模块:

import my_modulemy_module.say_hello()

输出:

Hello, world!

2. 导入模块

前面简单学习了模块的创建,现在,要使用模块中的函数和变量,你需要先将模块导入到你的代码中。在Python中,有几种导入模块的方式:

  1. 使用 import 语句导入整个模块:
import 模块名 


这样你就可以使用模块中的函数和变量:

import math
print(math.sqrt(16))  # 输出 4.0

2. 使用 from ... import 语句导入模块中的特定函数、类或变量:

from 模块名 import 函数名, 类名, 变量名

直接使用导入的函数、类或变量,而不需要通过模块名来访问:

from math import sqrt
print(sqrt(16))  # 输出 4.0

3. 使用 as 关键字给模块或导入的内容起一个别名:

import 模块名 as 别名
from 模块名 import 函数名 as 别名, 类名 as 别名

简化模块名或导入内容的使用:

import math as m
print(m.sqrt(16))  # 输出 4.0from math import sqrt as square_root
print(square_root(16))  # 输出 4.0

3. 使用模块中的函数和变量

导入模块后,就可以使用其中定义的函数和变量了。如果是导入整个模块,可以通过 模块名.函数名 或 模块名.变量名 的方式使用。如果是使用 from ... import 导入的特定内容,直接使用函数、类或变量名即可。

常见的,我们导入了 math 模块后:

import math# 使用模块中的函数
print(math.sqrt(16))  # 输出 4.0# 使用模块中的常量
print(math.pi)  # 输出 3.141592653589793

如果使用了 from ... import 导入:

from math import sqrt, pi# 直接使用导入的函数和变量
print(sqrt(16))  # 输出 4.0
print(pi)  # 输出 3.141592653589793

这样,你就可以利用模块的功能,避免重复编写代码,相信我,这样你一定能提高代码的可维护性和可读性。

4. 什么是包?

包(Package)是一种用于组织 Python 模块的层级结构。允许你将相关的模块组织在一起,以便更好地管理和维护代码。包的本质上是一个包含了一个或多个模块的文件夹,其中还包含一个特殊的文件 __init__.py(双下划线开头和结尾)。

假设你想创建一个名为 my_package 的包,你的文件系统目录结构可能如下:

my_package/__init__.pymodule1.pymodule2.pysubpackage/__init__.pysubmodule1.pysubmodule2.py

其中:

  • my_package 是包的根文件夹。
  • __init__.py 是一个空文件,它告诉 Python 解释器这是一个包。
  • module1.pymodule2.py 等是包中的模块文件。
  • subpackage 是一个子包,也是一个包含 __init__.py 的文件夹。
  • submodule1.pysubmodule2.py 等是 subpackage 中的模块文件。

5. 导入包和模块

使用点号(.)来表示包的层级关系。如果你想导入包中的模块:

import my_package.module1
import my_package.subpackage.submodule1

导入的模块起个别名,也可以用as:

import my_package.module1 as m1
import my_package.subpackage.submodule1 as sm1

使用 from ... import 来导入模块中的函数、类或变量:

from my_package.module1 import some_function
from my_package.subpackage.submodule1 import MyClass

5.1 相对导入(Relative Import)

相对导入是相对于当前模块的路径来导入其他模块。它使用点号 . 来表示相对路径。

假设你有一个包 my_package,包含以下文件结构:

my_package/__init__.pymodule1.pymodule2.pysubpackage/__init__.pysubmodule1.py

如果在 subpackage/submodule1.py 中想导入 module1.py,可以使用相对导入:

from . import module1

这告诉 Python 从当前模块所在的位置开始查找 module1.py

5.2 绝对导入(Absolute Import)

绝对导入是从包的最顶层开始指定完整路径导入模块。你需要明确指定完整的包路径。

如果你在 subpackage/submodule1.py 中想导入 module1.py,可以使用绝对导入:

from my_package import module1

6. 使用包中的模块

如果你导入了包或者包中的模块,就可以使用这些模块中的函数、类和变量了。使用方法与导入普通模块一样。

# 在 module1.py 中定义了一个函数 hello()
# module1.py
def hello():print("Hello from module1")

保存module1.py,然后在另一个文件中导入并调用这个函数:

import my_package.module1my_package.module1.hello()  # 输出:Hello from module1

或者使用 from ... import 语句:

from my_package.module1 import hellohello()  # 输出:Hello from module1

是不是很简单就使用包,同时还使用了模块!

7. 包的初始化和清理

前面有提到:__init__.py。在 Python 中,__init__.py 文件在包的结构中具有特殊的作用。当 Python 导入一个包时,它会自动执行包中的 __init__.py 文件。这个文件可以包含包的初始化代码,以及定义包的公开接口(可供外部使用的模块、函数、类等)。

包的初始化:__init__.py 可以用于在包被导入时执行一些初始化工作。这可能包括设置包级别的变量、加载子模块或子包,或执行其他初始化操作。比如说,在导入包时加载一些资源或配置信息。

定义包的公开接口:另一个常见的用法是通过 __init__.py 定义包的公开接口,即定义哪些模块、函数、类是包的外部接口,可以被其他模块导入和使用。

在 __init__.py 中,你可以使用特殊的变量 __all__ 来明确指定包的公开接口。这个变量是一个包含字符串的列表,指定了哪些模块应该在使用 from package import * 时被导入。

下面简单演示:

假设你的包 my_package 的结构如下:

my_package/__init__.pymodule1.pymodule2.py

在 __init__.py 中定义 __all__ 变量可以限制导入的模块。假设你只想导出 module1,可以这样做:

# my_package/__init__.py
__all__ = ['module1']

现在,当你在其他地方使用 from my_package import * 时,只有 module1 会被导入:

from my_package import *module1.some_function()  # 可以调用
module2.some_function()  # 会引发 AttributeError

这种方式可以让你更精确地控制包的公开接口,避免不必要的模块被导入。

8. 常见的第三方包管理工具

在 Python 中,有几个常见的第三方包管理工具,让你可以更方便地管理和安装 Python 包。

pip

pip 是 Python 的包管理工具,它允许你从 PyPI(Python Package Index)安装和管理包。

一些常用的 pip 命令包括:

  • 安装包:pip install package_name
  • 升级包:pip install --upgrade package_name
  • 卸载包:pip uninstall package_name
  • 查看安装的包:pip list

virtualenv 和 venv

virtualenv 和 Python 3.3+ 中内置的 venv 是用于创建和管理独立 Python 环境的工具。它们允许你在同一台计算机上拥有多个独立的 Python 环境,每个环境可以有自己的包和依赖。

一些常用的 venv 命令包括:

  • 创建虚拟环境:python3 -m venv myenv
  • 激活虚拟环境(Linux/Mac):source myenv/bin/activate
  • 激活虚拟环境(Windows):myenv\Scripts\activate

9. 常见的 Python 包

Python 生态系统中有许多优秀的第三方包,用于各种不同的用途。以下是一些常见的 Python 包:

  • NumPy:用于科学计算的基础包,提供了高性能的多维数组对象和用于处理这些数组的工具。
  • Pandas:提供了数据分析和处理功能,包括高级数据结构和用于快速分析数据的工具。
  • Matplotlib:用于创建图表和可视化数据的绘图库。
  • Requests:用于处理 HTTP 请求的简单、优雅的库。
  • Scikit-learn:提供了简单而有效的工具用于数据挖掘和数据分析。
  • Django 和 Flask:Web 开发框架,用于构建 Web 应用程序。

10. 如何发布自己的包

如果你编写了自己的 Python 包,并希望与其他人分享,你可以将它发布到 PyPI(Python Package Index)。以下是发布自己的包的基本步骤:

  1. 编写 setup.py 文件setup.py 是一个描述包元数据的 Python 脚本。它包括包的名称、版本、作者、依赖项等信息。
    一个简单的 setup.py 文件示例:
from setuptools import setup, find_packagessetup(name='your_package_name',version='0.1',packages=find_packages(),install_requires=['dependency1','dependency2',],author='Your Name',author_email='you@example.com',description='A short description of your package',url='https://github.com/you/your_package',
)

构建包:在包含 setup.py 文件的目录下运行命令:

python setup.py sdist bdist_wheel

注册 PyPI 账户:在 PyPI 上注册一个账户(https://pypi.org/account/register/)。

上传包:使用 twine 工具上传包到 PyPI。确保已安装 twine

pip install twine

然后运行命令:

twine upload dist/*

输入 PyPI 账户信息后,twine 将会上传你的包到 PyPI。

现在,其他人就可以通过 pip install your_package_name 来安装你的包了。当然,请确保在发布前仔细测试和验证你的包,做一个合格的coder。

虽然我们简单的讲了Python的模块和包,然后我们还简单交大家发布一个自己的包,但是,掌握这些内容,值得我们花时间去深入理解和应用。

总结

我们下一篇文章将开始Python高阶特性的讲解,继续学习、记录python的下一个知识点。

如果感觉阅读对您还有些作用,可以评论留言,关注我。谢谢您的阅读!

 往期学习:

Python安装教程(版本3.8.10)windows10

Linux系统:安装Conda(miniconda)

Conda快速安装的解决方法(Mamba安装)

VSCode安装教程(版本:1.87.0)Windows10

Python基础语法:从入门到精通的必备指南

Python的基本数据类型

Python数据类型间的转换(隐式、显式)-CSDN博客

Python基础知识:运算符详解-CSDN博客

Python基础知识:数字类型及数学函数详解-CSDN博客

Python字符串操作及方法详解!一篇就搞定!-CSDN博客

Python列表及其操作详解,从此不再迷茫!-CSDN博客

Python元组(Tuple)深度解析!

Python字典的使用技巧(一篇详解)

Python条件控制深度解析,成为编程必备

Python循环语句全解析(附实战演练)

Python函数高效编程技巧,提升你的代码效率!

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

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

相关文章

代码随想录算法训练营第二十三天 | 77. 组合

回溯 77. 组合 题目链接&#xff1a;https://leetcode.cn/problems/combinations/ 文章讲解&#xff1a;https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ti4y1L7cv/ class Solution { private:vector<…

打卡学习kubernetes——了解五种控制器类型

目录 1 Deployment控制器 2 StatefulSet控制器 3 DaemonSet控制器 4 Job控制器 5 CronJob控制器 1 Deployment控制器 Deployment为Pod和Replica Set&#xff08;下一代Replication Controller&#xff09;提供声明式更新。 Deployment运行无状态应用&#xff0c;一般情况…

圈子社交系统-多人语音-交友-陪玩-活动报名-商城-二手论坛-源码交付,支持二开!

圈子小程序适用于多种场景&#xff0c;涵盖了各个领域的社交需求。以下是一些常见的适用场景&#xff1a; 兴趣社区&#xff1a; 用户可以加入自己感兴趣的圈子&#xff0c;与志同道合的人一起讨论交流&#xff0c;分享经验和知识。 行业交流&#xff1a; 各个行业可以建立自…

五、自然语言的学习之路

NLP学习笔记系列&#xff0c;欢迎收藏交流&#xff1a; 零、自然语言处理开篇-CSDN博客 一、NLP中的文本分类-CSDN博客 二、NLP中的序列标注&#xff08;分词、主体识别&#xff09;-CSDN博客 三、NLP中的句子关系判断-CSDN博客 四、自然语言中的生成式任务-CSDN博客 0、算…

反射整理学习

目录 1、反射介绍 2、反射API 2.1 获取类对应的字节码的对象&#xff08;三种&#xff09; 2.2 常用方法 3、反射的应用 3.1 创建 : 测试物料类 3.2 获取类对象 3.3 获取成员变量 3.4 通过字节码对象获取类的成员方法 3.5 通过字节码对象获取类的构造方法 4、创建对象…

突发想法2:浏览器的缓存有什么作用?为什么有了缓存,一开始较快,缓存多了打开某些网站会变慢?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、问题二、解决1、为什么第一次打开时那么慢&#xff…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

由世界第一个AI软件工程师Devin引发的热潮背后----程序员到底会不会被代替?AI发展至如今是否初衷已变?

目录 一.Devin的登场是突破也是导火索 二.Devin的"逆天"能力 1、端到端构建和部署程序 2、自主查找并修复bug 3、训练和微调自己的AI模型 4、修复开源库 5、成熟的生产库也能做贡献 6、学习能力 三.Devin的出现甚至整个AI领域的进步,编程还有未来吗? 1.业…

接上一篇:分布式调用链追踪系统设计

所以必须得记录父子关系&#xff1a; A---->B 是 B---->C 的父调用 A---->D 是 D---->E 的父调用 A---->D 还是 D---->F 的父调用 如何记录呢&#xff1f;需要给每个调用分配一个ID (称为 SpanID)&#xff0c;并且把这个 ID 传递给子调用&#xff0c; 子…

c++ 常用函数 集锦 整理中

c 常用函数集锦 目录 1、string和wstring之间转换 1、string和wstring之间转换 std::string convertWStringToString(std::wstring wstr) {std::string str;if (!wstr.empty()){std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;str converter.to_b…

对文本数据进行关键词提取,可以采用哪些算法?具体实现流程是什么样的?

The question 1: 对文本数据进行关键词提取&#xff0c;可以采用哪些算法&#xff1f;具体实现流程是什么样的&#xff1f; 一、常见的关键词提取算法&#xff1a; TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;: TF-IDF是一种统计方法&#xf…

mysql日志分析工具

我们使用命令去查看慢sql是一个比较麻烦的过程&#xff0c;这个时候&#xff0c;我们就用到了mysql日志分析工具mysqldumpslow使用当前命令时确保开启了慢sql日志 点击 简单使用 通过mysqldumpslow --help来查询命令的使用方法 mysqldumpslow 是一个用于分析慢查询日志的工具…

什么是多路复用

多路复用是一种技术&#xff0c;允许多个输入或输出流共享一个单一的通信信道或计算资源。通过多路复用&#xff0c;多个数据流可以同时在同一个通道上传输&#xff0c;提高了通信效率和资源利用率。 在计算机网络中&#xff0c;多路复用常用于实现同时传输多个数据流&#xf…

人工智能入门之旅:从基础知识到实战应用(六)

一、人工智能学习之路总结 人工智能学习的关键点与挑战可以总结如下: 关键点: 理论基础: 理解机器学习、深度学习等人工智能的基本原理和算法是学习的基础,包括线性代数、概率统计、微积分等数学知识,以及神经网络、卷积神经网络、循环神经网络等模型的原理。 实践项目:…

mac切换本地node版本

1.首先安装n模块&#xff1a; sudo npm install -g n2.升级node.js到最新稳定版 // 升级到最新版本 sudo n latest// 升级到稳定版本 sudo n stable// 升级到具体版本号 sudo n xx.xx// 最新稳定版本 sudo n lts3.切换使用版本 sudo n 7.10.04.删除指定版本 sudo n rm 7.10.05.…

2024.3.14

成员函数版本实现算术运算符的重载 全局函数版本实现算术运算符的重载 #include <iostream> using namespace std; class Number//定义一个数字类 {//因为a和b是私有成员&#xff0c;全局进行访问需要要friend进行声明friend const Number operator*(const Number &…

软件设计师16--段页式存储

软件设计师16--段页式存储 考点1&#xff1a;页式存储存储管理 - 页式存储组织存储管理 - 页面置换算法例题&#xff1a; 考点2&#xff1a;段式存储存储管理 - 段式存储组织例题&#xff1a; 考点1&#xff1a;页式存储 存储管理 - 页式存储组织 页式存储&#xff1a;将程序…

NLP:HanLP的下载与使用

昨天说到要做一个自定义的训练模型&#xff0c;但是很快这个想法就被扑灭了&#xff0c;因为这个手工标记的成本太大&#xff0c;而且我的上级并不是想要我做这个场景&#xff0c;而是希望我通过这个场景展示出可以接下最终需求的能力。换句话来说&#xff1a;可以&#xff0c;…

基于FPGA的HyperRam接口设计与实现

一 HyperRAM 针对一些低功耗、低带宽应用&#xff08;物联网、消费产品、汽车和工业应用等&#xff09;&#xff0c;涉及到外部存储&#xff0c;HyperRAM提供了更简洁的内存解决方案。 HyperRAM具有以下特性&#xff1a; 1、超低功耗&#xff1a;200MHz工作频率下读写不到50mW…

[已解决]安装CUDA失败报错(附万能解决办法)

[已解决]安装CUDA失败报错(附万能解决办法) &#xff08;Tips&#xff1a;赶时间直接看万能法2&#xff09; 经过长时间的尝试和研究&#xff0c;我终于解决了安装CUDA失败报错的问题。在这里&#xff0c;我将记录下我遇到的问题以及解决办法&#xff0c;希望对其他小白们有所帮…