8.1 容器
容器是存储多个值(对象)的数据类型。
由于这些容器类都实现了一个叫作__contains__()的方法,因此可以使用in或not in来判断某个值(对象)是否存在于某个容器内。
8.1.2 可迭代的和迭代器
1.迭代
指逐个遍历容器对象的每个元素。
2.可迭代和迭代器的区别
一个对象是可迭代的是指它所属的类定义了一个可以返回一个迭代器的__iter__()方法,该对象称为可迭代对象。
是迭代器,指它所属的类定义了__next__()方法,该方法要么返回可迭代对象的下一个元素,要么抛出一个StopIteration异常。
3.__getitem__()方法
def __getitem__(self,i):
i是关键字,该类实际上类似python的dict类。
def __setitem__(Self,key,value):
self.dict[key]=value
用于设置一个键的值。
8.3.1 生成器
是一个用于创建迭代器的简单而强大的工具,也是一个可以产生一系列值的函数。
会记住上次执行的语句。
1.生成器函数(包含yield关键字的函数)
def gen(n):
for i in range(n):
yield i
以关键字yield开头的语句会产生一个返回值。通过传递相应的参数给这个生成器函数,可以创建一个生成器对象。
2.生成器表达式
类似列表解析式,但把[]换成()。
g=(i for i in range(5))
it=iter(g)
print(next(g)) #输出0
8.5.1 标准库的迭代器工具
1.函数zip()
zip(*iterables)
- 如果没有参数,返回空的迭代器。
- 如果输入一个可迭代对象,返回一个数据元素(turple的迭代器),每个turple是由多个输入迭代器中对应的元素构成的。
- 如果输入多个可迭代对象,则返回一个数据元素(turple的迭代器),每个turple由分别来自输入的可迭代对象的对象元素构成。
zip对象是一个可迭代对象,因此可以用它构造一个list对象,但不能构造一个turple对象。
无法每次添加迭代过程中产生的新元素。
2.函数enumerate()
输入一个可迭代对象,返回一个enumerate对象,该对象也是一个可迭代对象,其每个元素形如(index,value)。
第二个参数用于指定下标的起始值。
3.Itertools模块
(1)函数chain()
返回将多个可迭代对象串联起来的可迭代对象。
(2)count()
count(start=0,step=1)
(3)islice()
islice(iterablr,stop)
islice(iterable,start,stop[,step])
(4)cycle()
产生一个重复循环iterable对象中的值的迭代器。
(5)repeat()
产生一个times个重复值为object的迭代器。只作用于只有一个值的对象object。
8.2 闭包
8.2.1 作用域
程序变量(或函数)的作用范围,即这些变量(或函数)能够被访问的范围。
8.2.2 嵌套函数
在其他函数内定义的函数。
8.2.3 什么是闭包
一个函数对象记住了其包围环境的一些信息。
- 必须有一个嵌套函数
- 嵌套函数必须引用其包围函数的一个值
- 包围函数必须返回嵌套函数
8.2.5 函数的闭包属性__closere__
返回一个由cell对象组成的元组对象。cell对象的cell_contents就是闭包中的数据。
Exp.__closere__
exp_e.__closure__