您的位置:首页 > 编程语言 > Python开发

Python之生成器、迭代器

2016-01-28 17:39 417 查看

一.生成器

形如K=[i*i for i in range(8)]的列表推导式可以用一行代码实现循环语句,使得Python代码更加简洁。但列表推导式也存在一个问题,就是它必须要先构造一个完整的列表,故其容量受内存大小的限制,而且并不是其中的每一个元素都会被用到,有时候仅仅用到前面几个,这就会造成内存资源的浪费。最近自己也在补计算机方面的知识,要加强对内存资源的利用的敏感度。

而生成器仅仅保存一个算法,列表元素可以根据算法逐个推导出来而不需要构造整个列表。它一次生成一个元素,而不是一下子填满内存,这样极大地节省了内存空间。把[ ]改成( )就得到一个简单的生成器了,如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()函数中就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: