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 | os 该模块提供了一种统一的接口,用于执行一些操作系统功能。 |
2 | string 该模块包含一些用于字符串处理的函数。 |
3 | re 该模块提供了一组强大的正则表达式功能。正则表达式(RegEx)允许对字符串进行强大的搜索和匹配。 |
4 | math 该模块实现了一些浮点数的数学运算。这些函数通常是对平台C库函数的简单封装。 |
5 | cmath 此模块包含一些用于复数的数学运算。 |
6 | datetime 此模块提供处理日期和一天内时间的函数。它封装了C运行时库。 |
7 | gc 此模块提供对内置垃圾收集器的接口。 |
8 | asyncio 此模块定义了用于异步处理所需的功能。 |
9 | Collections 此模块提供了高级容器数据类型。 |
10 | Functools 此模块具有高阶函数和可调用对象的操作。在函数式编程中有用。 |
11 | operator 标准运算符对应的函数。 |
12 | pickle 将Python对象转换为字节流,反之亦然。 |
13 | socket 底层网络接口。 |
14 | sqlite3 使用SQLite 3.x的DB-API 2.0实现。 |
15 | statistics 数学统计函数。 |
16 | typing 支持类型提示。 |
17 | venv 创建虚拟环境。 |
18 | json 将 JSON 格式进行编码和解码。 |
19 | wsgiref WSGI 工具和参考实现。 |
20 | unittest Python 的单元测试框架。 |
21 | random 生成伪随机数。 |
自定义模块
任何扩展名为.py并包含Python代码的文本文件都可以看作是一个模块。它可以包含一个或多个函数、变量、常量以及类的定义。通过import语句,来自模块的任何Python对象都可以在解释器会话或另一个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?
import 语句
在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
导入 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
将下面的英文翻译成中文,不解释,保留HTML格式:
让我们通过在以下脚本中导入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 程序,你会发现输出的和为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