将函数存储在模块中

函数的一个优点是它们将代码块与主程序分开的方式。 当您为函数使用描述性名称时,您的程序将变得更容易理解。 您可以更进一步,将您的函数存储在一个称为模块的单独文件中,然后将该模块导入到您的主程序中。 import 语句告诉 Python 使模块中的代码在当前运行的程序文件中可用。

将您的函数存储在一个单独的文件中可以让您隐藏程序代码的细节并专注于其更高级别的逻辑。 它还允许您在许多不同的程序中重用函数。 当您将函数存储在单独的文件中时,您可以与其他程序员共享这些文件,而不必共享整个程序。 了解如何导入函数还可以让您使用其他程序员编写的函数库。

有几种导入模块的方法,我将简要介绍每一种方法。

导入整个模块

要开始导入函数,我们首先需要创建一个模块。 模块是以 .py 结尾的文件,其中包含要导入到程序中的代码。 让我们创建一个包含函数 make_pizza() 的模块。 为了制作这个模块,我们将从文件 pizza.py 中删除除函数 make_pizza() 之外的所有内容:

def make_pizza(size, *toppings):
    """Summarize the pizza we are about to make."""
    print(f"\nMaking a {size}-inch pizza with the following toppings:")
    for topping in toppings:
        print(f"- {topping}")

现在我们将在与 pizza.py 相同的目录中创建一个名为 making_pizzas.py 的单独文件。 该文件导入我们刚刚创建的模块,然后两次调用 make_pizza():

import pizza


pizza.make_pizza(16, 'pepperoni') (1)
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

当 Python 读取此文件时,import pizza 行告诉 Python 打开文件 pizza.py 并将其中的所有函数复制到此程序中。 您实际上看不到代码在文件之间复制,因为 Python 会在程序运行之前在幕后复制代码。 您只需要知道在 pizza.py 中定义的任何函数现在都可以在 making_pizzas.py 中使用。

1 要从导入的模块中调用函数,请输入导入的模块名称 pizza,然后是函数名称 make_pizza(),中间用点分隔。 此代码产生与未导入模块的原始程序相同的输出:
Making a 16-inch pizza with the following toppings:
- pepperoni

Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese

第一种导入方法,您只需编写 import 后跟模块名称,就可以使模块中的每个函数都可以在您的程序中使用。 如果使用这种 import 语句导入名为 module_name.py 的整个模块,则模块中的每个函数都可以通过以下语法使用:

module_name.function_name()

导入特定的函数

您还可以从模块中导入特定功能。 这是这种方法的一般语法:

from module_name import function_name

您可以通过用逗号分隔每个函数的名称来从模块中导入任意数量的函数:

from module_name import function_0, function_1, function_2

如果我们只想导入我们将要使用的函数,making_pizzas.py 示例将如下所示:

from pizza import make_pizza


make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

使用此语法,调用函数时无需使用点符号。 因为我们在 import 语句中显式导入了函数 make_pizza() ,所以我们在使用该函数时可以通过名称调用它。

使用 as 给函数指定别名

如果您导入的函数名称可能与程序中的现有名称冲突,或者如果函数名称很长,您可以使用一个简短的、唯一的别名——类似于函数昵称的备用名称。 导入函数时,您将为该函数赋予这个特殊昵称。

这里我们通过将 make_pizza 导入为 mp,为函数 make_pizza() 起一个别名 mp()。 as 关键字使用您提供的别名重命名函数:

from pizza import make_pizza as mp


mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')

此处显示的导入语句在此程序中将函数 make_pizza() 重命名为 mp()。 任何时候我们想要调用 make_pizza() 时,我们都可以简单地编写 mp() 来代替,Python 将运行 make_pizza() 中的代码,同时避免与您可能已在此程序文件中编写的另一个 make_pizza() 函数混淆。

提供别名的一般语法是:

from module_name import function_name as fn

使用 as 给模块指定别名

您还可以为模块名称提供别名。 给模块一个简短的别名,比如 p 代表 pizza,可以让你更快地调用模块的函数。 调用 p.make_pizza() 比调用 pizza.make_pizza() 更简洁:

import pizza as p


p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

模块 pizza 在 import 语句中被赋予了别名 p,但是模块的所有函数都保留了它们的原始名称。 通过写p.make_pizza()来调用函数,不仅比pizza.make_pizza()更简洁,而且还能将你的注意力从模块名上转移到函数的描述性名称上。 这些函数名称清楚地告诉您每个函数的作用,对于代码的可读性比使用完整的模块名称更重要。

这种方法的一般语法是:

import module_name as mn

导入模块中的所有函数

您可以使用星号 (*) 运算符告诉 Python 导入模块中的每个函数:

from pizza import *


make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

import 语句中的星号告诉 Python 将模块 pizza 中的每个函数复制到这个程序文件中。 因为每个函数都是导入的,所以您可以通过名称调用每个函数,而无需使用点符号。 但是,当您使用不是您编写的较大模块时,最好不要使用这种方法:如果该模块的函数名称与您项目中的现有名称相匹配,您可能会得到意想不到的结果。 Python 可能会看到多个具有相同名称的函数或变量,它不会单独导入所有函数,而是会覆盖这些函数。

最好的方法是导入你想要的一个或多个函数,或者导入整个模块并使用点符号。 这会产生易于阅读和理解的清晰代码。 我包含这一部分,这样当您在其他人的代码中看到类似下面的导入语句时,您就会认出它们:

from module_name import *