Python 3.7从零开始学
上QQ阅读APP看书,第一时间看更新

6.2 import的使用

语言的学习只有在不断深入后才能进一步发现其中隐藏的惊人特性,即使是简单的print函数,在不断使用后也会发现更多使用方式,import将带你进入一个更快捷的编程模式。

6.2.1 import语句

在讲解import语句之前先看一个示例:

     import math

r=5 print('半径为5的圆的面积为:%.2f' %(math.pi*r**2))

保存文件名为import_test.py。在cmd命令窗口执行如下命令:

     D:\python\workspace>python import_test.py
     半径为5的圆的面积为:78.54

上面的程序使用了import语句。

import math的意思为从Python标准库中引入math.py模块,这是Python中定义的引入模块的方法。import的标准语法如下:

import module1[, module2[,… moduleN]]

表示允许一个import导入多个模块,但各个模块间需要用逗号隔开。

当解释器遇到import语句时,如果模块在当前搜索路径就会被导入。搜索路径是一个解释器,会先搜索所有目录的列表。

当我们使用import语句时,Python解释器怎样找到对应的文件呢?这涉及Python的搜索路径,搜索路径由一系列目录名组成,Python解释器会依次从这些目录中寻找引入的模块。看起来很像环境变量,事实上可以通过定义环境变量的方式确定搜索路径。搜索路径是在Python编译或安装时确定的,被存储在sys模块的path变量中。查看搜索路径的方式如下:

     import sys

print('Python的搜索路径为:%s' % sys.path)

保存文件名为import_sys.py,在cmd命令窗口执行结果如下:

     D:\python\workspace>python import_sys.py
     Python的搜索路径为:['D:\\python\\workspace', 'E:\\python\\ python37\\python
     37.zip', 'E:\\python\\ python37\\DLLs', 'E:\\python\\ python37\\lib', 'E:\\python\\ python37',
'E:\\python\\python37\\lib\\site-packages']

由以上输出结果看到,sys.path输出了一个列表,第一项输出的是执行文件所在的目录,即我们执行Python解释器的目录(如果是脚本,就是运行脚本所在的目录)。

了解搜索路径的概念后,可以在脚本中修改sys.path引入一些不在搜索路径中的模块。

上面我们初步引入了import语句,除了用import引入模块外,还有另一种方式引入模块,先看交互模式下输入的示例:

     >>> from math import pi
     >>> print (pi)
     3.141592653589793

上面的操作使用了from math import pi的方式,这是什么意思呢?

在Python中,from语句可以从模块中导入指定部分到当前命名空间中,语法如下:

from modname import name1[, name2[, … nameN]]

例如,from math import pi语句就是从math模块中导入pi到当前命名空间,该语句不会将math整个模块导入。比如在math模块中还有sin、exp函数,在这个语句里这两个函数都使用不了,而在导入整个math模块的语句中可以使用。在交互模式下输入:

     >>> import math
     >>> print(math.pi)          #math.pi可以被输出
     3.141592653589793
     >>> print(math.sin(1))           #math.sin(1)可以被输出
     0.8414709848078965
     >>> print(math.exp(1)) #math.exp(1)可以被输出
     2.718281828459045
     >>> from math import pi
     >>> print (pi)                   #pi可以被输出
     3.141592653589793
     >>> print(sin(1))                #sin(1)不可以被输出
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     NameError: name 'sin' is not defined
     >>> print(exp(1))           #exp(1)不可以被输出
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     NameError: name 'exp' is not defined

由以上输出结果可知,如果导入模块,就会得到模块中所有对象;如果指定导入某个对象,就只能得到该对象。

这样做的好处是什么呢?先看如下示例:

     >>> import math
     >>> print(math.pi)
     3.141592653589793
     >>> print(pi)
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     NameError: name 'pi' is not defined
     >>> from math import pi
     >>> print(pi)
     3.141592653589793

由上面的输出结果可知,如果在导入math模块时访问pi对象,需要使用math.pi,直接使用pi访问不了,会报错。使用import语句后,可以直接访问pi对象,不需要加上模块名进行访问。

如果要访问模块中多个对象,是否需要一个一个导入呢?如果要访问math中的pi和sin,是否要写两个from math import语句?例如:

     from math import pi
     from math import sin

当然不用,可以直接使用如下语句:

     from math import pi,sin

可以从一个导入语句导入多个函数,多个函数之间用逗号分割。

如果要访问模块中多个对象,是否需要一个一个导入呢?当然不用,可以直接使用如下语句:

     from math import *

使用该语句可以将math中所有对象都引入,比如上面几种报错的情况就可以成功输出结果了,例如:

     >>> from math import *
     >>> print(pi)           #pi可以被输出
     3.141592653589793
     >>> print(sin(1))             #sin(1)可以被输出
     0.8414709848078965
     >>> print(exp(1))       #exp(1)可以被输出
     2.718281828459045

由输出结果看到,pi、sin、exp等函数都可以被正确输出了。这是一个简单地将项目中所有模块都导入的方法。在实际开发中,这种声明不建议过多使用,这样不利于编写清晰、简单的代码。只有想从给定模块导入所有功能时才使用这种方式。

除了上述几种方式外,还可以为模块取别名,例如:

     >>> import math as m
     >>> m.pi
     3.141592653589793

由输出结果看到,给模块取别名的方式为:在导出模块的语句末尾增加一个as子句,as后面跟上别名名称。

既然可以为模块取别名,当然也可以为函数取别名,例如:

     >>> from math import pi as p
     >>> p
     3.141592653589793

由输出结果可知,我们为pi取了别名为p,为函数取别名的方式和为模块取别名的方式类似,也是在语句后面加上as,as后跟上别名名称。

6.2.2 使用逗号输出

我们在前面的章节已经看到许多使用逗号输出的示例,例如:

     >>> student='小智'
     >>> print('学生称呼:',student)
     学生称呼: 小智

这种方式还可以输出多个表达式,只要将多个表达式用逗号隔开就行,例如:

     >>> greeting='大家好!'
     >>> intriduce='我叫小智,'
     >>> comefrom='我来自智慧城市。'
     >>> print(greeting,intriduce,comefrom)
     大家好! 我叫小智, 我来自智慧城市。

由输出结果看到,不使用格式化的方式也可以同时输出文本和变量值。