迭代器与生成器
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 X in Y
iter()
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
语句。yield
和return
语句之间的最大区别是,到达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
未完待续
以上是关于迭代器与生成器的主要内容,如果未能解决你的问题,请参考以下文章