gpt4 book ai didi

解析Python中的生成器及其与迭代器的差异

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章解析Python中的生成器及其与迭代器的差异由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> 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 "<stdin>" , line 1 , in <module>
StopIteration
>>>g2 = myG()
>>> for i in g2:
...  print (i)
1
2
3

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>>a = [ 7 , 8 , 9 ]
>>>b = [i * * 2 for i in a]
>>>b
[ 49 , 64 , 81 ]
>>>ib = (i * * 2 for i in a)
>>>ib
<generator object <genexpr> at 0x7f72291217e0 >
>>> next (ib)
49
>>> next (ib)
64
>>> next (ib)
81
>>> next (ib)
Traceback (most recent call last):
  File "<stdin>" , line 1 , in <module>
StopIteration

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

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

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

?
1
2
3
def squares(start, stop):
   for i in xrange (start, stop):
     yield i * i

等同于生成器表达式:

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

列表推倒式是:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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

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

?
1
2
def current( self ):
   return self .start

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

最后此篇关于解析Python中的生成器及其与迭代器的差异的文章就讲到这里了,如果你想了解更多关于解析Python中的生成器及其与迭代器的差异的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com