年货-亚搏体育手机版-亚搏体育手机版下载

__iter()__函数只需一句话,悬殊return se年货-亚搏体育手机版-亚搏体育手机版下载lf。关于这句话的解说悬殊“回来迭代器本身”。

关于初学者可能会想到:return self便是回来迭代器目标本身的实例罢了,那么python解说器不能自己处理这个实例么?为什么一定要咱们自己显式回来给它呢?

例如完成一个斐波拉契数列迭代器:

class Fib(object):
def __init__(self):
self.a = 0
self.b = 1
def __next__(self):
self.a , self.b = self.b , self.a + self.b
return self.a
def __iter__(self):
return self

调用时这样:

for i in Fib():
print(i)

便是循环Fib()这个实例的特点a罢了,只需完成了next办法就行了,为什么一定要规则_标签17_iter__回来实标签14例本身呢?

回答:

这是个和多态有关的问题,Python中关于迭代有两个概念,第一个是Iterable,第二个是Iterator,协议规则Iterable的__iter__办法会回来一个Iterato标签11r, Iterator年货-亚搏体育手机版-亚搏体育手机版下载的__next__办法(Python 2里是next)会回来下一个迭代目标,假如迭代完毕则抛出StopIteration反常。

一起,Iterator自己也是一种Iterable,所以也需求完成Iterable的接口,也悬殊__iter__,这样在for傍边两者都能够运用。Iterator的__iter__只需求回来自己就行了。这样,下面的代码就能够作业:

for i in 标签5my_list:
...
for i in iter(mylist):
...
for i in (v for v in mylist if v is not None):

Python标签20中许多办法直接回来iterator,比方itertools里边的izip等办法,假如标签17Iterator自己不是Iterable的话,就很不方便,需求先回来一个Iterable目标,再让Iterable回来Iterator。生成器表达式也是一个iterator,明显关于生成器表达式直接运用for是非常重要的。

那么为什么不只保存Itera年货-亚搏体育手机版-亚搏体育手机版下载tor的接口而还需求买卖Iterable呢?许多目标比方list、dict,是能够重复遍历的,乃至能够一起并发地进年货-亚搏体育手机版-亚搏体育手机版下载行遍历,经过__iter__每次回来一个独立的迭代器,就能够确保不同的迭代进程不会相互影响。而生成器表达式之类的成果往往是一次性的,不能够重复遍历,所以直接回来一个Iterator就好。让Iterator也完成Iterable的兼容就能够很灵敏地挑选回来哪一种。

总结来说Ite年货-亚搏体育手机版-亚搏体育手机版下载rator完成的__iter__是为了兼容Iterable的接口,然后让Iterator成为Iterable的一种完成。

弥补一下题主关于for的了解基本上是正确的,但仍然有一点点误差:for为了兼容性其实有两种机制,假如目标有__iter__会运用迭代器,可是假如目标没有__iter__,可是完成了__getitem__,会改用下标迭代的办法。咱们能够试一下:

当for发现没有__iter__可是有__getitem__的时分,会从0开端顺次读取相应的下标,直到发作IndexError停止,这是一种旧的迭代协议年货-亚搏体育手机版-亚搏体育手机版下载。iter办法也会处理这种状况,在不存在__iter__的时分,回来一个下标迭代的iterator目标来替代。一个重要的比如是str,字符串悬殊没有__iter__接口的。

最终多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python体系学习教程,包含从根底的python脚本到web开发、爬虫、数据剖析、数据可视化、机器学习等。想要这些材料的能够标签19重视小编,并在后台私年货-亚搏体育手机版-亚搏体育手机版下载信小编:“01”即可收取。

Write a Comment

电子邮件地址不会被公开。 必填项已用 *标注