python基础(10)— 模块和包

一、模块(Module)

1、模块介绍

Python 模块是一种用于组织和重用代码的基本单元。模块可以包含函数、类、变量和语句等,并且可以被其他Python程序导入和使用。

以下是关于Python模块的一些常见知识点:

1. 模块(module )可以分为标准库、第三方库和自定义模块。

2. 模块名就是文件名,module 名可由全局变量__name__获取。

3. 使用import语句导入模块,导入模块后,就可以使用模块中定义的函数、变量、类等。

4. dir() 函数可以用于查看模块中定义的所有属性、函数、类和变量等信息。它返回一个由字符串组成的列表,表示模块中的所有有效名称。

5. module 作为脚本执行的时候,__name__会被设置为 "__main__",很常见的一个语句是 if __name__ == "__main__":,作为脚本执行的时候,运行 if 内的语句。

6. 符号表(symbol table),在Python中,每当定义一个模块、函数、类或执行代码块时,都会创建一个对应的符号表

2、导入模块

导入模块顺序:内置模块---->第三方模块------>自定义模块;

导入单个模块:import module1

起别名:import module1 as alias

从某个模块中导入某个函数: from module1 import func1

从某个模块中导入多个函数: from module1 import func1, func2

将某个模块中的全部函数导入: from module1 import *(不推荐使用这种方式,因为这通常会导致代码的可读性很差)

导入多个模块(建议使用方法二导入多个模块):

 方法一:import os,time,sys 每个模块之间用英文逗号隔开。

 方法二:import os

     import time

     import sys

不建议使用方法一来导入多个模块的原因如下:

  1. 可读性差:在一行中导入多个模块会使代码更加密集,可读性较差。特别是当导入的模块较多或者模块名较长时,会导致代码难以阅读和理解。

  2. 难以维护:在使用一行导入多个模块时,当需要添加或删除某个模块时,需要修改一行中的多个模块名称,容易出错。而使用逐个导入的方式,在需要添加或删除模块时,只需要修改相应的import语句,更加直观和方便。

  3. 命名空间冲突:如果多个模块中存在相同名称的函数、类或变量,那么在一行导入多个模块时,可能会导致命名空间的冲突。这将使得代码难以调试和维护。

3、 导入模块失败原因分析和解决方案

Python 导入模块时搜索模块顺序:

1. 内置模块(Built-in modules): Python 自带的标准库模块,无需额外安装即可使用。

2. 系统路径(sys.path): Python 解释器会在 sys.path 列表中定义的路径顺序中搜索模块。sys.path 是一个包含了多个目录路径的列表,默认情况下包括以下内容:
   - 当前脚本文件所在的目录;
   - PYTHONPATH 环境变量中定义的目录;
   - 安装 Python 时默认指定的系统路径。

3. 第三方模块(Third-party modules): 通过 pip 或其他方式安装的第三方模块,这些模块会被安装到系统路径或指定的虚拟环境中,在导入时可以直接引用。

当 Python 导入模块时,在搜索路径中的第一个匹配到的模块将会被加载和执行,后续的同名模块将不再被搜索。

你可以通过以下代码来查看当前 Python 解释器的搜索路径:

import sys

for _ in sys.path:
    print(_)
------------------------------------------------------------------------------
C:\Users\057776\PycharmProjects\python-test\python_module
C:\Users\057776\PycharmProjects\python-test
E:\Programs\Python\Python38\python38.zip
E:\Programs\Python\Python38\DLLs
E:\Programs\Python\Python38\lib
E:\Programs\Python\Python38
C:\Users\057776\AppData\Roaming\Python\Python38\site-packages
E:\Programs\Python\Python38\lib\site-packages

解决方案:

知道原因之后,解决“Python找不到指定模块”的方法有 2 种,分别是:

  • 将模块所在的目录路径添加到 sys.path ;

  • 将模块所在的目录路径添加到 PYTHONPATH 环境变量中。

4、class 和 module 区别

在Python中,模块(Module)和类(Class)是两个不同的概念。

 1. 类(Class)使用class关键字定义,通常包含属性和方法,用于创建对象和定义其行为。你可以通过实例化类来创建该类的对象,然后调用对象的方法或访问对象的属性。类提供了一种组织和抽象代码的方式,可以通过继承和多态来实现代码的重用和扩展。

