Python学习笔记(六) 模块与包

简介: Python学习笔记(六) 模块与包

这篇文章将会介绍 Python 中模块与包的相关内容



1、模块与包


模块 (module)   这个概念最初是为了代码封装和可重用性而出现的,每个后缀为 .py 的文件都是一个模块

(package) 是为了更好地组织模块而发展出来的概念,在 Python 3.3 后,每个目录都被称为一个包

而在 Python 3.3 之前,只有目录中有 __init__.py 才会被识别为一个包


2、导入模块


我们可以使用 import 语句导入模块,常规的语法是 import module, 在首次导入模块时:

  1. 首先创建一个新的命名空间,并在该命名空间内执行模块 module 中的代码
  2. 然后在当前命名空间用名称  module  引用新的命名空间


所以我们在当前命名空间内才能通过 module.symbol 访问模块中的变量

>>> import random
>>> random.randint(0, 1)
# 1

我们也能使用 from module import symbolmodule 中导入指定的 symbol 到当前命名空间

这样我们就能在当前命名空间直接访问导入的变量,但是要注意此时不能访问模块中的其他变量

>>> from random import randint
>>> randint(0, 1)
# 1

我们还能通过 as 用指定的名称引用新的命名空间和导入的变量

>>> # 通过 `as` 指定名称引用新的命名空间
>>> import random as rd
>>> rd.randint(0, 1)
# 1
>>> # 通过 `as` 指定名称引用导入的变量
>>> from random import randint as ri
>>> ri(0, 1)
# 1

3、导入包


我们可以用 import 语句导入包,常规的语法是 import package,在执行这条语句时:

  1. 首先创建一个新的命名空间,并在该命名空间内执行包内 __init__.py 中的代码
  2. 然后在当前命名空间用名称 package 引用新的命名空间

__init__.py 一般用于指定导出的内容,若该文件缺失或内容为空,import package 不会有任何效果

import package
print(package.module.symbol)

我们也能用 from package import modulepackage 中导入指定的 module 到当前命名空间

这样我们就能在当前命名空间直接访问导入的模块 module 以及模块中的变量

from package import module
print(module.symbol)

我们还能用 from package.module import symbolpackage 中的 module 导入指定的 symbol

这样我们就能在当前命名空间直接访问导入的变量 symbol

from package.module import symbol
print(symbol)

4、搜索路径


下面让我们思考一个更深入的问题?当我们使用 import 语句导入模块时,解释器在哪里找所需的模块呢?

  1. 缓存路径(可以通过 sys.modules 查看,保存着之前导入的所有模块及其查找路径)
  2. 内置模块(可以通过 sys.builtin_module_names 查看)
  3. 其他位置(可以通过 sys.path 查看,包括入口文件所在目录、PYTHONPATH 环境变量指定目录)

如果现在我们需要让程序引用一个不在上述路径所指定的目录中的模块,可以怎么处理呢?

一个简单而有效的办法就是在程序中修改 sys.path 的值,添加上述模块所在路径即可


5、隐藏测试代码


在编写模块时,我们常常需要对模块进行单元测试,等待测试成功后才会将其应用到其它程序上

由于测试所需,在模块中可能会留下大量测试代码,这些测试代码在模块被引用时可能会影响到正常运行

所以,我们有必要在模块中隐藏测试代码,具体的方法如下:

在 Python 中有一个内置变量 __name__,只有当一个文件作为入口文件时,它的值才为 __main__

所以我们可以将测试代码写在以下条件语句块内,这样的话只有在直接运行模块时才会执行这些代码

if __name__ == '__main__':
    # 测试代码

6、模块查询


最后一个问题,当我们看到一个从未接触过的模块时,可以在哪里进行学习呢?通常有以下几种途径:

  • mudule.__doc__:列出模块的简短说明
>>> import random
>>> print(random.__doc__)
# Random variable generators.
# 
#     integers
#     --------
#            uniform within range
# 
#     sequences
#     ---------
#            pick random element
#            pick random sample
#            pick weighted random sample
#            generate random permutation
# 
#     distributions on the real line:
#     ------------------------------
#            uniform
#            triangular
#            normal (Gaussian)
#            lognormal
#            negative exponential
#            gamma
#            beta
#            pareto
#            Weibull
# 
#     distributions on the circle (angles 0 to 2pi)
#     ---------------------------------------------
#            circular uniform
#            von Mises
# 
# General notes on the underlying Mersenne Twister core generator:
# 
# * The period is 2**19937-1.
# * It is one of the most extensively tested generators in existence.
# * The random() method is implemented in C, executes in a single Python step,
#   and is, therefore, threadsafe.
  • module.__all__:列出模块的可用接口
>>> import random
>>> print(random.__all__)
# ['Random', 'seed', 'random', 'uniform', 'randint', 'choice', 'sample', 'randrange', 'shuffle', 'normalvariate', 'lognormvariate', 'expovariate', 'vonmisesvariate', 'gammavariate', 'triangular', 'gauss', 'betavariate', 'paretovariate', 'weibullvariate', 'getstate', 'setstate', 'getrandbits', 'choices', 'SystemRandom']
  • module.__file__:打印模块源代码的所在路径
>>> import random
>>> print(random.__file__)
# C:\Python\Python37-32\lib\random.py
  • help(module):查看帮助手册,获取更多信息
  • 最后一个方法当然是直接看官方文档的说明啦:https://docs.python.org

文章知识点与官方知识档案匹配,可进一步学习相关知识

目录
相关文章
|
28天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
106 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
1月前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
56 7
|
1月前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
199 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
1月前
|
程序员 Linux Python
python中模板和包的使用
本文介绍了 Python 模块和包的基本概念及使用方法。模块是 Python 程序结构的核心,每个以 `.py` 结尾的源文件都是一个模块,包含可重用的代码。文章详细讲解了模块的导入方式(如 `import` 和 `from...import`),模块的搜索顺序,以及如何创建和发布自己的模块。此外,还介绍了包的概念,包是包含多个模块的特殊目录,并通过 `__init__.py` 文件定义对外提供的模块列表。最后,文章简述了如何使用 `pip` 工具管理第三方模块的安装与卸载。作者:大石头的笔记;来源:稀土掘金。
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
32 3
|
2月前
|
Python
Python Internet 模块
Python Internet 模块。
133 74
|
2月前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
36 5
|
3月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
141 63
|
3月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
3月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。

热门文章

最新文章

推荐镜像

更多