首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开源图书《Python完全自学教程》6.1.2-3import和del语句

开源图书《Python完全自学教程》6.1.2-3import和del语句

作者头像
老齐
发布2022-05-17 09:43:30
发布2022-05-17 09:43:30
93700
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

6.1.2 import 语句

用 Python 关键词(保留字) import 发起的语句,即为 import 语句。对此我们不陌生,比如:

代码语言:javascript
代码运行次数:0
运行
复制
>>> import math       # (8)
>>> math.pow(2, 3)    # (9)
8.0

注释(8)将名为 math 的模块引入到当前环境,这是最常用的一种写法。注释(9)的可读性也很强,明确显示了 pow()math 模块里的函数。由于用模块名称对其后的函数做了限定,如果不同模块有同名的函数,用这样的方式也不会引起冲突。

虽然注释(8)已经很完美了,但如果某个程序中大量地反复使用 math 模块的函数,每次都输入全称是不是有点繁琐?特别是在很多专门领域中,已经对某些模块名称的简称的有了共识,于是就可以为引入的模块名称设置一个别称。

代码语言:javascript
代码运行次数:0
运行
复制
>>> import math as mh   # (10)
>>> mh.pow(2, 3)
8.0

注释(10)的关键词 as 后面的 mh 就是模块 math 的别称,此后它就代表了 math 模块。这种用法在数据科学、机器学习业务中司空见惯(参阅第12章12.4节),例如:

代码语言:javascript
代码运行次数:0
运行
复制
>>> import numpy as np                 # 引入 numpy 别称 np
>>> import torch as t                  # 引入 PyTorch 别称 t
>>> import matplotlib.pyplot as plt    # 引入 matplotlib 别称 plt

在某些情境中,还可能引入模块中某个特定对象,比如,常数 \pi 在程序中使用次数非常多,则可以这样引入:

代码语言:javascript
代码运行次数:0
运行
复制
>>> from math import pi    # (11)
>>> pi
3.141592653589793

注释(11)将 math 模块的 pi 引入到当前环境中,这就意味着在当前程序中,规定 pi 作为专指常数 \pi 的变量——此时,当前环境中通常不能再用名称 pi 引用其他对象。

代码语言:javascript
代码运行次数:0
运行
复制
>>> from math import pow, e, pi
>>> pow(e, pi)
23.140692632779263

上面的代码从模块中同时引入多个对象。如果程序中所使用的模块比较单一,比如某程序仅使用来自 math 模块的函数,还可以用最“省事”的方法:

代码语言:javascript
代码运行次数:0
运行
复制
>>> from math import *
>>> sqrt(9)
3.0

math 中的所有函数都引如到当前程序环境。不过,这种方式的结果是令可读性降低,比较适用于程序代码量较少,且不容易引起混淆的情况。

6.1.3 del 语句

由 Python 关键词 del 发起的语句,能解除名称和对象之间的引用关系。例如:

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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 语言有自动的垃圾收集器,能够自动地将成为垃圾的对象从内存中删除。

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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']

这里有两个变量 booklang 引用了同一个列表对象,当执行 del book 后,变量 book 与列表对象的引用关系被解除,但是引用列表的变量并未清零(还有 lang 引用),所以它不会被视为“垃圾”。

del 不仅能解除变量和对象间的引用关系,还能解除列表中成员位置与对象之间的引用关系——结合第5章5.3节内容理解。

代码语言:javascript
代码运行次数:0
运行
复制
>>> del lang[0]
>>> lang
['java', 'rust', 'php']
>>> lang = ['java', 'rust', 'php']
>>> del lang[:2]
>>> lang
['php']

此处 del 语句与列表的 pop() 方法操作结果等效,但是 pop() 方法有返回值。

代码语言:javascript
代码运行次数:0
运行
复制
>>> lst1 = [1, 2, 3]
>>> lst2 = lst1.copy()
>>> del lst1[0]      # (14)
>>> lst1
[2, 3]
>>> lst2
[1, 2, 3]

lst2lst1 的浅拷贝(参阅第5章5.3节),注释(14)解除了 lst1 中索引为 0 的位置与对象的引用关系,从而使得它所引用的列表变成了 [2, 3] ,但注释(14)并没有解除 lst2 中索引为 0 的位置与整数 1 的引用关系,故其所引用列表依然是 [1, 2, 3]

类似的操作也可用于字典对象:

代码语言:javascript
代码运行次数:0
运行
复制
>>> dct = {'name': "laoqi", 'lang': 'python'}
>>> del dct['name']    # (15)
>>> dct
{'lang': 'python'}

注释(15)的效果是“删除”了一个键值对。

Python 的简单语句,不只是本节所介绍的三个,比如还有 return 语句、yield 语句等,在后续内容中我们会依次学习。

自学建议 先把书“读厚”,是一种很重要的自学方法。以本节所学习的赋值语句、import 语句和 del 语句为例,这些内容都与之前所学的内容关联,在学习的时候,既复习旧知识,又学习新内容,并且用各种方式验证某个语法规则的适用对象和使用方法。这样做虽然不能在 X (X\le 21) 天内“翻完”所有书页,但可以保证每读过一页就能有所收获。这也是以后把书“读薄”的前提。 ”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6.1.2 import 语句
  • 6.1.3 del 语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档