专栏首页JetpropelledSnakePython面试题之Python迭代器

Python面试题之Python迭代器

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

迭代

  1. 重复
  2. 下一次重复基于上一次的结果

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

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

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

index = 0
while 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__方法,得到的就是迭代器对象。

迭代器的特点

优点:

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

缺点:

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

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 count
counter = count(start=13)
print(next(counter))
13
print(next(counter))
14

环状迭代:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python入门之迭代器/生成器/yield的表达方式/面向过程编程

     本章内容     迭代器     面向过程编程       一、什么是迭代       二、什么是迭代器       三、迭代器演示和举例       四、生...

    Jetpropelledsnake21
  • 在Python中实现单例模式

    有些时候你的项目中难免需要一些全局唯一的对象,这些对象大多是一些工具性的东西,在Python中实现单例模式并不是什么难事。以下总结几种方法: 使用类装饰器 ...

    Jetpropelledsnake21
  • Linux学习笔记之Linux启动级别

    对于绝大多数Linux程序员来说,进入Linux系统后一般看到的是黑乎乎的界面(开发模式),因为系统如果启动选择开发模式,会减少启动时间,优化内存等。但是通常我...

    Jetpropelledsnake21
  • 详解Python内置函数iter()用法

    iter()函数用来返回指定对象的迭代器,有两种用法:iter(iterable)和iter(callable, sentinel),前者要求参数必须为序列或者...

    Python小屋屋主
  • Python迭代和解析(2):迭代初探

    for的关键字在于"迭代"和"遍历"。首先要有容器数据结构(如列表、字符串)存储一些元素供迭代、遍历,然后每次取下一个元素通过in来测试元素的存在性(从容器中取...

    py3study
  • python iterator(迭代器)

    迭代:重复做一件事 iterable(可迭代)对象:支持“每次仅返回自身所包含的其中一个元素”的对象 iterable对象实现了__iter__方法     ...

    py3study
  • 【机器学习算法系列】机器学习中梯度下降法和牛顿法的比较

    在机器学习的优化问题中,梯度下降法和牛顿法是常用的两种凸函数求极值的方法,他们都是为了求得目标函数的近似解。在逻辑斯蒂回归模型的参数求解中,一般用改良的梯度下降...

    统计学家
  • Python 拓展之迭代器

    今天来讲讲「迭代器」的内容,其实已经拖了好多天了,感觉再不写就要忘记了。「迭代」相信对你来说已经不陌生了,我前面曾经专门用一篇文章来讲,如果你已经没有什么印象的...

    Rocky0429
  • 3097: Hash Killer I

    3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special Judge Su...

    HansBug
  • ​CODING 敏捷项目管理全新改版上线

    CODING 敏捷项目管理全新版本现已上线,新版本深度结合敏捷开发理念,完美支持 Scrum 迭代式增量开发过程,可根据团队需要设计独一无二的工作流,适应不同规...

    CODING研发管理系统

扫码关注云+社区

领取腾讯云代金券