Python面试题之Python迭代器

网友投稿 327 2022-09-02


Python面试题之Python迭代器

要理解迭代器,首先要从字面意思来说。

迭代

重复下一次重复基于上一次的结果

软件开发就是典型的迭代更新。

讲迭代,我们就先来模拟一下迭代:

现在让我们使用​​while​​​循环来遍历出一个列表​​list1 = [1, 2, 3, 4, 5]​​里面的所有元素。

index = 0while index < len(list1): pirnt(list1[index]) index += 1

接下来用​​for​​循环来:

for index in range(len(list1)): print(list1[index])

很显然,上面两种方式都能实现遍历一个列表里面的所有元素。但是,它们都依赖于列表的索引,如果我们要遍历一个没有索引的数据类型,比如说字典和集合。那应该怎么办呢?

你可能知道在Python中可以直接使用for去遍历一个列表、元祖、字典、集合等数据类型。就像下面这样:

for i in list1: # 不依赖索引就能取出list1中的所有元素 print(i)

那么在Python中,上面的for循环究竟是怎么实现的呢?

其实跟我们今天要讲的迭代器有非常重要的关系。接下来,我们就一步一步的来介绍下迭代器的相关内容。

可迭代对象

我们之前学过的能被​​for​​​循环的有字符串、列表、字典、元祖、集合、打开的文件句柄,这些对象有什么共同特点呢?共同点就是它们都有一个叫​​__iter__​​的方法。

总结一下:

只要一个对象有​​__iter__​​方法,那么这个对象就可以叫做可迭代对象。

字符串、列表、字典、元祖、集合、打开的文件句柄都是可迭代对象。

再简单、直白一点?在Python中能够被for循环的都是可迭代对象。

迭代器

上面说到的那些有​​__iter__​​​方法的对象,如果调用一下这个特殊的​​__iter__​​方法会发生什么呢?

补充:

dict1 = {"a": 1, "b":2, "c":3}# 相当于执行了dict.__iter__(),类似len(dict1)相当于dict.__len__()d = iter(dict1)

那执行iter(dict1)或者说调用dict1.__iter__方法得到的是什么呢?得到的就是一个迭代器,它有一个特殊的方法,叫__next__方法。

总结一下:

只要一个对象有​​__iter__​​​方法和​​__next__​​方法,那么这个对象就可以叫做迭代器。

对一个可迭代对象调用它的​​__iter__​​方法,得到的就是迭代器对象。

迭代器的特点

优点:

不依赖索引惰性计算,节省内存

缺点:

不如按索引取值方便一次性,只能往后取,不能往回退

for循环实质

for i in [1, 2, 3, 4, 5]: ...

相当于:

i = [1,2,3,4,5].__iter__() # 获得迭代器while True: try: x = i.__iter__() # 获得下一个值 except StopIteration: break # 遇到StopIteration就退出循环

内置方法介绍:

无限记数:

from itertools import countcounter = count(start=13)print(next(counter))13print(next(counter))14

环状迭代:

from itertools import cyclecolors = cycle(["red","yellow","green"])print(next(colors))redprint(next(colors))yellowprint(next(colors))green


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python面试题之Python反射详解(python反射的作用和方法)
下一篇:Python基础笔记之同时装了Python3和Python2,怎么在命令行使用pip
相关文章

 发表评论

暂时没有评论,来抢沙发吧~