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

迭代

  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

Python面试题之Python迭代器的更多相关文章

  1. 千万不要错过这几道Python面试题,Python面试题No16

    第1题: python下多线程的限制以及多进程中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性, ...

  2. Python面试题之Python面试题汇总

    在这篇文章中: Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Py ...

  3. python面试题之Python支持什么数据类型?

    所属网站分类: 面试经典 > python 作者:外星人入侵 链接:http://www.pythonheidong.com/blog/article/67/ 来源:python黑洞网,专注py ...

  4. Python面试题之生成器/迭代器

    1.为什么要有生成器? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...

  5. Python面试题之Python正则表达式re模块

    一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...

  6. Python面试题之Python中的lambda map filter reduce zip

    当年龟叔想把上面列出来的这些都干掉.在 “All Things Pythonic: The fate of reduce() in Python 3000”这篇文章中,他给出了自己要移除lambda. ...

  7. Python面试题之Python正则表达式指南

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  8. python面试题三:Python 网络编程与并发

    1 简述 OSI 七层协议. OSI七层协议模型主要是: 应用层(Application):为用户的应用程序(例如电子邮件.文件传输和终端仿真)提供网络服务. 表示层(Presentation):使用 ...

  9. python面试题二:Python 基础题

    1.位和字节的关系? Byte 字节 bit 位 1Byte = 8bit 2.b.B.KB.MB.GB 的关系? 1Byte = 8bit KB 1KB=1024B MB 1MB=1024KB GB ...

随机推荐

  1. 写一个SingleTon,(饿最终、懒同步)

    1.饿汉式: public class SingleTon { private SingleTon(){ } private final static SingleTon instance = new ...

  2. MySQL- INSTR 函数的用法

    测试数据库: MYSQL数据库 INSTR(STR,SUBSTR) 在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX); STR 被搜索的字符串 SUBST ...

  3. Windows 下Hadoop的环境变量配置

    一.安装JDK 1.下载路径:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装到C:\Java\jdk1. ...

  4. Android上几种Animation和多个动画同时播放以ScaleAnimation应用详解

    在API Demo的View->Animation下可以找到四个Animation的Demo,第一个3D Translate比较复杂,最后再讲,先讲第2个Interpolator.该Activi ...

  5. SSM框架---搭建

    SSM框架简介 SSM框架,是spring + spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统. Spr ...

  6. 理解CSS3 isolation: isolate的表现和作用

    转自:http://www.zhangxinxu.com/wordpress/?p=5155 只要元素可以创建层叠上下文,就可以阻断mix-blend-mode! 于是,不仅仅是isolation:i ...

  7. IDEA安装Python环境,并加入Anaconda环境

    为什么做这个事情? 1.首先,Anaconda中已经有各种科学计算环境,包括后面安装的tensorflow 2.通过IDEA中配置就达到了Scala.Python.Java同时运行的目的. Intel ...

  8. TCP implements its own acknowledgment scheme to guarantee successful data delivery

    wTCP本身已经确保传输的成功性. HTTP The Definitive Guide 4.2.4 Delayed Acknowledgments Because the Internet itsel ...

  9. Storm-源码分析- hook (backtype.storm.hooks)

    task hook 在某些task事件发生时, 如果用户希望执行一些额外的逻辑, 就需要使用hook 当前定义如下事件, emit, cleanup, spoutAck-- 用户只需要开发实现ITas ...

  10. 剑指Offer——两个链表的第一个公共结点

    题目描述: 输入两个链表,找出它们的第一个公共结点. 分析: 设置两个指针,分别从两个链表的头部开始往后遍历. 谁遍历完自己本身的,就从另一个链表开始遍历,这样大家到达第一个公共结点的时候便会相遇. ...