当前位置: 首页 > news >正文

python中的模块和包

模块

在Python中,模块是一个包含Python定义和声明的文件。文件名就是模块名加上.py后缀。模块可以包含函数、类、变量定义以及可执行的代码。使用模块的主要目的之一是将相关的代码组织在一起以提高代码的可重用性、可维护性和命名空间管理。

基本用法

  • 导入模块:你可以使用import语句来导入一个模块,这样就可以访问该模块中定义的函数和变量。

    import math
    print(math.sqrt(16))  # 输出: 4.0
    
  • 从模块导入特定项:如果你只需要从某个模块中导入特定的函数或变量,可以使用from ... import ...语句。

    from math import sqrt
    print(sqrt(16)) # 输出: 4.0
    
  • 为导入的模块或其内容重命名:有时候为了避免命名冲突或简化代码,你可能想给导入的模块或其中某个元素重新命名,这时可以使用as关键字。

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

创建自己的模块

创建自己的Python模块非常简单。只需将相关代码保存在一个.py文件中即可。例如,如果你创建了一个名为mymodule.py包含以下内容:

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

然后,在同一目录下或者PYTHONPATH环境变量指向目录下有这个文件时,你就能够通过import语句来使用它:

import mymoduleprint(mymodule.greet("World")) # 输出: Hello, World!

模块搜索路径(重点)

当你尝试导入一个模板时,Python解释器会在以下位置搜索该名称对应.py文件:

  1. 当前脚本所在目录。
  2. PYTHONPATH环境变量指定目录(如果设置)。
  3. 标准库所在目录。

如果都找不到,则会引发一个ImportError异常。

在Python中,包(Package)是一种用于组织模块的层次结构。简单来说,一个包就是一个包含多个模块的目录,该目录下还有一个特殊的文件__init__.py。这个文件可以为空,但它必须存在于目录中以告诉Python解释器这个目录应当被视为一个Python包。通过使用包,开发者可以轻松地对复杂项目进行模块化管理和命名空间组织。

在大型项目开发过程中起着至关重要作用, 它帮助开发者将相关联功能组织到不同层次和空间, 进而使得整体代码结构更加清晰、管理更加高效。

包的基本用法

  • 创建包:要创建一个包,在你的项目中创建一个新目录,并在该目录下添加__init__.py文件。

  • 添加模块到包:在这个新建立的目录(即你的包)中添加.py文件作为子模块。

  • 导入从属于包的模块:当你想要使用这个包里面定义好的函数或类时,你需要导入相应的模块。

示例

假设我们有以下项目结构:

myproject/
│
├── mypackage/
│   ├── __init__.py
│   ├── submodule1.py
│   └── submodule2.py
│
└── main.py

其中,mypackage是我们定义好了两个子模块(submodule1.py, submodule2.py) 的一个Python 包。

如果在submodule1.py里面有如下函数定义:

# 在 submodule1.py 文件内def my_function():print("Hello from submodule 1!")

那么,在主程序或其他任何地方想要调用这些函数时,可以按照以下方式导入并使用:

# 在 main.py 或其他任何想要调用此函数的地方from mypackage import submodule1submodule1.my_function()  # 输出: Hello from submodule 1!

或者直接从子模块导入特定功能:

from mypackage.submodule1 import my_functionmy_function()  # 输出: Hello from submodule 1!

包与命名空间管理

利用Python中“点式”路径表示法来引入不同级别嵌套下面具体某一项内容是非常便利且清晰明了。通过合理设计和使用软件架构中各级别之间关系及其内部元素(如类、函数等),开发者能够更好地实现代码逻辑分离、提高代码可读性和可维护性。

第三方开源模块

查找和使用第三方开源模块是Python编程中的一个重要环节,因为这可以极大地提高开发效率,避免“重新发明轮子”。以下是查找和使用第三方开源模块的一般步骤:

1. 查找第三方模块

  • PyPI(Python Package Index):PyPI是Python的官方第三方软件仓库。你可以通过访问https://pypi.org来搜索需要的包。PyPI上几乎包含了所有流行的Python库和框架。

  • GitHub或其他代码托管平台:很多时候,开发者会在GitHub、GitLab等代码托管平台上发布和维护他们的项目。通过在这些平台上搜索,你可能会发现一些非常有用但尚未发布到PyPI上的库。

  • Awesome Lists:对于某些特定领域,GitHub上有许多被称为“Awesome Lists”的资源列表,其中收集了该领域内优秀的库、工具、文章等资源。

2. 评估模块

