在 Python 中,**模组(Module)和包(Package)**是组织和管理代码的基本单位。以下是它们的详细说明:

模组 (Module)

  • 定义: 模组是包含 Python 代码的档案,通常是以 .py 为扩展名的档案。模组可以包含函数、类别和变数等。
  • 用途: 模组使得代码可以被重用和组织。你可以将相关的功能放在同一个模组中,然后在其他 Python 脚本中导入使用。
  • 导入模组:使用 import 语句来导入模组。例如:

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

包 (Package)

  • 定义:包是一种特殊的模组,它是一个包含多个模组的目录。包中必须包含一个名为 init.py 的档案(即使是空的),以告诉 Python 这是一个包。
  • 用途:包可以用来组织和分层管理模组,特别是在大型应用程式中。它们可以帮助避免命名冲突,并提供更清晰的代码结构。
  • 导入包中的模组:使用 import 语句来导入包中的模组。例如,如果有一个包 mypackage,里面有一个模组 mymodule,可以这样导入:

from mypackage import mymodule

总结

  • 模组 是单一的 Python 档案,可以被重用。
  • 包 是一个包含多个模组的目录,用于组织和管理代码。

使用 Python 模组时,通常不会自动生成额外的文件,除非涉及到特定的情况。以下是一些可能产生的文件类型:

  • 字节码档案 (.pyc)
    • 描述:当你导入一个模组时,Python 会将其编译成字节码,并将其存储为 .pyc 档案,这些档案通常位于 pycache 目录中。
    • 用途:这样可以加快下次导入模组的速度,因为不需要重新编译源码。
  • pycache 目录
    • 描述:当 Python 生成字节码档案时,这些档案会被存放在 pycache 目录中。
    • 内容:这个目录中会包含以 .pyc 为扩展名的字节码档案,档名通常会包括源码档案的名称和 Python 的版本号。
  • init.py 档案(对于包)
    • 描述:如果你使用的模组是包的一部分,则包目录中必须有一个名为 init.py 的档案。这个档案可以是空的,但它告诉 Python 该目录应该被视为一个包。

    总结

    在使用模组时,最常见的自动生成文件是字节码档案(.pyc)和 pycache 目录。如果使用包,则需要包含 init.py 档案来标识包。这些文件和目录有助于提高代码的执行效率和组织性。

    import的方法

  • 导入整个模组使用 import 语句导入整个模组:
  • import module_name

  • 导入模组中的特定函数或类别使用 from ... import ... 语句导入模组中的特定部分:
  • from module_name import function_name

  • 导入并重命名模组(常用)使用 as 关键字来给导入的模组或函数指定别名:
  • import module_name as alias

  • 导入包中的模组如果模组位于包中,使用点(.)来指定路径:假设有以下目录结构:
  • mypackage/
    __init__.py
    mymodule.py

    mymodule.py 的内容:

    # mymodule.py
    def greet(name):
    return f"Hello, {name}!"

    你可以这样导入 mymodule 模组:

    from mypackage import mymodule
    print(mymodule.greet("Alice")) # 输出:Hello, Alice!

    如果你的包中有子包,可以使用点来导入子模组。例如:

    mypackage/
    __init__.py
    subpackage/
    __init__.py
    submodule.py

    from mypackage.subpackage import submodule

    print(submodule.greet("Bob")) # 输出:Hello from submodule, Bob!

  • 导入所有内容使用 from ... import * 导入模组中的所有内容,但这样做不太推荐,因为可能会导致命名冲突:
  • from module_name import *

  • 动态导入模组使用 importlib 模组进行动态导入:
  • import importlib
    module = importlib.import_module(\'module_name\')

    在 Python 中,Namespace(命名空间)是一个容器,用于存储变数名称(标识符)及其对应的物件。命名空间的主要目的是为了避免命名冲突,确保同名的变数或函数在不同的范畴中不会互相影响。

    命名空间的类型 LEGB 的四个层级LEGB 的查找顺序是按照以下层级进行的:

    Local (局部):首先查找当前函数内部定义的变数。如果变数在局部命名空间中存在,则直接使用。Enclosing (闭包):如果在局部命名空间中找不到,则查找包含当前函数的外部函数的命名空间。这适用于嵌套函数的情况。Global (全域):如果在闭包命名空间中仍然找不到,则查找模组层级定义的变数和函数。Built-in (内建):最后,如果在全域命名空间中仍然找不到,则查找 Python 内建的标识符,如 print()、len() 等。

    下一篇:python :if name == "main"