Python 基础 (五)Python包与模块

Python基础文章系列

Python 基础 (一)Python基本认识与环境搭建Python 基础 (一)Python基本认识与环境搭建
Python 基础 (二)Python变量与基本数据类型Python 基础 (二)Python变量与基本数据类型
Python 基础 (三)Python基本语句与基本运算Python 基础 (三)Python基本语句与基本运算
Python 基础 (四)Python函数Python 基础 (四)Python函数
Python 基础 (五)Python包与模块Python 基础 (五)Python包与模块
Python 基础 (六)Python的文件模块Python 基础 (六)Python的文件模块
Python 基础 (七)Python的异常处理机制Python 基础 (七)Python的异常处理机制
Python 基础 (八)Python的类与对象Python 基础 (八)Python的类与对象
Python 基础 (九)Python的内置模块Python 基础 (九)Python的内置模块
Python 基础 (十)Python实现简单的图书管理系统Python 基础 (十)Python实现简单的图书管理系统

在这里插入图片描述

4.5 包与模块

4.5.1 包

  • 包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。
  • 比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。
  • 就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
  • 这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。
  • 不妨假设你想设计一套统一处理声音文件和数据的模块(或者称之为一个"包")。

Python中的包(Packages)是一种用于组织和管理模块(Modules)的方法。包实际上是一个包含了多个模块的目录,该目录包含一个特殊的__init__.py文件,用于指示Python该目录应该被视为一个包。
以下是创建和使用Python包的基本步骤:

  1. 创建一个包目录:
    首先,您需要创建一个目录,该目录将作为包的根目录。您可以为这个目录选择一个有意义的名称,比如my_package
  2. 在包目录中创建模块:
    在包的目录下,您可以创建多个模块文件,这些模块可以包含函数、类和变量等Python代码。模块的文件名必须以.py结尾。
  3. 创建__init__.py文件:
    您需要在包目录中创建一个名为__init__.py的文件,即使它是空的。这个文件用于告诉Python该目录是一个包。
  4. 使用包中的模块:
    现在,您可以在其他Python脚本中使用这个包。例如,如果您有一个叫做module1.py的模块在my_package包中,您可以在其他脚本中这样导入它:
from my_package import module1
  1. 子包(可选):
    您还可以在包中创建子包,即在包目录中再创建一个子目录,并在子目录中放置一个__init__.py文件。这样可以创建多层嵌套的包结构。

示例目录结构:

my_package/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        submodule1.py

注意事项:

  • 包名和模块名应该遵循Python的命名规则,通常使用小写字母和下划线。
  • 在Python 3.3及更高版本中,__init__.py文件不再是必需的,但仍然建议使用它以确保向后兼容性。
  • 模块的导入方式可以是绝对导入或相对导入,具体取决于您的项目结构和需求。

4.5.2 模块

在Python中,模块(Module)是一个包含Python代码的单个文件。模块可以包含函数、类、变量和语句,用于组织和封装相关的代码。模块的主要目的是将代码分割成可维护和可重用的部分,以便在不同的程序中使用。
以下是关于Python模块的一些重要概念和用法:

  1. 导入模块:要在Python中使用模块中的代码,您需要使用import语句将模块导入到您的脚本中。例如,要导入Python标准库中的math模块,可以这样做:
import math
  1. 使用模块中的函数和变量:一旦导入了模块,您可以使用点运算符(.)访问模块中的函数、变量或类。例如,使用math模块中的sqrt函数计算平方根:
result = math.sqrt(25)
  1. 给模块起别名:您可以为导入的模块起一个别名,以简化使用。这在模块名很长或容易混淆时特别有用。例如:
import math as m
result = m.sqrt(25)
  1. 导入模块中的特定成员:如果您只需要模块中的特定函数或变量,而不想导入整个模块,可以使用from ... import语句。例如:
from math import sqrt
result = sqrt(25)
  1. 自定义模块:除了使用Python标准库中的模块,您还可以创建自己的模块。创建模块就是创建一个包含Python代码的.py文件,并确保它在您的项目目录或Python路径下可用。
  2. 标准库模块:Python附带了丰富的标准库,包含了许多常用的模块,如os(操作系统交互)、datetime(日期和时间处理)、json(JSON数据处理)等。
  3. 第三方模块:除了标准库,Python社区还维护了大量的第三方模块和库,您可以使用工具如pip来安装这些模块,以扩展Python的功能。

总之,模块是Python中组织代码的重要方式,它们有助于代码的组织、可维护性和重用性。了解如何使用模块是编写更结构化、模块化和可维护的Python代码的关键。

