Python 进阶 —— 迭代器与生成器

1. 迭代器

特殊方法__iter__,是迭代器规则(iterator protocol)的基础。

__iter__需要返回一个迭代器(iterator),所谓的迭代器就是具有 __next__()方法(该方法在调用时不需要任何参数)的对象。在调用__next__方法时,迭代器会返回它的下一个值。如果__next()__方法被调用,而迭代器没有值可以返回,就会引发一个StopIteration异常。

class Fibs:
	def __init__(self):
		self.a = 0
		self.b = 1
	def __next__(self):
		self.a, self.b = self.b, self.a + self.b
		return self.a
	def __iter__(self):
			return self
f = Fibs()
for i in f:
	if i > 1000:
		break
	print(i)

2. 基本生成器

  • 对于生成器(generator)对象,
    • Python 2.x:g.next()
    • Python 3.x:g.__next()
  • 生成器的执行流程,在上次返回的 yield 语句处继续执行;
def gen():
	i = 0
	while True:
		i += 1
		yield i
for item in gen():
	print(item)
	if item >= 10:
		break

3. 生成器(generator)进阶

创建一个生成器就像创建一个函数一样简单。

我们以一个展开(flatten)嵌套列表(list of lists)为例进行说明:

def flatten(nested):
	for sublist in nested:
		for elem in sublist:
			yield elem
nested = [[1, 2], [3, 4], [5, 6]]
for num in flatten(nested):
	print(num)
  • 递归生成器

    上一节创建的生成器只能处理两层嵌套,问题来了,如果要处理任意层的嵌套怎么办?递归便派上了用场:

    def flatten(nested):
    	try:
    		for sublist in nested:
    			for elem in flatten(sublist):
    				yield elem
    	except KeyError:
    		yield nested
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值