用 Python 关键词(保留字) import
发起的语句,即为 import 语句。对此我们不陌生,比如:
>>> import math # (8)
>>> math.pow(2, 3) # (9)
8.0
注释(8)将名为 math
的模块引入到当前环境,这是最常用的一种写法。注释(9)的可读性也很强,明确显示了 pow()
是 math
模块里的函数。由于用模块名称对其后的函数做了限定,如果不同模块有同名的函数,用这样的方式也不会引起冲突。
虽然注释(8)已经很完美了,但如果某个程序中大量地反复使用 math
模块的函数,每次都输入全称是不是有点繁琐?特别是在很多专门领域中,已经对某些模块名称的简称的有了共识,于是就可以为引入的模块名称设置一个别称。
>>> import math as mh # (10)
>>> mh.pow(2, 3)
8.0
注释(10)的关键词 as
后面的 mh
就是模块 math
的别称,此后它就代表了 math
模块。这种用法在数据科学、机器学习业务中司空见惯(参阅第12章12.4节),例如:
>>> import numpy as np # 引入 numpy 别称 np
>>> import torch as t # 引入 PyTorch 别称 t
>>> import matplotlib.pyplot as plt # 引入 matplotlib 别称 plt
在某些情境中,还可能引入模块中某个特定对象,比如,常数 \pi 在程序中使用次数非常多,则可以这样引入:
>>> from math import pi # (11)
>>> pi
3.141592653589793
注释(11)将 math
模块的 pi
引入到当前环境中,这就意味着在当前程序中,规定 pi
作为专指常数 \pi 的变量——此时,当前环境中通常不能再用名称 pi
引用其他对象。
>>> from math import pow, e, pi
>>> pow(e, pi)
23.140692632779263
上面的代码从模块中同时引入多个对象。如果程序中所使用的模块比较单一,比如某程序仅使用来自 math
模块的函数,还可以用最“省事”的方法:
>>> from math import *
>>> sqrt(9)
3.0
将 math
中的所有函数都引如到当前程序环境。不过,这种方式的结果是令可读性降低,比较适用于程序代码量较少,且不容易引起混淆的情况。
由 Python 关键词 del
发起的语句,能解除名称和对象之间的引用关系。例如:
>>> my_name = "laoqi"
>>> del my_name # (12)
>>> my_name # (13)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'my_name' is not defined
注释(12)删除了 my_name
,其本质是解除了变量 my_name
与字符串 'laoqi'
之间的引用关系,而 Python 中不允许存在“游离”的变量,从表象上,就出现了注释(13)的结果——抛出异常:变量 my_name
没有定义。那个字符串呢?它由于不被变量引用,我们也无法得到它,就变成了“垃圾”。Python 语言有自动的垃圾收集器,能够自动地将成为垃圾的对象从内存中删除。
>>> book = lang = ['python', 'java', 'rust', 'php']
>>> del book
>>> book
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'book' is not defined
>>> lang
['python', 'java', 'rust', 'php']
这里有两个变量 book
和 lang
引用了同一个列表对象,当执行 del book
后,变量 book
与列表对象的引用关系被解除,但是引用列表的变量并未清零(还有 lang
引用),所以它不会被视为“垃圾”。
del
不仅能解除变量和对象间的引用关系,还能解除列表中成员位置与对象之间的引用关系——结合第5章5.3节内容理解。
>>> del lang[0]
>>> lang
['java', 'rust', 'php']
>>> lang = ['java', 'rust', 'php']
>>> del lang[:2]
>>> lang
['php']
此处 del
语句与列表的 pop()
方法操作结果等效,但是 pop()
方法有返回值。
>>> lst1 = [1, 2, 3]
>>> lst2 = lst1.copy()
>>> del lst1[0] # (14)
>>> lst1
[2, 3]
>>> lst2
[1, 2, 3]
lst2
是 lst1
的浅拷贝(参阅第5章5.3节),注释(14)解除了 lst1
中索引为 0
的位置与对象的引用关系,从而使得它所引用的列表变成了 [2, 3]
,但注释(14)并没有解除 lst2
中索引为 0
的位置与整数 1
的引用关系,故其所引用列表依然是 [1, 2, 3]
。
类似的操作也可用于字典对象:
>>> dct = {'name': "laoqi", 'lang': 'python'}
>>> del dct['name'] # (15)
>>> dct
{'lang': 'python'}
注释(15)的效果是“删除”了一个键值对。
Python 的简单语句,不只是本节所介绍的三个,比如还有 return 语句、yield 语句等,在后续内容中我们会依次学习。
★自学建议 先把书“读厚”,是一种很重要的自学方法。以本节所学习的赋值语句、import 语句和 del 语句为例,这些内容都与之前所学的内容关联,在学习的时候,既复习旧知识,又学习新内容,并且用各种方式验证某个语法规则的适用对象和使用方法。这样做虽然不能在 X (X\le 21) 天内“翻完”所有书页,但可以保证每读过一页就能有所收获。这也是以后把书“读薄”的前提。 ”