type
status
date
slug
summary
tags
category
icon
password
在 Python 中,import 语句用于引入模块或从一个模块中导入特定的变量、函数、类等。from ... import ...import 语句的一个常见用法,用来从一个模块中导入特定的部分,而不是整个模块。

1. 基本用法

导入整个模块

如果你想要导入整个模块(文件),可以使用 import 模块名
这会导入 math 模块中的所有功能(但不会直接导入到全局命名空间)。你可以通过 模块名.函数名 的方式来访问模块中的函数或变量。例如:

从模块中导入特定的函数或变量

如果你只需要从模块中使用某个特定的函数或变量,可以使用 from ... import ... 语句。这样可以直接使用导入的函数或变量,而不需要通过模块名来访问。
在这个例子中,我们只导入了 math 模块中的 sqrt 函数,因此不需要使用 math.sqrt,可以直接调用 sqrt

2. 常见用法示例

导入多个函数或变量

你可以一次导入多个函数或变量,用逗号分隔它们:

导入整个模块中的所有内容

你可以使用 * 来从模块中导入所有内容。这会将模块中的所有函数、类和变量导入到你的全局命名空间。但请注意,这样做可能会污染命名空间,容易引起命名冲突
警告from math import * 不是推荐的做法,因为这会将模块中的所有内容导入到当前的命名空间中,可能会覆盖你已有的变量或函数。

为导入的模块或函数起别名

你可以使用 as 给导入的模块或函数起一个别名,以便在代码中使用更短的名称。
  1. 为模块起别名
    1. 这里我们为 numpy 模块起了一个别名 np,这在处理较长的模块名时非常方便。
  1. 为函数或变量起别名
    1. 这里我们将 sqrt 函数重命名为 square_root,可以在代码中使用新的名称。

3. 模块的查找路径(Python Path)

当你使用 importfrom ... import ... 引入一个模块时,Python 会在其模块搜索路径中查找该模块。这些路径存储在 sys.path 中,你可以通过以下命令查看当前的模块搜索路径:
sys.path 包含了 Python 会查找模块的目录列表。如果你导入的模块不在这些目录中,Python 会抛出 ModuleNotFoundError
你可以通过以下方式将自定义路径添加到 sys.path 中:

4.导入包中的模块

Python 支持将模块组织成包(package),包实际上是包含多个模块的目录。通过 from ... import ...,你可以导入包中的特定模块或包中的函数。
假设有一个包结构如下:
你可以通过以下方式导入包中的模块或函数:
  • 导入整个模块:
    • 只导入模块中的特定函数:

      5. __init__.py 文件的重要性

      在包中,__init__.py 文件是必须的(在 Python 3.3 之前),它告诉 Python 该目录是一个包。即使文件为空,它也必须存在。在 Python 3.3 及以上版本,__init__.py 文件是可选的,但它仍然是一个很好的习惯,尤其是在需要初始化包或导入子模块时。

      6. 导入时的命名冲突

      如果你导入的模块或函数与现有的变量名称冲突,可能会导致意外的覆盖。例如:
      为避免这种情况,通常建议使用模块的前缀或为函数/变量起别名。

      7. 相对导入与绝对导入

      在包中,你可以使用相对导入或绝对导入。
      • 绝对导入:从包的根目录开始,明确指定模块的路径。
        • 相对导入:使用 . 来表示当前目录,.. 表示上一级目录。这种方式适用于包内模块之间的导入。
          相对导入只能在模块作为包的一部分时使用,不能在顶层脚本中使用。

          8. 动态导入

          在某些情况下,你可能需要在运行时导入模块,可以使用 importlib 模块进行动态导入:
          importlib.import_module() 函数允许你在运行时导入模块,这在某些情况下非常有用,比如动态加载插件。

          总结

          • import 用于导入整个模块。
          • from ... import ... 用于从模块中导入特定的函数、类或变量。
          • 可以使用 as 给导入的模块或函数起别名。
          • from ... import * 会导入模块中的所有内容,但可能导致命名冲突,不建议使用。
          • 了解 sys.path 可以帮助你找到模块的加载路径。
          • 绝对导入和相对导入分别适用于不同的包结构。
          【Python】命名规范(基于PEP 8)【JCST 综述】A Survey of Multimodal Controllable Diffusion Models
          Loading...