Python_生成器和迭代器的区别

Python_生成器和迭代器的区别[Python基础]

迭代器和生成器的区别是什么?这个问题面试的时候经常作为灵魂拷问。今天一起从概念到代码梳理一遍,作为总结和记录。

区别是:

  • 生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

基础概念

  1. 迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。

    列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。

  2. 迭代器协议:对象需要提供next()方法,通过它返回迭代中的下一项,直到返回终止抛出StopIteration异常。
  3. 可迭代对象:实现了迭代器协议对象。list、tuple、dict都是可迭代对象(Iterable),但不是迭代器对象(Iterator)。

    需要使用内建函数iter(),把这些都变成可迭代器对象(Iterable)。

  4. for item in Iterable:循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法,

    来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

操作一下

  • 迭代器:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。

>>> list = [1,2,3]

>>> lt = iter(list)

>>> print(next(lt))

1

>>> print(next(lt))

2

>>> print(next(lt))

3

>>> print(next(lt))

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

StopIteration

  • 生成器:本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。

>>> def g():

... for i in range(3):

... yield i

...

>>> g = g()

>>> next(g)

0

>>> next(g)

1

>>> next(g)

2

>>> next(g)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

StopIteration

yield语句与return语句一样,都起到返回的作用。但yield与return不同,如果执行return语句,直接返回return后面表达式的值。但执行yield语句,返回的是一个生成器对象,而且这个生成器对象的当前值,就是yield语句后面跟的表达式的值。调用yield语句后,当前函数就会返回一个迭代器,而且函数会暂停执行,直到对该函数进行下一次迭代。

生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题 。

参考链接:
http://dwz.date/daG5
http://dwz.date/daG6

以上是 Python_生成器和迭代器的区别 的全部内容, 来源链接: utcz.com/z/537725.html

回到顶部