1、可迭代对象:
能够进行迭代逐一返回其成员项的对象(能够使用for进行循环输出)
可迭代对象的例子包括:
1、所有序列类型 :如 `list`、 `str` 和 `tuple` 【序列:可通过每个值所在位置的编号(称为索引)访问】
2、非序列类型: `dict`、`set`、`文件对象`
3、实现了 `__iter__()` 方法的任意对象(可迭代协议),
4、实现了序列语义的 `__getitem__()`方法的任意对象
注意点:实现了`__getitem__`方法的被称为可迭代对象(支持迭代操作),但不是Iterable类型
2、迭代协议、迭代器协议
迭代协议:对象定义了一个 `__iter__` 方法的,返回值必须是一个迭代器
迭代器协议: 迭代器协议由一个 `__iter__` 方法和`__next__`方法共同构成。实现了这两个方法的对象就实现了迭代器协议。
1、对象实现了迭代协议的对象
2、对象实现了`__next__`方法,`__next__`方法在迭代完所有数据之后,会抛出`StopIteration`的错误信息。
3、迭代器(Iterator):
1、实现了迭代器协议的对象,就是一个迭代器
2、所有的可迭代对象 都可以通过内置函数iter()转换为迭代器
3、迭代器对象能够使用 内置函数next 进行迭代操作
4、所有的迭代器都是可迭代对象,因为迭代器协议包含了迭代协议
dic4 = {'x': 'A', 'y': 'B', 'z': 'C'} res = iter(dic4.keys()) print(isinstance(res, Iterable)) #True print(isinstance(dic4, Iterator)) #False print(next(res)) # x print(next(res)) # y
li1 = iter([11, 22, 33, 44])
# 设置迭代操作的的起始位置
li1.__setstate__(2)
print(li1.__next__()) # 33
print(li1.__next__()) # 44
print(li1.__next__()) # StopIteration
4、生成器:
1、生成器的定义:
生成器表达式: (i for i in range(10))
生成器函数: 在函数中通过关键字yield来实现生成器函数
2、生成器的迭代操作(生成数据)
内置函数next()
3、和生成器内部数据交互:
send方法可以往生成器内部传递数据
def func01(): print("----start----") yield print('----111----') yield 'python' print('----222----') yield 'java' print('----333----') yield print("----end------") res = func01() r1 = next(res) print(r1) r2 = next(res) print(r2) r3 = next(res) print(r3) r4 = next(res) print(r4) r5 = next(res) print(r5)
----start----
None
----111----
python
----222----
java
----333----
None
----end------
StopIteration
def func01(): for i in range(100): s = yield i print('s:', s) g1 = func01() next(g1) #使用send方法,之前必须有next()启动生成器,不然无法传值 res = g1.send('python') print('res:', res) # res=1 s=python ;send()函数的值直接给s, res=yield i
res = g1.send('java') print('res2:', res) # res=2 s=java