迭代器与生成器

Posted gost

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器与生成器相关的知识,希望对你有一定的参考价值。

迭代器是代表数据流的对象;该对象一次返回一个元素的数据。Python迭代器必须支持一种__next__()不带任何参数的方法 ,并且始终返回流的下一个元素。如果流中没有更多元素,则 __next__()必须引发StopIteration异常。但是,迭代器不必一定是有限的。编写一个生成无限数据流的迭代器是完全合理的。

内置iter()函数接受一个任意对象,并尝试返回一个迭代器,该迭代器将返回对象的内容或元素,TypeError如果该对象不支持迭代则会引发 该迭代器。Python的几种内置数据类型支持迭代,最常见的是列表和字典。如果可以为其获取迭代器,则该对象称为迭代。

>>> L = [1,2,3]
>>> it = iter(L)
>>> it  #doctest: +ELLIPSIS
<...iterator object at ...>
>>> it.__next__()  # same as next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

  Python在几个不同的上下文中期望可迭代对象,最重要的是for语句。在语句中,Y必须是迭代器或可以为其创建迭代器的某些对象这两个语句是等效的:for in Yiter()

for i in iter(obj):
    print(i)

for i in obj:
    print(i)

  可以用list()或者tuple()构造函数将迭代器构造为列表或者元组

>>> L = [1,2,3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)

  序列解压也可以用迭代器,如果知道迭代对象的数量的话

>>> a =[1,2,3]
>>> it = iter(a)
>>> a,b,c = it
>>> a,b,c
(1, 2, 3)

  文件还通过调用readline() 方法直到文件中没有更多行来支持迭代这意味着您可以像这样读取文件的每一行

import os
filepath =os.path.join(os.getcwd(), ‘去重.txt‘)
for line in open(filepath, ‘r‘, encoding=‘utf8‘):
    print(line)

  

 

 

  生成器

生成器是一类特殊的函数,可简化编写迭代器的任务。常规函数计算一个值并返回它,但是生成器返回一个迭代器,该迭代器返回值流

我自己实现一个简单的生成器,任何包含yleid的函数都是生成器函数,调用生成器函数时,它不会返回单个值;而是返回一个支持迭代器协议的生成器对象,类似于 return语句。yieldreturn 语句之间的最大区别是,到达yield生成器时,将暂停生成器的执行状态,并保留局部变量。在下一次调用生成器的__next__()方法时,该函数将继续执行。

>>> def func(n):
...     for i in range(n):
...             yleid(i)

  下面是一个简单的生成器案例,利用生成器输出斐波那契数列

>>> def fab(n):
...     a, b = 0, 1
...     while n>0:
...         n -= 1
...         yield(b)
...         a, b = b, a+b
...
>>> [i for i in fab(10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

如何判断一个函数是否是一个特殊的 generator 函数?可以利用 isgeneratorfunction 判断:

>>> from inspect import isgeneratorfunction
>>> isgeneratorfunction (fab)
True

未完待续

以上是关于迭代器与生成器的主要内容,如果未能解决你的问题,请参考以下文章

python 基础篇 13 迭代器与生成器

Python迭代器与生成器

第五篇Python之迭代器与生成器

Python迭代器与生成器

Python迭代器与生成器

6Python全栈之路系列之迭代器与生成器