4.5.3 命名空间

在Python中,命名空间(Namespace)是一个包含变量名和它们对应的对象的映射。它用于确定在程序中查找变量名时的范围和可见性。Python中有以下几种类型的命名空间:
types_namespace-1.png
命名空间查找顺序:
假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间 -> 全局命名空间 -> 内置命名空间
如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:

NameError: name 'runoob' is not defined。
  1. 内置命名空间(Built-in Namespace)
    • 这是Python解释器默认提供的命名空间。
    • 包含了Python内置的对象和函数,如print()len()等。
    • 可以在任何地方直接访问内置命名空间的内容。
  2. 全局命名空间(Global Namespace)
    • 在模块级别定义的变量和函数属于全局命名空间。
    • 全局命名空间在整个模块中可见,也可以在不同模块之间共享。
    • 在一个Python脚本或模块中,全局命名空间就是该脚本或模块的命名空间。
  3. 局部命名空间(Local Namespace)
    • 每个函数调用都会创建一个局部命名空间。
    • 局部命名空间包含函数内部定义的变量和参数。
    • 局部命名空间只在函数内部可见,函数外部无法直接访问。
  4. 模块命名空间(Module Namespace)
    • 每个模块(.py文件)都有自己的命名空间。
    • 模块命名空间包含了模块级别的变量和函数。
    • 模块命名空间在整个模块内可见。
  5. 类命名空间(Class Namespace)
    • 每个类定义都有自己的命名空间,用于管理类的属性和方法。
    • 类命名空间在类定义中可见。
    • 类的实例可以访问类的命名空间。
  6. 实例命名空间(Instance Namespace)
    • 每个类的实例都有自己的命名空间,用于管理实例特有的属性。
    • 实例命名空间在实例化时创建,并且可以随着实例的生命周期而改变。

在Python中,命名空间的概念非常重要,它决定了变量和函数的可见性和作用域。当您使用变量时,Python会根据LEGB规则(Local、Enclosing、Global、Built-in)来查找变量,从局部命名空间开始,逐级向外查找,直到找到匹配的变量名或者达到全局和内置命名空间。
理解不同命名空间的作用和范围有助于编写更清晰、可维护的代码,避免变量名冲突,同时充分利用Python的模块化和封装特性。

4.5.4 作用域

在编程中,作用域(Scope)指的是变量的可见性和生命周期。它决定了在程序的哪些部分可以访问某个变量,并且确定了变量何时被创建和销毁。Python中有以下几种常见的作用域:

  1. 局部作用域(Local Scope)
    • 局部作用域是最内层的作用域,通常与函数内部相关联。
    • 在函数内定义的变量具有局部作用域,只能在该函数内部访问。
    • 变量的生命周期从函数被调用开始,到函数执行结束时结束。
def my_function():
    x = 10  # 局部作用域变量
    print(x)  # 可以在函数内访问

my_function()
print(x)  # 会引发 NameError,x 不在全局作用域中
  1. 嵌套作用域(Enclosing Scope)
    • 嵌套作用域与包含它们的函数的局部作用域相关联。
    • 如果在函数内部嵌套了另一个函数,内部函数可以访问外部函数的变量。
    • 外部函数无法访问内部函数的变量。
def outer_function():
    x = 10  # 外部函数的变量
    
    def inner_function():
        y = 20  # 内部函数的变量
        print(x + y)  # 内部函数可以访问外部函数的变量

    inner_function()

outer_function()
  1. 全局作用域(Global Scope)
    • 全局作用域是整个程序的最外层作用域。
    • 在模块级别定义的变量具有全局作用域,可以在整个模块中访问。
    • 变量的生命周期从程序启动时开始,到程序退出时结束。
global_variable = 100  # 全局作用域变量

def my_function():
    print(global_variable)  # 可以在函数内访问全局变量

my_function()
print(global_variable)
  1. 内置作用域(Built-in Scope)
    • 内置作用域包含了Python内置的函数和对象,如print()len()等。
    • 这些函数和对象可以在任何地方访问,无需导入模块。
    • 内置作用域的变量在Python解释器启动时创建,并在解释器退出时销毁。
print(len("Hello, World!"))  # 内置作用域中的函数和对象

理解作用域是编写Python代码的关键,它有助于避免变量名冲突,提高代码的可读性和可维护性。作用域规则决定了在不同位置访问变量时,哪些变量是可见的。通常情况下,变量应尽可能在最小的作用域内定义,以减少潜在的副作用和错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值