2. 模块(Module)是一个Python文件,用于组织相关的代码。一个模块可以包含变量、函数、类和其他可执行的Python代码。模块提供了一种将代码组织成逻辑单元的方式,可以将相关功能的代码封装在一个文件中,并通过导入模块来使用其中的代码。

综上所述,类和模块在Python中具有不的作用和角色。类用于创建对象,封装属性方法,实现代码的组织和抽象;而模块用于组织封装一组相关的代码,提供代码复用和逻辑分离的方式。在实际编程中,类和块通常是一起使用的,类可以定义在模块中,模块中的代码可以使用类来实更复杂的功能。

5、标准库

详见:Python 标准库 — Python 3.8.16 文档

Python标准库是Python编程语言自带的一组模块和包,提供了广泛的功能和工具,可用于各种应用开发需求。Python标准库涵盖了多个领域,包括但不限于以下几个分类:

1. 内置函数(Built-in Functions):包含了Python解释器提供的核心函数,如`print()`、`len()`、`range()`等。

2. 内置模块(Built-in Modules):包含了Python解释器内置的一些常用模块,如`math`、`random`、`datetime`等。这些模块提供了数学运算、随机数生成、日期和时间处理等功能。

3. 文件和目录操作(File and Directory Operations):包括模块如`os`、`shutil`,用于文件和目录的操作,如创建、删除、遍历、复制文件和目录等。

4. 数据序列化(Data Serialization):包括模块如`json`、`pickle`,用于将数据对象转换成可存储或传输格式的数据,并可以还原为原始对象。

5. 网络和通信(Networking and Communication):包括模块如`socket`、`http`、`smtp`,用于网络编程、HTTP请求、发送电子邮件等。

6. 多线程和并发(Multithreading and Concurrency):包括模块如`threading`、`concurrent.futures`,用于多线程编程、并发任务调度等。

7. 数据库访问(Database Access):包括模块如`sqlite3`、`mysql.connector`,用于连接和操作数据库。

8. 图形用户界面(GUI):包括模块如`tkinter`、`PyQt`,用于创建图形用户界面应用程序。

9. 测试和调试(Testing and Debugging):包括模块如`unittest`、`pdb`,用于编写单元测试、进行代码调试等。

10. 其他常用模块:还包括其他常用模块如`collections`、`logging`、`re`(正则表达式)、`sys`(系统相关操作)等。

这只是Python标准库中的一部分,还有很多其他模块可供使用。通过使用Python标准库中提供的各种模块和函数,开发者可以更高效地完成各种任务,避免重复造轮子。

6、第三方库模块

详见:PyPI · The Python Package Index

Python拥有一个强大的第三方库生态系统,提供了丰富的开源模块和工具,可用于各种领域的应用开发。以下是一些常用的Python第三方库模块:

1. NumPy:提供高性能的数值计算和数组操作功能。

2. pandas:用于数据处理和分析的强大工具,支持结构化数据的读取、写入和操作。

3. Matplotlib:用于绘制静态、交互式图表和可视化的库。

4. TensorFlow和PyTorch:两个流行的深度学习框架,提供了大规模机器学习和深度神经网络的实现。

5. Scikit-learn:机器学习库,包含了各种经典的机器学习算法和工具。

6. Flask和Django:Web开发框架,用于创建和部署Web应用程序。

7. Requests:简化HTTP请求的库,使得与Web服务的交互更加简便。

8. SQLAlchemy:灵活且强大的ORM(对象关系映射)库,用于数据库访问和操作。

9. BeautifulSoup:解析HTML和XML文档的库,用于网络爬虫和数据提取。

10. Pygame:游戏开发库,用于创建图形化和交互式的游戏应用程序。

11. Celery:分布式任务队列,用于处理异步任务和定时任务。

12. pytest:简单而强大的单元测试框架,用于编写和运行测试。

这只是一小部分Python第三方库模块的例子。开发者可以根据自己的需求在Python Package Index(PyPI)上搜索并安装适合自己项目的第三方库。

7、自定义模块

在Python中,你可以创建自己的模块,以组织和封装可重用的代码。

下面是创建自定义模块的基本步骤:

1. 创建一个新的.py文件,并为其命名为你想要的模块名。例如,如果你希望创建一个名为`my_module.py`的模块,可以在项目目录下创建一个名为`my_module.py`的文件。

2. 在该文件中,编写你的模块代码。可以定义函数、类、变量等等。这些代码将被其他程序导入和使用。

# my_module.py

def greet(name):
    print(f"Hello, {name}!")

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

