python和生成器的区别_解析Python中的生成器及其与迭代器的差异

本文介绍了Python中的生成器和迭代器概念,解释了它们之间的区别,并提供了代码示例帮助理解。生成器作为一种特殊的迭代器,能有效节省内存并提高执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成器生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()操作,进行生成器的入口开始执行代码,yield操作向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另一个next()操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield操作时重复上面的过程。Python的循环操作与C语言的实现不同,如果使用List等数据结构需要耗费大量的内容;循环操作中使用生成器只需要在内存中实例化一个对象,可以减少内存占用,提高循环操作的执行速度。

>>>def myG():

... yield 1

... yield 2

... yield 3

...

>>>g=myG()

>>>next(g)

1

>>>next(g)

2

>>>next(g)

3

>>>next(g)

Traceback (most recent call last):

File "", line 1, in

StopIteration

>>>g2=myG()

>>>for i in g2:

... print(i)

1

2

3

生成器表达式for...[if]...语句可以简洁的构建一个List,同时也可以用来构建生成器。

>>>a=[7,8,9]

>>>b=[i**2 for i in a]

>>>b

[49, 64, 81]

>>>ib=(i**2 for i in a)

>>>ib

at 0x7f72291217e0>

>>>next(ib)

49

>>>next(ib)

64

>>>next(ib)

81

>>>next(ib)

Traceback (most recent call last):

File "", line 1, in

StopIteration

迭代器(Iterator)与生成器(Generator)的区别迭代器是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和iter方法返回自己本身。

每个生成器都是一个迭代器,但是反过来不行。通常生成器是通过调用一个或多个yield表达式构成的函数s生成的。同时满足迭代器的定义。

当你需要一个类除了有生成器的特性之外还要有一些自定义的方法时,可以使用自定义的迭代器,一般来说生成器更方便,更简单。

def squares(start, stop):

for i in xrange(start, stop):

yield i*i

等同于生成器表达式:

(i*i for i in xrange(start, stop))

列表推倒式是:

[i*i for i in xrange(start, stop)]

如果是构建一个自定义的迭代器:

class Squares(object):

def __init__(self, start, stop):

self.start = start

self.stop = stop

def __iter__(self):

return self

def next(self):

if self.start >= self.stop:

raise StopIteration

current = self.start * self.start

self.start += 1

return current

此时,你还可以定义自己的方法如:

def current(self):

return self.start

两者的相同点:对象迭代完后就不能重写迭代了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值