Python之生成器、迭代器

一.生成器

形如K=[i*i for i in range(8)]的列表推导式可以用一行代码实现循环语句,使得Python代码更加简洁。如下用列表推导式来做一个二重循环:
data = [[70+x+y+(x * y)%3 for x in range(4)] for y in range(9)]
但列表推导式也存在一个问题,就是它必须要先构造一个完整的列表,故其容量受内存大小的限制,而且并不是其中的每一个元素都会被用到,有时候仅仅用到前面几个,这就会造成内存资源的浪费。最近自己也在补计算机方面的知识,要加强对内存资源的利用的敏感度。
而生成器仅仅保存一个算法,列表元素可以根据算法逐个推导出来而不需要构造整个列表。它一次生成一个元素,而不是一下子填满内存,这样极大地节省了内存空间。把[ ]改成( )就得到一个简单的生成器了,如gen=(i * i for i in range(8)),这也被称为生成器表达式。只要用next()函数就可以逐个调出生成器中产生的元素。从另一个角度看,如果一个函数中包含关键字yield,它就不再是普通的函数了,瞬间被提升为generator。yield关键字拥有独一无二的停止执行、保存状态和继续执行的能力。变成generator的函数,每次调用next()的时候执行,遇到yield后返回,而下次执行时从上次的yield语句处继续执行。
计算前10个自然数平方和的迭代器:
sum(x*x for i in range(10))
实现杨辉三角的迭代器:
def triangles():
	x=[1]
	while True:
		yield x
		x=[1]+[x[i]+x[i+1] for i in range(len(x)-1)]+[1]
二.迭代器

生成器是迭代器的一种,凡是可以被next()函数调用并 不断返回下一个值的对象都被称为迭代器。迭代器表示的是一个数据流,我们不需要知道这个数据流的具体长度,只要能通过next()函数产生下一个元素就可以了。迭代器协议被分成两个部分,一部分是生产者,另一部分是消费者,生产者那里可以提供数据,尽管我们不知道这些数据的总量有多少,一次只提供一个元素给消费者。
迭代器与可迭代对象不是一个概念,我们把可以直接作用于for循环的对象统称为可迭代对象,Python中的列表、字符串、字典、元组等都是可迭代对象,但它们不是迭代器,要把它们变成迭代器很容易,放到iter()函数中就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值