第九章进口

python附带了许多预生成的代码。这些代码称为模块和包。模块是单个可导入的python文件,而包由两个或多个模块组成。可以像导入模块一样导入包。每当保存自己的python脚本时,都会创建一个模块。它可能不是一个非常有用的模块,但它就是这样的。在本章中,我们将学习如何使用几种不同的方法导入模块。我们开始吧!

导入此

python提供 进口 用于导入模块的关键字。让我们试一试:

import this

如果在解释器中运行此代码,则应将如下内容作为输出:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

你在 Python 身上发现了一个“复活节彩蛋”,叫做“ Python 禅”。它实际上是一种非官方的Python最佳实践。这个 this 模块实际上不做任何事情,但它提供了一个有趣的小方法来演示如何导入某些内容。让我们导入一些我们可以使用的东西,比如 math 模块:

>>> import math
>>> math.sqrt(4)
2.0

这里我们进口了 math 模块,然后我们做了一些新的事情。我们调用了它的一个函数, sqrt (即平方根)。要调用导入模块的方法,必须使用以下语法: module_name.method_name(argument) .在这个例子中,我们找到了4的平方根。这个 math 模块还有许多我们可以使用的功能,例如 cos (余弦) 因式分解log (对数)等。您可以用与您相同的方式调用这些函数。 sqrt .唯一需要检查的是他们是否接受更多的参数。现在让我们看看另一种导入方法。

从使用到导入

有些人不喜欢在他们键入的所有内容前面加上模块名。 Python 有一个解决方案!实际上,您可以只从模块中导入所需的函数。假设我们只想导入 sqrt 功能:

>>> from math import sqrt
>>> sqrt(16)
4.0

它的工作原理非常准确: 从数学模块中导入sqrt函数 .让我用另一种方式来解释。我们用 Python 的 from 关键字导入 sqrt 功能 from 这个 math 模块。还可以使用此方法从数学函数导入多个函数:

>>> from math import pi, sqrt

在这个例子中,我们导入两个 pisqrt .如果你试图进入 pi 您可能已经注意到它实际上是一个值,而不是您可以调用的函数。它只返回π的值。当您进行导入时,您可能最终会导入一个值、一个函数甚至另一个模块!还有一种方法可以导入我们需要涵盖的内容。让我们看看如何导入所有内容!

导入所有内容!

python提供了一种导入 all 模块中的函数和值。这实际上是一个 可能污染 命名空间 想法.名称空间是程序生命周期中所有变量所在的地方。假设你有自己的变量名 sqrt ,像这样:

>>> from math import sqrt
>>> sqrt = 5

现在你已经改变了 sqrt 函数转换为保存值为5的变量。这被称为 阴影 .当您从模块中导入所有内容时,这变得特别棘手。让我们看看:

>>> from math import *
>>> sqrt = 5
>>> sqrt(16)
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
TypeError: 'int' object is not callable

要导入所有内容,而不是指定项目列表,我们只需使用“ * “通配符,这意味着我们要导入所有内容。如果我们不知道里面有什么 math 模块,我们不会意识到我们刚刚删除了一个导入的函数。当我们试图呼叫 sqrt 函数重新分配给一个整数后,我们发现它不再工作。

因此,建议在大多数情况下,您应该使用本章前面提到的方法之一从模块中导入项。这条规则有几个例外。有些模块是使用“*”方法导入的。一个突出的例子是Tkinter,它是包含在Python中的一个工具包,允许您创建桌面用户界面。以这种方式导入Tkinter被认为是可以的,原因是模块的命名方式使您不太可能自己重用一个模块。

总结

现在您已经了解了所有关于python导入的信息。python中包含许多模块,您可以使用它们为程序提供额外的功能。您可以使用内置模块来查询操作系统、从Windows注册表获取信息、设置日志记录实用程序、解析XML等等。我们将在本书的第二部分中介绍其中的一些模块。

在下一章中,我们将着眼于构建我们自己的功能。我想你会发现下一个主题非常有用。