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

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

命名空间与作用域

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

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

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

  • 内建作用域:定义内置函数与内置类型的作用域;
  • 全局作用域:最顶层的作用域;
  • 局部作用域:一般在函数内部,如果在函数内部在嵌套一个函数,会出现嵌套作用域。

作用域测试案例:

num1 = 1
num2 = 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 request
from 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 request
from 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 化的对象。

写在后面

以上内容就是本文的全部内容,希望对学习路上的你有所帮助~

更多精彩

  • 滚雪球学 Python(完结)
  • 滚雪球学 Python 第二轮(完结)
  • 滚雪球学 Python 第三轮
  • 滚雪球学 Python 番外篇(完结)

你可能感兴趣的:(11. python入门复习教程之命名空间与作用域,再谈异常,标准库,持久化与序列化)