在选择使用一个第三方模块之前,应该对其进行适当评估:

  • 文档质量:好的文档对于理解和有效使用一个库至关重要。

  • 活跃度与维护情况:检查项目最后一次更新时间以及issue区活跃度。

  • 社区与用户反馈:社区大小以及用户反馈可以作为参考指标。

  • 许可证类型:确保其许可证符合你项目需求。

3. 安装模块

大部分Python第三方包都可以通过pip(Python包管理器)轻松安装。只需打开命令行或终端,并执行如下命令:

pip install package_name

package_name替换成你想安装的包名即可。

注意!

python3中的命令为

 pip3 install package_name

在某些操作系统中,尤其是较新的版本,Python 2和Python 3可能会同时存在。由于Python 2已经在2020年初停止支持,许多系统默认的Python版本已经切换到了Python 3。在这种情况下,“pip”命令可能仍然指向了旧版Python(即Python 2)的包管理器,而该旧版可能未被安装或者其路径没有被添加到环境变量中。相反,“pip3”明确指向了与Python 3相关联的包管理器,并且往往作为默认安装。

4. 使用模块

安装完毕后,在你的项目中导入并使用这个包:

import package_name# 或者从包中导入特定功能
from package_name import some_function_or_class

确保阅读该模块提供者给出的文档来了解如何正确地使用它。

国内镜像源

在中国由于网络原因直接访问PyPI(Python Package Index)可能会比较慢,幸运的是,有几个国内镜像源可以使用,这些镜像源会定期同步PyPI上的内容,从而提供更快的下载速度。以下是一些知名的国内PyPI镜像源:

阿里云

  • 镜像地址:https://mirrors.aliyun.com/pypi/simple/

清华大学

  • 镜像地址:https://pypi.tuna.tsinghua.edu.cn/simple/

中国科技大学

  • 镜像地址:https://pypi.mirrors.ustc.edu.cn/simple/

华中科技大学

  • 镜像地址:http://pypi.hustunique.com/simple/

豆瓣(Douban)

  • 镜像地址:http://pypi.doubanio.com/simple/

请注意豆瓣(douban)的pip源已经在2021年底停止服务。

如何使用这些镜像源?

你可以通过修改pip命令来指定使用特定的镜像源。例如,如果你想要使用清华大学提供的镜像源安装requests库,可以在终端中输入:

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

此外,为了避免每次安装时都需要手动指定镜像源,你可以创建或修改配置文件(位于用户家目录下的.pip/pip.conf(Unix系统)或 %HOME%\pip\pip.ini(Windows系统)),添加如下内容以设置默认使用清华大学提供的镜像:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

替换其中index-url为你选择使用其他任一可用的国内源即可。

通过以上方法设置后,之后所有通过pip安装Python包时都将默认使用设定好了快速访问路径。这样不仅能显著加快包下载速度,并且也能减少因网络问题导致安装失败情况发生。

相关文章:

  • 【C++】深度解剖多态
  • 数据结构与算法:链式二叉树
  • c++单例模式和call_once函数
  • 一键部署Tesseract-OCR环境C++版本(Windows)
  • 速盾网络:cdn加速技术和云计算的区别
  • spring三种配置方式总结
  • 笔记本上使用usb蓝牙适配器
  • 软件测试相关内容第三弹--软件测试基础
  • round四舍五入在python2与python3版本间区别
  • ubuntu 20.04 安装 huggingface transformers 环境
  • 从零搭建NodeJS项目(小白教程)
  • 2024年阿里云服务器租用费用一年和包月价格表
  • Diddler抓包工具——学习笔记
  • 2. gin中间件注意事项、路由拆分与注册技巧
  • BSD-3-Clause是一种开源软件许可协议
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android单元测试 - 几个重要问题
  • GraphQL学习过程应该是这样的
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript设计模式系列一:工厂模式
  • Java面向对象及其三大特征
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js面向对象
  • laravel5.5 视图共享数据
  • LeetCode29.两数相除 JavaScript
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux各目录及每个目录的详细介绍
  • mysql 5.6 原生Online DDL解析
  • Vue.js源码(2):初探List Rendering
  • webpack入门学习手记(二)
  • 初识 beanstalkd
  • 从0到1:PostCSS 插件开发最佳实践
  • 读懂package.json -- 依赖管理
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 配置 PM2 实现代码自动发布
  • 前端面试之CSS3新特性
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何在 Tornado 中实现 Middleware
  • 深入浏览器事件循环的本质
  • 深入浅出Node.js
  • 怎样选择前端框架
  • 走向全栈之MongoDB的使用
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​MySQL主从复制一致性检测
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • (2)nginx 安装、启停
  • (ZT)一个美国文科博士的YardLife
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (六)Hibernate的二级缓存
  • (三)uboot源码分析
  • (学习日记)2024.01.09
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .NET gRPC 和RESTful简单对比
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