写点什么

11. python 入门复习教程之命名空间与作用域,再谈异常,标准库,持久化与序列化

发布于: 刚刚

如果你学习 python 一段时间之后,会经常碰到命名空间作用域 这两个名词,接下来咱们就从这两个名词开始入手,展开这篇博客。

命名空间与作用域

命名空间是指对象所处的位置,命名二字一般指的是变量名,举一个例子,例如在某个函数内,如果使用了 a = 100 这行代码,遵循的规则是在这个命名空间内,如果之前没有变量 a,那此时定义 a 并且对 a 赋值,如果之前存在 a,那对之前的赋值进行覆盖,这个函数内部,就是变量 a 的命名空间。


作用域指的是某个对象的有效作用范围,这个作用范围又由命名空间决定,所以在一定程度上,作用域和命名空间可以看成一回事情,只是作用域包含的概念更多一些,里面有对象,查找范围,查找规则,是一个大的定义。


一般将 Python 的作用域分为 3 类


  • 内建作用域:定义内置函数与内置类型的作用域;

  • 全局作用域:最顶层的作用域;

  • 局部作用域:一般在函数内部,如果在函数内部在嵌套一个函数,会出现嵌套作用域。


作用域测试案例:


num1 = 1num2 = 2

def func(): # 局部作用域 num1 = 5 print(num1, num2) # 5,2

func()# 全局作用域print(num1, num2) # 1 2
复制代码


在函数内部 num1num2 输出 5 1,在全局作用域下输出 1 2


func 函数中,num1 被重新赋值,所以函数内部作用域范围内,num1=5num2 由于在函数内没有被赋值,所以会遵循变量作用域查找范围,从更高级的 全局作用域 中获取值,得到 num2=2


相应的在全局作用域下,num1num2 依旧保留原值,因函数内的 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 之后,会自动的的安装一些标准库,这些库可以帮助我们更好的开发程序。


接下来摘录部分需要初学阶段就掌握的标准库。


日期库日期库主要就是 datetimetime,这部分在滚雪球第二季中已经进行了说明: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 进行整体查阅:


['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh','ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp','fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p','log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
复制代码


  • sin:正弦;

  • cos:余弦;

  • tan:正切;

  • pow:乘方;

  • sqrt:平方根;

  • radians:获取弧度;

  • degree:获取角度;

  • log:获取自然对数。


以上函数都在特定场景下有用,不做案例展开。


urllib 模块该模块用于请求网络数据,由于日常写爬虫程序使用第三方 requests 模块比较多,一直忽略该模块,今天将其补齐。


urllib.request.urlretrieve 函数使用该函数可以从指定 url 获取文件。


from urllib import requestfrom urllib import parse
request.urlretrieve("https://www.baidu.com/", "./baidu.html")
复制代码


request.urlopen 函数通过该函数可以获取网络数据,获取的对象,通过调用 read 或者 readlines 读取相应的网络数据。


如果网络请求需要参数,可以通过 parse.urlencode 函数对参数进行 URL 编码,例如下述代码:


from urllib import parse
data = parse.urlencode({"q": "爬虫100例"})
复制代码


该参数适用于 POST 请求类型,如果为 GET 请求类型,使用如下代码:


from urllib import requestfrom urllib import parse
data = parse.quote("爬虫100例")
res = request.urlopen(f"https://so.csdn.net/so/search?q={data}")print(res.read())
复制代码


此处涉及的函数如下:


  • quote:对字符串进行 URL 编码;

  • unquote:对字符串进行 URL 解码;

  • quote_plus:与 quote 一致,增加对空白字符的处理;

  • unquote_plus:解码。


data1 = parse.quote("爬虫 100 例")data2 = parse.quote_plus("爬虫 100 例") # 将空格转换为 `+`print(data1, data2)
复制代码

持久化与序列化

将内存中的对象写入文件,终止程序之后依然可以继续使用,这个过程叫做对象持久化,字符串可以直接写入文件,但是字典或者列表不具备此功能,因为针对这类对象,就出现了序列化相关的概念,将对象转换成按顺序排列的字符串形式,就叫做序列化。


将字典持久化使用 shelve 模块可以将字典内容存储到文件中。shelve对象通过下述代码实现:


import shelve
d = shelve.open("my_dict")d.update({"name":"橡皮擦","age":19})d.close()
复制代码


运行代码会在当前文件夹下生成 3 个文件,扩展名忽略即可。



读取 shelve 对象也比较简单。


import shelve
d = shelve.open("my_dict")items = d.items()print(list(items))
复制代码


将对象 pickle 化pickle 模块,也是一个可以将 python 对象进行持久化与序列化的模块,该模块常用的 2 个函数如下:


  • dump:将持久化对象写入文件;

  • load:从文件读取 pickle 化的对象。


更多精彩


发布于: 刚刚阅读数: 2
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
11. python入门复习教程之命名空间与作用域,再谈异常,标准库,持久化与序列化