11. python 入门复习教程之命名空间与作用域,再谈异常,标准库,持久化与序列化
如果你学习 python 一段时间之后,会经常碰到命名空间,作用域 这两个名词,接下来咱们就从这两个名词开始入手,展开这篇博客。
命名空间与作用域
命名空间是指对象所处的位置,命名二字一般指的是变量名,举一个例子,例如在某个函数内,如果使用了 a = 100
这行代码,遵循的规则是在这个命名空间内,如果之前没有变量 a
,那此时定义 a
并且对 a
赋值,如果之前存在 a
,那对之前的赋值进行覆盖,这个函数内部,就是变量 a
的命名空间。
作用域指的是某个对象的有效作用范围,这个作用范围又由命名空间决定,所以在一定程度上,作用域和命名空间可以看成一回事情,只是作用域包含的概念更多一些,里面有对象,查找范围,查找规则,是一个大的定义。
一般将 Python 的作用域分为 3 类
内建作用域
:定义内置函数与内置类型的作用域;全局作用域
:最顶层的作用域;局部作用域
:一般在函数内部,如果在函数内部在嵌套一个函数,会出现嵌套作用域。
作用域测试案例:
在函数内部 num1
与 num2
输出 5 1
,在全局作用域下输出 1 2
。
在 func
函数中,num1
被重新赋值,所以函数内部作用域范围内,num1=5
,num2
由于在函数内没有被赋值,所以会遵循变量作用域查找范围,从更高级的 全局作用域 中获取值,得到 num2=2
。
相应的在全局作用域下,num1
与 num2
依旧保留原值,因函数内的 num1
是重新定义,与全局作用域中的 num1
不是同一变量,这句话需要反复理解。
再谈异常
在 python 中存在两种错误,第一种是运行前错误,比较常见的就是语法错误,第二种是运行时错误,只有当程序运行起来,才会发现错误,例如列表索引溢出 BUG。
我们已经非常熟悉通过 try... except...
去捕获异常了,其中 except
可以多次重复出现,即捕获不同异常内容。
第一个要回顾的知识点就是处理异常的格式:
except
:接受所有异常;except 异常类
:仅接受异常类;except 异常类 as 变量
:仅接受异常类,并获取异常类的对象;else
:无异常时进行的操作;finally
:最终执行代码。
异常出现红字之后,关注最下方的一行,就比较容易掌握错误的内容。
常见的异常与异常原因:
SyntaxError
:语法错误,重点排查代码书写问题,丢失括号,丢失引号,缩进不对等,比较容易排查;Exception
:运行时异常:NameError
:找不到变量名就会出现;AttributeError
:调用不存在的对象属性时,出现的 BUG;TypeError
:类型错误,例如数字与字符串相加;IndexError
:索引错误,索引超出就会引发错误;KeyError
:字典找不到键;ImportError
:模块导入错误;UnicodeDecodeError
:解码错误;UnicodeEncodeError
:编码错误;
python 标准库
安装好 python 之后,会自动的的安装一些标准库,这些库可以帮助我们更好的开发程序。
接下来摘录部分需要初学阶段就掌握的标准库。
日期库日期库主要就是 datetime
和 time
,这部分在滚雪球第二季中已经进行了说明:https://dream.blog.csdn.net/article/details/114413866
正则库正则表达式不是 python 里面的知识点,而是全编程体系下的知识点,在 python 中重点学习的是 re
库,该知识点在第二季中也有涉及,请查阅:https://dream.blog.csdn.net/article/details/114648366。
数学函数库一些常用的数学函数,例如三角函数,对数等内容在 math
模块中,这个模块在之前的系列中没有进行过多的说明,本篇博客进行适当补充。
math 中的常量
math.pi
:常量 π;math.e
:常量 e;
math 中的函数在列清单之前,先通过 dir
进行整体查阅:
sin
:正弦;cos
:余弦;tan
:正切;pow
:乘方;sqrt
:平方根;radians
:获取弧度;degree
:获取角度;log
:获取自然对数。
以上函数都在特定场景下有用,不做案例展开。
urllib 模块该模块用于请求网络数据,由于日常写爬虫程序使用第三方 requests
模块比较多,一直忽略该模块,今天将其补齐。
urllib.request.urlretrieve 函数使用该函数可以从指定 url 获取文件。
request.urlopen 函数通过该函数可以获取网络数据,获取的对象,通过调用 read
或者 readlines
读取相应的网络数据。
如果网络请求需要参数,可以通过 parse.urlencode
函数对参数进行 URL 编码,例如下述代码:
该参数适用于 POST 请求类型,如果为 GET 请求类型,使用如下代码:
此处涉及的函数如下:
quote
:对字符串进行 URL 编码;unquote
:对字符串进行 URL 解码;quote_plus
:与quote
一致,增加对空白字符的处理;unquote_plus
:解码。
持久化与序列化
将内存中的对象写入文件,终止程序之后依然可以继续使用,这个过程叫做对象持久化,字符串可以直接写入文件,但是字典或者列表不具备此功能,因为针对这类对象,就出现了序列化相关的概念,将对象转换成按顺序排列的字符串形式,就叫做序列化。
将字典持久化使用 shelve
模块可以将字典内容存储到文件中。shelve
对象通过下述代码实现:
运行代码会在当前文件夹下生成 3 个文件,扩展名忽略即可。
读取 shelve
对象也比较简单。
将对象 pickle 化pickle
模块,也是一个可以将 python 对象进行持久化与序列化的模块,该模块常用的 2 个函数如下:
dump
:将持久化对象写入文件;load
:从文件读取 pickle 化的对象。
更多精彩
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/650827437ae20821f0fd9abc2】。文章转载请联系作者。
评论