Python模块并不神秘,它只是一个Python文件或一组Python文件。使用Python模块,可以编写可重用的、更有条理的代码。例如,可以编写一个通用Python模块来执行CSV文件处理任务,世界各地的数据科学家都可以使用该模块来读取、写入和操作CSV文件。
Python附带了数百个提供不同功能的默认模块。然而,你也可以用Python编写自己的自定义模块。这就是本文的内容。
创建自定义模块
要在Python中创建自定义模块,只需创建一个新的Python文件。创建一个名为newmodule.py的Python文件,其中包含三个函数:print_text()、find_log()和find_exp(),如下所示。因为模块只是另一个Python文件,所以可以在Python模块内定义任何内容,比如类、方法、数据结构等等。
newmodule.py
import numpy as np
def print_test():
print("本消息来源于外部模块")
def find_log(num):
return np.log(num)
def find_exp(num):
return np.exp(num)
这样,创建了一个名为newmodule的模块,可以在其它Python应用程序和文件中使用你定义在newmodule里的三个函数。
要使用自定义Python模块,Python解释器应该能够访问包含自定义模块的Python文件。有三个位置可以保存包含自定义模块的Python文件,以便Python解释器可以访问它。
1.与访问模块的Python文件位于同一目录中
2.在另一个目录中,该目录必须添加到Python解释器的路径中
3.在Python解释器的默认路径内。
导入相同目录里的自定义模块
创建另一个名为mainfile.py的文件,位于与刚创建的newmodulepy文件在同一目录中。mainfile.py文件将在本文中用于测试自定义模块的功能。
要导入自定义模块,可以使用import语句,后跟模块名称。此语法类似于导入默认或已安装的Python模块。下面的脚本导入由存储在与mainfilepy文件相同的目录中newmodule.py创建的newmodule模块。注意,要导入模块,只需指定模块名称,而不必指定“.py”扩展名。
接下来,脚本将调用newmodule模块中定义的三个函数。从另一个模块调用函数的一种方法是指定模块名,后跟点“.”运算符和函数名,如下面的脚本所示:
mainfile.py
import newmodule
newmodule.print_text()
print("这条消息来自main文件")
log16= newmodule.find_log(16)
print(log16)
exp16= newmodule.find_exp(16)
print(exp16)
上面的脚本应该会成功执行,你应该会看到下面的输出,这表明你能够成功导入newmodule模块。
输出:
本消息来源于外部模块
这条消息来自main文件
2.772588722239781
8886110.520507872
如果你不想输入一个长的模块名称,后面跟着一个点运算符,那么可以在导入模块时通过as运算符给它一个别名,如下所示:
mainfile.py
import newmodule as nm
nm.print_text()
print("这条消息来自main文件")
log16= nm.find_log(16)
print(log16)
exp16= nm.find_exp(16)
print(exp16)
注意,现在只需键入nm,而不是在每次调用函数时键入newmodule。
如果知道你只需要模块中的某个函数,那么可以通过从你的模块中导入那些特定的函数或特性,而不是导入完整的模块,让它变得更加简单。为此,可以使用from关键字。例如,下面的脚本从newmodule导入find_log()函数。在这种情况下,根本不需要使用点运算符将函数名附加到模块名,相反,可以直接调用函数名。
mainfile.py
from newmodule import find_log
log16= find_log(16)
print(log16)
同样,可以从一个模块导入多个函数。例如,下面的脚本从newmodule模块中导入find_log()和find_exp()函数。
mainfile.py
from newmodule import find_log, find_exp
log16= find_log(16)
print(log16)
exp16= find_exp(16)
print(exp16)
不过,有一种更简单的方法可以避免使用点符号。如果要从Python模块导入所有内容,只需使用星号*运算符即可。通过这种方式,可以使用模块中的所有函数、类等,而无需使用点运算符将该函数附加到模块名称中。这里有一个例子。
mainfile.py
from newmodule import *
log16= find_log(16)
print(log16)
exp16= find_exp(16)
print(exp16)
从不同的路径导入自定义模块
还可以将自定义模块保存在导入它的目录之外的目录中。我们创建另一个模块newmodule2.py,该文件包含一个方法find_sqrt(),如下所示。
newmodule2.py
import numpy as np
def find_sqrt(num):
return np.sqrt(num)
将上面的文件保存在另一个目录“D:完美Excel”中。
现在,如果要在Python应用程序中导入newmodule2模块,必须将该模块的路径附加到Python解释器可访问的路径列表中。sys.path列表包含这些路径的列表。
可以使用append()方法将新路径添加到Python解释器可访问的路径列表中。之后,可以导入该模块并访问其函数。下面是一个示例脚本可供参考。
mainfile.py
import sys
sys.path.append(r"D:完美Excel")
import newmodule2
sqrt16= newmodule2.find_sqrt(16)
print(sqrt16)
从默认Python路径添加和导入自定义模块
最后,可以将自定义模块导入Python应用程序,方法是将该模块保存在Python解释器尝试导入Python模块时搜索的默认路径之一。
要查看这些路径的列表,可以遍历“sys.path()”列表,如下面的脚本所示:
import sys
fori in sys.path:
print(i)
注意,这里的输出取决于Python的安装和系统名。
可以在sys.path列表中的任何路径中添加自定义模块。很多人喜欢将自定义模块存储在包含site-packages的目录中。在我的输出中,这个目录是“C:UsersexcelperfectAppDataLocalProgramsPythonPython39libsite-packages”。
下面创建另一个名为newmodule3.py的模块并将其放置在site-packages目录中。
newmodule3.py
def find_product(num1, num2):
return num1 * num2
下面的脚本导入newmodule3模块,执行该模块中的find_product()函数。
mainfile.py
import newmodule3
prod85= newmodule3.find_product(8, 5)
print(prod85)
最后,可以从Python应用程序的不同位置导入多个自定义模块。例如,下面的脚本将导入在本文中创建的newmodule、newmodule2和newmodule3模块。
mainfile.py
import newmodule, newmodule2, newmodule3
log16= newmodule.find_log(16)
print(log16)
sqrt16= newmodule2.find_sqrt(16)
print(sqrt16)
prod85= newmodule3.find_product(8, 5)
print(prod85)
就这些!将经常使用的函数存储在它们自己的自定义模块中是一种很好的做法,这样就不必在每次编写新的Python脚本时都重新构建它们。这是一种非常好的方法,可以让你的代码井然有序、简洁明了,让外部用户更容易理解。
注:本文学习整理自wellsr.com,总结了自己编写的模块的各种不同的使用方法。