1.迭代器与生成器

1.可迭代对象iterable

可迭代对象,通常是一个可迭代取值的容器对象,如列表、元组、字符串、集合、字典。换言之,我们新建一个列表、元组、字符串、集合、字典,就相当于生成了一个可迭代对象。
要判断一个对象是否是可迭代对象,就看它是否实现了__iter__方法。对于上述提到的列表、元组、字符串、集合、字典,我们可以使用dir()查看其支持的方法,若其中有__iter__,说明其是可迭代对象。

'__iter__' in dir([1,2,3])  # True
'__iter__' in dir((1,2,3))  # True
'__iter__' in dir({1,2,3})  # True
'__iter__' in dir({1: 2,3: 4})  # True
'__iter__' in dir('1,2,3')  # True

除此之外,我们还可以使用下面的代码来判断一个对象是不是可迭代对象。

from collections import Iterable
for obj in [[1], (1,2), {1}, {1:2}, 'abc']:
	assert(isinstance(obj, Iterable))

2.迭代器iterator

迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration的异常,终止迭代过程。
给可迭代对象加上iter()就变成了一个迭代器,所有的迭代器都是迭代对象。
我们可以查看iter(obj)的类型来证实,type(iter(list([1,2,3])))的结果为一个list_iterator类,type(iter((1,2,3)))的结果为一个tuple_iterator类,type(iter({1,2,3}))的结果为一个set_iterator类,type(iter(dict()))的结果为一个str_iterator类。

3.生成器generator

生成表达式或者生成函数通常都是生成器,生成器都是迭代器,使用next()表示一次迭代。

4.关系描述

下图是上述术语之间的关系:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值