📅  最后修改于: 2020-10-24 09:18:06             🧑  作者: Mango
可以将Python模块定义为Python程序文件,其中包含Python代码,包括Python函数,类或变量。换句话说,我们可以说以扩展名(.py)保存的Python代码文件被视为模块。我们可能在Python模块中有一个可运行的代码。
Python的模块为我们提供了以逻辑方式组织代码的灵活性。
要将一个模块的功能用于另一个模块,我们必须导入特定的模块。
在此示例中,我们将创建一个名为file.py的模块,其中包含一个函数func,该函数包含在控制台上print一些消息的代码。
让我们创建名为file.py的模块。
#displayMsg prints a message to the name being passed.
def displayMsg(name)
print("Hi "+name);
在这里,我们需要将此模块包含到主模块中,以调用在名为file的模块中定义的方法displayMsg()。
我们需要在Python代码中加载模块以使用其功能。 Python提供了以下两种类型的语句。
import语句用于将一个模块的所有功能导入另一个模块。在这里,我们必须注意,通过将该文件作为模块导入到另一个Python源文件中,我们可以使用任何Python源文件的功能。
我们可以使用一个import语句来导入多个模块,但是一个模块被加载一次,无论其次数是多少,它已经被导入到我们的文件中。
下面给出了使用import语句的语法。
import module1,module2,........ module n
因此,如果我们需要调用文件file.py中定义的displayMsg()函数,则必须将该文件作为模块导入到我们的模块中,如下例所示。
import file;
name = input("Enter the name?")
file.displayMsg(name)
输出:
Enter the name?John
Hi John
Python无需将整个模块导入名称空间,而是提供了仅导入模块特定属性的灵活性。可以通过使用from来完成?进口声明。下面提供了使用from-import语句的语法。
from < module-name> import , ..,
考虑以下名为“计算”的模块,该模块包含求和,乘法和除法三个功能。
Calculation.py:
#place the code in the calculation.py
def summation(a,b):
return a+b
def multiplication(a,b):
return a*b;
def divide(a,b):
return a/b;
Main.py:
from calculation import summation
#it will import only the summation() from calculation.py
a = int(input("Enter the first number"))
b = int(input("Enter the second number"))
print("Sum = ",summation(a,b)) #we do not need to specify the module name while accessing summation()
输出:
Enter the first number10
Enter the second number20
Sum = 30
如果我们事先知道要从模块导入的属性,那么from … import语句总是更好地使用。它不会使我们的代码变得更重。我们还可以使用*从模块导入所有属性。
请考虑以下语法。
from import *
Python为我们提供了导入具有特定名称的模块的灵活性,因此我们可以使用该名称在Python源文件中使用该模块。
重命名模块的语法如下。
import as
#the module calculation of previous example is imported in this example as cal.
import calculation as cal;
a = int(input("Enter a?"));
b = int(input("Enter b?"));
print("Sum = ",cal.summation(a,b))
输出:
Enter a?10
Enter b?20
Sum = 30
dir()函数返回在传递的模块中定义的名称的排序列表。该列表包含此模块中定义的所有子模块,变量和函数。
考虑以下示例。
import json
List = dir(json)
print(List)
输出:
['JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__',
'__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__',
'_default_decoder', '_default_encoder', 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
正如我们已经说过的,一个模块被加载一次,而不管它被导入Python源文件的次数。但是,如果要重新加载已导入的模块以重新执行顶级代码,则Python向我们提供了reload()函数。下面给出了使用reload()函数的语法。
reload()
例如,要重新加载上一示例中定义的模块计算,我们必须使用以下代码行。
reload(calculation)
在Python,变量与两种类型的范围相关联。除非或直到在函数定义全局变量,否则模块中定义的所有变量都包含全局范围。
函数内部定义的所有变量都包含局部范围,该范围仅限于此函数本身。我们无法全局访问局部变量。
如果使用两个不同的作用域(即局部变量和全局变量)以相同的名称定义了两个变量,则始终将优先级赋予局部变量。
考虑以下示例。
name = "john"
def print_name(name):
print("Hi",name) #prints the name that is local to this function only.
name = input("Enter the name?")
print_name(name)
输出:
Hi David
Python的软件包通过提供分层的目录结构(其中包含子软件包,模块和子模块)来为开发人员提供应用程序开发环境的便利。这些软件包用于有效地对应用程序级别的代码进行分类。
让我们在主目录中创建一个名为“雇员”的程序包。请考虑以下步骤。
1.在路径/ home上创建一个名为Employees的目录。
2.在路径/ home / Employees上创建一个名称为ITEmployees.py的Python源文件。
ITEmployees.py
def getITNames():
List = ["John", "David", "Nick", "Martin"]
return List;
3.同样,再创建一个名称为BPOEmployees.py的Python文件,并创建一个函数getBPONames()。
4.现在,我们在第一步中创建的雇员目录包含两个Python模块。为了使该目录成为一个包,我们需要在此处再包含一个文件__init__.py,其中包含该目录中定义的模块的import语句。
__init__.py
from ITEmployees import getITNames
from BPOEmployees import getBPONames
5.现在,目录Employees已成为包含两个Python模块的软件包。在这里,我们必须注意,必须在目录中创建__init__.py才能将该目录转换为包。
6.要使用在Employees包中定义的模块,我们必须将其导入到我们的Python源文件中。让我们在主目录(/ home)中创建一个简单的Python源文件,该文件使用此包中定义的模块。
测试文件
import Employees
print(Employees.getNames())
输出:
['John', 'David', 'Nick', 'Martin']
我们可以在包中包含子包。我们可以根据应用程序要求将软件包嵌套到任何级别。
下图显示了应用程序库管理系统的目录结构,该系统包含三个子软件包,分别是Admin,Librarian和Student。子软件包包含Python模块。