文章插图
完美!但等一下 , 我不是说迭代器也具有__iter __()方法吗?那是因为迭代器也是可迭代的 , 但反过来不成立 。它们是自己的迭代器 。让我通过遍历迭代器向你展示这个概念:
sample = ['data science', 'business analytics', 'machine learning'] it = sample.__iter__() itit = it.__iter__() print(type(itit)) print(itit.__next__()) print(itit.__next__()) print(itit.__next__())
文章插图
酷!但我们可以使用iter()和next()来代替__iter__()和__next__()方法 , 它们提供了一种更简洁的方法:
sample = ['statistics', 'linear algebra', 'probability'] # iterator it = iter(sample) # next values print(next(it)) print(next(it)) print(next(it))
文章插图
但如果我们超过了调用next()方法的限制次数 , 该怎么办?这会发生什么呢?
print(next(it))
文章插图
是的 , 我们得到了一个错误!如果我们在到达迭代器的末尾之后尝试访问下一个值 , 则会引起StopIteration异常 , 该异常的意思是“你不能更进一步了!” 。
我们可以使用异常处理来处理此错误 。实际上 , 我们可以自己构建一个循环来遍历可迭代的项:
sample = ['statistics', 'linear algebra', 'probability'] it = iter(sample) while True: # this will execute till an error is raised try: val = next(it) # when we reach end of the list, error is raised and we break out of the loop except StopIteration: break print(val)
文章插图
如果你退后一步 , 你会意识到 , 这正是for循环在底层运行的方式 。我们在此处手动循环中所做的操作 , for循环会自动执行相同的操作 。这就是为什么for循环比遍历可迭代对象更可取 , 因为它们会自动处理异常 。
每当我们迭代一个可迭代对象时 , for循环通过iter()知道要迭代的项 , 并使用next()方法返回后续的项 。
在Python中创建一个迭代器既然我们知道了Python迭代器是如何工作的 , 我们可以更深入地研究并从头开始创建一个迭代器 , 以更好地了解其是如何凑效的 。
我将创建一个用于打印所有偶数的简单迭代器
class Sequence(): def __init__(self): self.num = 2 def __iter__(self): return self def __next__(self): val = self.num self.num += 2 return val
让我们分解一下这段Python代码:- __init __()方法是类构造函数 , 调用类时会首先执行该函数 。它用于分配程序执行期间类最初所需的任何值 。我在这里设置num变量的初始值为2;
- iter()和next()方法使这个类变成了迭代器;
- iter()方法返回迭代器对象并对迭代进行初始化 。由于类对象本身是迭代器 , 因此它返回自身;
- next()方法从迭代器中返回当前值 , 并改变下一次调用的状态 。我们将num变量的值加2 , 因为我们只打印偶数 。
推荐阅读
- 单株古树茶是什么,8种普洱古树纯料茶
- 2021双十一活动什么时候开始?
- 三大平原中面积最大的是什么?
- 世界十大最昂贵名画是什么?
- 纯元皇后为什么叫菀菀?
- 什么星座最疼摩羯座?
- 《大王饶命》的吕小鱼结局是什么?
- 淘宝上架用什么软件 淘宝自动上下架最好的软件
- 道家养生与中医养生,养生是什么
- 春季爬山的好处 要注意些什么