ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Python 模块 > 原文: [https://www.programiz.com/python-programming/modules](https://www.programiz.com/python-programming/modules) #### 在本文中,您将学习在 Python 中创建和导入自定义模块。 此外,您会发现在 Python 中导入和使用自定义模块和内置模块的不同技术。 ## Python 中的模块是什么? 模块是指包含 Python 语句和定义的文件。 包含 Python 代码的文件,例如:`example.py`,称为模块,其模块名称为`example`。 我们使用模块将大型程序分解为可管理的小型文件。 此外,模块提供了代码的可重用性。 我们可以在模块中定义最常用的函数并将其导入,而不是将其定义复制到其他程序中。 让我们创建一个模块。 输入以下内容并将其另存为`example.py`。 ```py # Python Module example def add(a, b): """This program adds two numbers and return the result""" result = a + b return result ``` 在这里,我们在名为`example`的模块内定义了[函数](/python-programming/function) `add()`。 该函数接受两个数字并返回它们的和。 * * * ## 如何在 Python 中导入模块? 我们可以将模块内部的定义导入另一个模块或 Python 中的交互式解释器。 我们使用`import`关键字执行此操作。 要导入我们先前定义的模块`example`,我们在 Python 提示符下键入以下内容。 ```py >>> import example ``` 这不会直接在当前符号表中导入在`example`中定义的函数的名称。 它仅在此处导入模块名称`example`。 使用模块名称,我们可以使用点`.`运算符访问该函数。 例如: ```py >>> example.add(4,5.5) 9.5 ``` Python 有大量的标准模块。 您可以查看 [Python 标准模块](http://docs.python.org/3/py-modindex.html)的完整列表及其用例。 这些文件位于 Python 安装位置内的`Lib`目录中。 可以像导入用户定义的模块一样导入标准模块。 有多种导入模块的方法。 它们在下面列出。 * * * ### Python `import`语句 我们可以使用`import`语句导入模块,并如上所述使用点运算符访问其中的定义。 这是一个例子。 ```py # import statement example # to import standard module math import math print("The value of pi is", math.pi) ``` 运行该程序时,输出为: ```py The value of pi is 3.141592653589793 ``` * * * ### 重命名导入 我们可以通过重命名模块来导入模块,如下所示: ```py # import module by renaming it import math as m print("The value of pi is", m.pi) ``` 我们已将`math`模块重命名为`m`。 在某些情况下,这可以节省我们的键入时间。 请注意,名称`math`在我们的范围内未被识别。 因此,`math.pi`无效,并且`m.pi`是正确的实现。 * * * ### Python `from...import`语句 我们可以从模块导入特定名称,而无需整体导入模块。 这是一个例子。 ```py # import only pi from math module from math import pi print("The value of pi is", pi) ``` 在这里,我们仅从`math`模块中导入了`pi`属性。 在这种情况下,我们不使用点运算符。 我们还可以如下导入多个属性: ```py >>> from math import pi, e >>> pi 3.141592653589793 >>> e 2.718281828459045 ``` * * * ### 导入所有名称 我们可以使用以下结构从模块导入所有名称(定义): ```py # import all names from the standard module math from math import * print("The value of pi is", pi) ``` 在这里,我们从`math`模块中导入了所有定义。 这包括在我们的范围内可见的所有名称,但以下划线(私有定义)开头的名称除外。 导入带有星号(`*`)符号的所有内容都不是一种好的编程习惯。 这可能导致标识符重复定义。 这也会影响我们代码的可读性。 * * * ## Python 模块搜索路径 导入模块时,Python 会在多个位置进行检查。 口译员首先寻找一个内置模块。 然后(如果未找到内置模块),Python 查找`sys.path`中定义的目录列表。 搜索按此顺序进行。 * 当前目录。 * `PYTHONPATH`(具有目录列表的环境变量)。 * 与安装有关的默认目录。 ```py >>> import sys >>> sys.path ['', 'C:\\Python33\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs', 'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Python33\\lib\\site-packages'] ``` 我们可以添加和修改此列表以添加我们自己的路径。 * * * ## 重新加载模块 Python 解释器在会话期间仅导入一次模块。 这使事情更有效率。 这是一个示例,说明其工作原理。 假设我们在名为`my_module`的模块中具有以下代码。 ```py # This module shows the effect of # multiple imports and reload print("This code got executed") ``` 现在我们看到了多次导入的效果。 ```py >>> import my_module This code got executed >>> import my_module >>> import my_module ``` 我们可以看到我们的代码只执行了一次。 这说明我们的模块仅导入了一次。 现在,如果我们的模块在程序执行过程中发生了变化,我们将不得不重新加载它。一种方法是重启解释器。 但这并没有太大帮助。 Python 提供了一种更有效的方法。 我们可以使用`imp`模块内部的`reload()`函数来重新加载模块。 我们可以通过以下方式做到这一点: ```py >>> import imp >>> import my_module This code got executed >>> import my_module >>> imp.reload(my_module) This code got executed <module 'my_module' from '.\\my_module.py'> ``` * * * ## `dir()`内置函数 我们可以使用`dir()`函数找出在模块内部定义的名称。 例如,我们在开始的模块`example`中定义了一个函数`add()`。 我们可以通过以下方式在`example`模块中使用`dir`: ```py >>> dir(example) ['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', 'add'] ``` 在这里,我们可以看到名称的排序列表(以及`add`)。 所有其他以下划线开头的名称是与模块关联的默认 Python 属性(不是用户定义的)。 例如,`__name__`属性包含模块的名称。 ```py >>> import example >>> example.__name__ 'example' ``` 可以使用`dir()`函数(不带任何参数)找到当前名称空间中定义的所有名称。 ```py >>> a = 1 >>> b = "hello" >>> import math >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'b', 'math', 'pyscripter'] ```