Python - 模块


函数是有组织的、可重用的代码块,用于执行单个相关操作。函数为您的应用程序提供更好的模块化性和高度的代码重用。

Python中的模块概念进一步增强了模块化性。您可以一起定义多个相关函数并加载所需的函数。模块是包含函数、类、变量、常量或任何其他 Python 对象的定义的文件。该文件的内容可供任何其他程序使用。Python 有 import 关键字用于此目的。

例子

import math
print ("Square root of 100:", math.sqrt(100))

它将产生以下输出-

Square root of 100: 10.0

内置模块

Python 的标准库捆绑了大量模块。它们称为内置模块。大多数这些内置模块都是用 C 编写的(因为 Python 的参考实现是用 C 编写的),并预编译到库中。这些模块包含有用的功能,例如系统特定的操作系统管理、磁盘 IO、网络等。

这是内置模块的选择列表 -

先生。 名称及简要说明

1

操作系统

该模块为许多操作系统功能提供了统一的接口。

2

细绳

该模块包含许多用于字符串处理的函数

3

关于

该模块提供了一组强大的正则表达式工具。正则表达式 (RegEx),允许对字符串中的模式进行强大的字符串搜索和匹配

4

数学

该模块实现了浮点数的许多数学运算。这些函数通常是平台 C 库函数的精简包装。

5

数学

该模块包含许多复数的数学运算。

6

约会时间

该模块提供处理日期和一天内时间的函数。它包装了 C 运行时库。

7

GC

该模块提供了内置垃圾收集器的接口。

8

异步

该模块定义了异步处理所需的功能

9

收藏

该模块提供高级容器数据类型。

10

功能工具

该模块具有对可调用对象的高阶函数和操作。在函数式编程中很有用

11

操作员

与标准运算符对应的功能。

12

泡菜

将 Python 对象与字节流相互转换。

13

插座

低级网络接口。

14

sqlite3

使用 SQLite 3.x 的 DB-API 2.0 实现。

15

统计数据

数理统计函数

16

打字

支持类型提示

17 号

维尼夫

创建虚拟环境。

18

json

对 JSON 格式进行编码和解码。

19

wsgiref

WSGI 实用程序和参考实现。

20

单元测试

Python 的单元测试框架。

21

随机的

生成伪随机数

用户定义的模块

任何具有 .py 扩展名并包含 Python 代码的文本文件基本上都是一个模块。它可以包含一个或多个函数、变量、常量以及类的定义。模块中的任何 Python 对象都可以通过 import 语句提供给解释器会话或另一个 Python 脚本。模块还可以包含可运行的代码。

创建模块

创建模块只不过是在任何编辑器的帮助下保存 Python 代码。让我们将以下代码保存为mymodule.py

def SayHello(name):
   print ("Hi {}! How are you?".format(name))
   return

您现在可以在当前 Python 终端中导入 mymodule。

>>> import mymodule
>>> mymodule.SayHello("Harish")
Hi Harish! How are you?

您还可以在另一个 Python 脚本中导入一个模块。将以下代码保存为 example.py

import mymodule
mymodule.SayHello("Harish")

从命令终端运行此脚本

C:\Users\user\examples> python example.py
Hi Harish! How are you?

进口声明

在 Python 中,提供了import关键字来从一个模块加载 Python 对象。该对象可以是函数、类、变量等。如果一个模块包含多个定义,则所有这些定义都将加载到命名空间中。

让我们将以下具有三个函数的代码保存为mymodule.py。

def sum(x,y):
   return x+y

def average(x,y):
   return (x+y)/2

def power(x,y):
   return x**y

import mymodule语句加载当前命名空间中该模块中的所有函数。导入模块中的每个函数都是该模块对象的一个​​属性。

>>> dir(mymodule)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'average', 'power', 'sum']

要调用任何函数,请使用模块对象的引用。例如,mymodule.sum()。

import mymodule
print ("sum:",mymodule.sum(10,20))
print ("average:",mymodule.average(10,20))
print ("power:",mymodule.power(10, 2))

它将产生以下输出-

sum:30
average:15.0
power:100

from ... import 语句

import语句将加载当前命名空间下模块的所有资源。可以使用此语法从模块导入特定对象。例如 -

在mymodule的三个函数中,只有两个函数被导入到以下可执行脚本example.py中

from mymodule import sum, average
print ("sum:",sum(10,20))
print ("average:",average(10,20))

它将产生以下输出 -

sum: 30
average: 15.0

请注意,调用函数时无需为其添加模块名称前缀。

