python 迭代器和生成器

迭代器:迭代(iterate)意味着重复多次,就像循环那样,像实现了方法 __iter__ 的对象。方法 __iter__ 返回一个迭代器,它是包含方法 __next__ 的对象,而调用这个方法时可不提供任何参数。当你调用方法 __next__ 时,迭代器应返回其下一个值

这是迭代器创建序列的方法:

class TestIterator:
	value = 0
	def __next__(self):
		self.value += 1
		if self.value > 10: raise StopIteration #如果在这个方法中没有if条件判断,迭代器将会无限循环下去
		return self.value
	def __iter__(self):
		return self
ti = TestIterator()
print(list(ti))

在很多情况下,都在另一个对象中实现返回迭代器的方法 __iter__ ,并在 for 循环中使用这个对象。但推荐在迭代器中也实现方法 __iter__ (并像刚才那样让它返回 self ),这样迭代器就可直接用于 for 循环中。

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
fibs = Fibs()
for f in fibs:
	if f > 1000: #如果没有这条语句,迭代器会无限循环下去
		print(f)
		break

生成器:包含 yield 语句的函数都被称为生成器

生成器不是使用 return 返回一个值,而是可以生成多个值,每次一个。每次使用 yield 生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始继续执行。

生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。生成器的函数是由 def 语句定义的,其中包含 yield 。生成器的迭代器是这个函数返回的结果。用不太准确的话说,这两个实体通常被视为一个,通称为生成器

def flatten(nested):
	for sublist in nested:
		for element in sublist:
			yield element
nested = [[1,3], [4,3], [2, 5]]
for num in flatten(nested):
	print(num)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值