如果你学习 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
在函数内部 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
进行整体查阅:
['__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 番外篇(完结)