from...import * 语句

还可以使用以下 import 语句将模块中的所有名称导入到当前命名空间中 -

from modname import *

这提供了一种将模块中的所有项目导入到当前命名空间的简单方法;但是,应谨慎使用此语句。

import ... as 声明

您可以为导入的模块指定别名。

from modulename as alias

调用时,别名应作为函数的前缀。

看一下下面的例子-

import mymodule as x
print ("sum:",x.sum(10,20))
print ("average:", x.average(10,20))
print ("power:", x.power(10, 2))

模块属性

在Python中,模块是模块类的对象,因此它由属性来表征。

以下是模块属性 -

  • __file__ 返回模块的物理名称。

  • __package__ 返回模块所属的包。

  • __doc__ 返回模块顶部的文档字符串(如果有)

  • __dict__ 返回模块的整个范围

  • __name__ 返回模块的名称

例子

假设以下代码保存为mymodule.py

"The docstring of mymodule"
def sum(x,y):
   return x+y

def average(x,y):
   return (x+y)/2
   
def power(x,y):
   return x**y

让我们通过在以下脚本中导入 mymodule 来检查它的属性 -

import mymodule

print ("__file__ attribute:", mymodule.__file__)
print ("__doc__ attribute:", mymodule.__doc__)
print ("__name__ attribute:", mymodule.__name__)

它将产生以下输出-

__file__ attribute: C:\Users\mlath\examples\mymodule.py
__doc__ attribute: The docstring of mymodule
__name__ attribute: mymodule

__name__属性

Python 模块的 __name__ 属性具有重要意义。让我们更详细地探讨一下。

在交互式 shell 中,__name__ 属性返回 '__main__'

>>> __name__
'__main__'

如果您在解释器会话中导入任何模块,它会返回该模块的名称作为该模块的 __name__ 属性。

>>> import math
>>> math.__name__
'math'

在 Python 脚本内部,__name__ 属性返回“__main__”

#example.py
print ("__name__ attribute within a script:", __name__)

在命令终端中运行它 -

__name__ attribute within a script: __main__

此属性允许将 Python 脚本用作可执行文件或模块。与 C++、Java、C# 等不同,Python 中没有 main() 函数的概念。扩展名为 .py 的 Python 程序脚本可以包含函数定义以及可执行语句。

保存mymodule.py并使用以下代码 -

"The docstring of mymodule"
def sum(x,y):
   return x+y
   
print ("sum:",sum(10,20))

您可以看到 sum() 函数是在定义它的同一脚本中调用的。

C:\Users\user\examples> python mymodule.py
sum: 30

现在让我们在另一个脚本example.py中导入这个函数。

import mymodule
print ("sum:",mymodule.sum(10,20))

它将产生以下输出-

C:\Users\user\examples> python example.py
sum: 30
sum: 30

输出“sum:30”出现两次。导入 mymodule 模块时一次。导入模块中的可执行语句也会运行。第二个输出来自调用脚本,即example.py程序。

我们想要发生的是,当导入模块时,只应导入函数,而不应运行其可执行语句。这可以通过检查 __name__ 的值来完成。如果是 __main__ ,则表示正在运行而不是导入。包括有条件的函数调用等可执行语句。

在mymodule.py中添加if语句,如下所示 -

"The docstring of mymodule"
def sum(x,y):
   return x+y

if __name__ == "__main__":
   print ("sum:",sum(10,20))

现在如果你运行example.py程序,你会发现 sum:30 输出只出现一次。

C:\Users\user\examples> python example.py
sum: 30

reload() 函数

有时您可能需要重新加载模块,尤其是在使用 Python 的交互式解释器会话时。

假设我们有一个具有以下功能的测试模块(test.py) -

def SayHello(name):
   print ("Hi {}! How are you?".format(name))
   return

我们可以导入模块并从 Python 提示符中调用其函数,如下所示:

>>> import test
>>> test.SayHello("Deepak")
Hi Deepak! How are you?

但是,假设您需要修改 SayHello() 函数,例如 -

def SayHello(name, course):
   print ("Hi {}! How are you?".format(name))
   print ("Welcome to {} Tutorial by TutorialsPoint".format(course))
   return

即使编辑 test.py 文件并保存,加载到内存中的函数也不会更新。您需要使用 imp 模块中的 reload() 函数重新加载它。

>>> import imp
>>> imp.reload(test)
>>> test.SayHello("Deepak", "Python")
Hi Deepak! How are you?
Welcome to Python Tutorial by TutorialsPoint