3. 保存并关闭模块文件。

4. 在其他Python程序中,通过导入你的模块来使用其中的代码。

# main.py

import my_module

my_module.greet("Alice")
result = my_module.add(3, 4)
print(result)

 运行这个主程序,它会输出以下内容:

Hello, Alice!
7

需要注意的是,模块的命名应遵循Python的命名规范,使用小写字母和下划线,避免使用特殊字符和空格。此外,模块文件的扩展名应为`.py`。

8、打包和发布到PyPI

以下是发布Python第三方模块的一般步骤:

1. 确保你的模块具备可用性:在将模块发布之前,确保你的代码已经经过测试,并且能够正常运行。建议编写文档并提供示例代码,以便其他开发者了解如何使用你的模块。

2. 创建setup.py文件:创建一个名为`setup.py`的文件,用于描述你的模块的元数据信息,例如模块名称、版本号、作者、依赖项等。这个文件是打包和发布模块的重要组成部分。

from setuptools import setup

setup(
    name='your_module_name',
    version='1.0.0',
    description='A short description of your module',
    author='Your Name',
    packages=['your_module_directory'],
    install_requires=[
        'dependency1',
        'dependency2',
    ],
)

3. 打包模块:使用命令行工具进入项目根目录,运行如下命令来创建一个源代码发布包。

python setup.py sdist

这将在`dist`目录下生成一个`.tar.gz`的压缩文件,其中包含你的模块源代码。

4. 上传到PyPI:PyPI(Python Package Index)是Python软件包的官方仓库,并且是其他开发者查找和安装第三方模块的主要渠道。你需要在PyPI上注册一个账号,在命令行工具中运行以下命令来上传你的模块。

