迭代器协议、可迭代对象(迭代器)、三元表达式、生成器
今天说的这老几位可是老牛逼了,认真看,咱们挨个介绍哈。
1、迭代器协议
(1)有一个next()方法
(2)只能往后走不能往前退
2、可迭代对象
可迭代对象又叫做迭代器,什么是可迭代对象呢?
很简单,满足迭代器协议的对象就是可迭代对象。
说白了,就是满足前面那两条:有一个next()方法,只能往后走不能往前退。
--注意:for循环就是进行迭代,比如:
li = [1,2,3,4,5}
for i in li:
print(i)
上面这个例子其实就是利用for循环来实现对li列表的遍历,那么列表li就是迭代器吗?
很抱歉,不仅列表不是,元组、字符串、字典、集合通通不是迭代器。
那么问题来了,那怎么能够被for循环进行遍历呢?
因为它们自身有一个__inte__()方法,调用这个方法以后就是一个迭代器了。
res = li.iter() -- res此时就是一个迭代器,不信打印一下res看看
print(res) 输出:<list_iterator object at 0x000001ECE05C8358> 意思获取的是一个可迭代对象的内存地址
print(res.next()) -- 注意,迭代器一次只能拿出一个值。
3、三元表达式
这个就有点意思了,其实作用就是减少代码量。直接看例子吧!
for i in range(5):
if i < 3:
print(i)
改写三元表达式(这里的做法是列表解析):
[i for i in range(5) if i < 3]
注意:i是一元、for i in range(5)是一元、if i < 3是一元,故为三元。
4、生成器
所谓生成器,其实就是一个迭代器(可迭代对象),说白了就是直接就有一个next()方法。
生成器咋玩的?其实就是一个就是把列表解析的[]换成小括号。废话不多说,直接来个例子吧。
res = (i for i in range(5)) -- 这就是传说中的生成器表达式
print(res)
输出:<generator object <genexpr> at 0x0000019698E1FE08> --这就是一个生成器对象
res.__next()__
或
next(res)
一次拿出一个值。