3.1 导入Python标准库
相比于单纯安装Python而言,使用Anaconda安装Python有一个好处,它提前帮我们安装了大量常用的库(如NumPy或Matplotlib等),我们要做的就是,在用这些库之前,先将它们导入(import)当前工程。
导入其他库的方法很简单,语法如下。
比如,当我们想计算某个角的正弦值时,要引用模块math。这时,就要在Python文件开始的地方用import math来导入。在调用math模块中的函数时,必须遵照如下格式。
当Python解释器遇到import语句时,如果模块在当前搜索路径下,就会被自动导入。
为了后面程序引用方便,也可以在导入模块的同时为模块取一个更加简单的别名(这个操作是可选项),然后用“别名.函数(属性)名”的方式来使用其中的函数或属性,示例代码如下。
这里,我们简单解释一下In [7]处的代码。一些初学者可能会困惑,Numpy库下属的方法array()为何会有两层圆括号呢?乍看下,这有违C、C++、Java等编程语言的惯例。
事实上,Python并没有违反常规,array()接收的参数只有一个,而这里的参数恰好是一个元组(1, 2, 3, 4, 5),碰巧元组的外围装饰就是一对圆括号,放在一起好像这个函数的参数需要用两层括号包裹一样,然而这纯属巧合。类似的误读还可能发生在列表上,读者可以思考一下,在哪些情况下,某个对象索引会出现两层方括号[[]]?
上面使用模块中对象的方法有点烦琐。有没有更简单的方法呢?答案是有的。我们可以通过如下方法从某个模块中导入指定的对象。
使用这种方法,可以从较大的类库包中导入某个特定的对象,并为这个对象取一个别名(这是可选项)。这样做的好处在于,减少了对象的查询次数,提高了访问速度,当然也减少了用户的代码输入量。因为在使用这些被导入的对象时,就像使用本地对象一样可以“直呼其名”,代码如下所示。
当然,还有一种极端的方式,即把整个模块中的所有函数一次性地全部导入,如下所示。
①这里“*”为通配符,表示模块内的所有对象。
上述代码虽然写起来比较简单(直接使用函数名,不需要用到“模块名.函数名”的形式),但并不推荐使用。这是因为,模块存在的目的之一,就是构建命名空间(namespace)。通过命名空间,可以实现变量作用域的隔离,从而使得相同的变量名也可以在各自区域内自由使用。
这就好比我们说“北京的张三”和“上海的张三”是可区分的。如果我们把“北京的”和“上海的”这两个条件去掉,剩下两个同名的“张三”,就无法区分了,而这里的“北京的”和“上海的”就好比编程语言中的命名空间。
回到模块加载的讨论上,如果我们使用“import *”来加载某个模块的所有对象,实际上就是去掉了这个模块的命名空间限制,如果多个模块都是通过“import *”来加载的,那么同名的对象,只有最后一个有效,而之前加载的对象,由于没有区分度,便会被后出现的同名对象所覆盖。