twine upload dist/*

这将引导你进行登录,并将你的模块发布到PyPI上。

这只是一个基本的指南,供你参考。如果你想更深入了解如何发布Python模块,建议查阅相关的文档和教程,例如Python Packaging User Guide 和 Packaging Python Projects

二、包(Package)

1、包介绍

在Python中,包(Package)是一种用于组织和管理模块的方式。它可以将相关的模块以目录的形式进行组织,并使用特殊的`__init__.py`文件来标识该目录为一个包。

使用包的好处是能够更好地组织和管理代码,使得代码结构更清晰、可扩展性更好。包可以有多层次的嵌套,形成包的层次结构,以适应大型项目的需求。

下面是一个包的示例结构:

my_package/                  # 包的根目录
    __init__.py              # 包的初始化文件
    module1.py               # 模块1
    module2.py               # 模块2
    subpackage/              # 子包
        __init__.py          # 子包的初始化文件
        module3.py           # 子包中的模块
        module4.py           # 子包中的模块

在上述示例中,`my_package`是包的根目录,其中包含了两个模块(`module1.py`和`module2.py`)以及一个子包(`subpackage`)。子包内部又包含了两个模块(`module3.py`和`module4.py`)。

2、导入包

在 Python 中,你可以通过以下方式导入包:

1. 导入整个包:

import package_name

这将导入整个包,并使得你可以使用包中的模块和子包。你可以使用 package_name.module_name 来访问包中的模块,或者使用 package_name.subpackage_name 来访问包中的子包。

2. 导入指定的模块或子包:

from package_name import module_name

这将只导入包中的指定模块,你可以直接使用模块的名称来访问它的功能和变量。

3. 导入指定模块的特定函数或变量:

from package_name.module_name import function_name, variable_name

这将只导入指定模块中的具体函数或变量,你可以直接使用它们而无需加上模块名作为前缀。

4. 重命名导入的模块或函数:

import package_name.module_name as alias_name

# 或者
from package_name import module_name as alias_name

这将把导入的模块或函数重命名为指定的别名,以便更方便地使用。

需要注意的是,当一个模块被导入时,Python 会执行该模块中的代码。如果你只想导入模块而不执行其中的代码,可以将相应的代码放在 `if __name__ == '__main__':` 条件下。

3、__init__.py 文件

`__init__.py` 文件是一个用于标识 Python 包的特殊文件。它通常位于包的顶层目录中,并且这个文件是一个空文件(也可以包含一些初始化代码)。

`__init__.py` 文件的作用可以总结如下:

1. 声明包:通过在包目录中添加 `__init__.py` 文件来声明这个目录为一个包。

2. 初始化操作:可以在 `__init__.py` 文件中执行一些初始化操作,例如设置全局变量、导入模块、配置环境等。

3. 控制包的导入行为:`__init__.py` 文件可以控制包在被导入时的行为。你可以在该文件中定义 `__all__` 变量来指定包的公开接口,限制其他模块可以直接导入的内容。

4. 支持相对导入:`__init__.py` 文件还可以支持相对导入,让你可以在包内部使用相对路径来导入其他模块或子包。

当你使用 `import` 或者 `from ... import` 语句导入一个包时,Python 解释器会自动执行该包下的 `__init__.py` 文件,以便进行初始化和设置。

需要注意的是,在旧版本的 Python 中,`__init__.py` 文件是必需的,用于将一个包中的多个模块组织在一起,并帮助 Python 解释器识别该目录为一个包。但是从 Python 3.3 开始,引入了隐式命名空间包 (Implicit Namespace Packages) 的概念,在某些情况下可以省略 `__init__.py` 文件。这样将使用隐式命名空间包的机制,使得包目录变成一个无需显式声明的命名空间。

4、隐式命名空间包 (Implicit Namespace Packages) 的概念

隐式命名空间包(Implicit Namespace Packages)是从 Python 3.3 版本开始引入的一种机制,用于创建无需显式声明的命名空间。与传统的显式命名空间包不同,隐式命名空间包不需要在包目录中添加 `__init__.py` 文件。

在传统的显式命名空间包中,包目录中必须包含一个名为 `__init__.py` 的文件来标识它是一个包。这样的要求导致了一些限制和不便,特别是在将多个代码库组织在一起时,需要在每个子目录中添加空的 `__init__.py` 文件。

而隐式命名空间包的概念允许开发者创建只包含模块文件而无需 `__init__.py` 文件的包目录。当 Python 解释器遇到这样的目录时,会将其自动视为命名空间包,可以动态地将其内容合并为一个虚拟包。

具体来说,当解释器遇到一个目录,其中没有 `__init__.py` 或 `__init__.pyc` 文件时,它将被视为隐式命名空间包。在导入该命名空间包下的模块时,解释器会搜索所有与包名相符的目录,并将找到的所有模块合并在一起形成一个虚拟的包。

这种机制使得多个代码库或模块可以自由地组织在一起,无需显式声明包。这对于将第三方库与应用程序分开存放、实现插件机制等情况非常有用。

需要注意的是,隐式命名空间包的目录结构不能包含重复的包名,否则会导致冲突。另外,在使用隐式命名空间包时,仍然需要遵循合理的命名规范和包管理原则。

总之,隐式命名空间包提供了一种更加灵活和简洁的方式来组织 Python 代码,并使得不同的代码库可以无缝地合并在一起,提供更好的模块化和可扩展性。

5、Python中包和文件夹

在 Python 中,包(Package)和文件夹(Folder)是两个相关但不完全相同的概念。

包(Package):

  • 包是一种组织和管理 Python 模块的机制。
  • 包是一个特殊的目录,其中包含了一个或多个模块文件以及一个可选的 `__init__.py` 文件。
  • `__init__.py` 文件用于标识该目录为一个包,并可用于执行初始化操作。
  • 包可以有多级结构,即包内可以再嵌套其他子包。
  • 包名通常采用全小写字母加下划线的命名约定,例如 `math`, `os`, `numpy` 等。
  • 使用 `import` 语句可以导入包和包中的模块,例如 `import math` 或者 `from math import sqrt`

文件夹(Folder):

  • 文件夹是操作系统上的一个目录,用于存储文件和其他文件夹。
  • 文件夹是操作系统提供的一种方式来组织和管理文件的集合。
  • 文件夹的名称由操作系统决定,可以包含字母、数字、空格和其他字符,具体允许的字符取决于操作系统。
  • 在 Python 中,你可以使用函数和模块来操作文件夹,例如 `os` 模块中的 `os.mkdir()` 函数可以创建一个新的文件夹。

需要注意的是,虽然包通常以文件夹的形式存在,并且使用包的名称来命名文件夹,但并不是所有的文件夹都可以称为包。只有满足包的要求(包含模块文件和 `__init__.py` 文件)的文件夹才能被认为是一个包。

综上所述,包是一种对模块进行组织和管理的机制,而文件夹是操作系统上存储文件和其他文件夹的一种方式。在实际编程中,通常会将模块按照包的方式组织在文件夹中,以便更好地管理和重用代码。


reference:

6. 模块 — Python 3.8.16 文档

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值