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

迭代

  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. nmon工具

    下载地址 1.http://nmon.sourceforge.net/pmwiki.php?n=Site.Download tar xvzf  *.tar.gz,需要配置权限 chmod -x,同时配 ...

  2. HighCharts使用心得(转载)

    转载自:http://www.cnblogs.com/Olive116/p/3777021.html 1.  准备工作------下载HighCharts插件 跟ECharts一样,HighChart ...

  3. Windows配置MinGW环境变量

    先安装MinGW 1.添加3个系统变量(根据自己的实际路径) MinGW_INCLUDE_PATH MinGW_LIBRARY_PATH MinGW_PATH 2.将MinGW_PATH添加到Path ...

  4. Whether to hide the cookie from JavaScript

    w禁用js访问特定cookie. https://codeigniter.com/userguide3/helpers/cookie_helper.html $this->load->he ...

  5. packages managers

    nodejs npm/bower/component ...rubygemsperl cpanpython pipOS X homebrewsublime text的package-control 那 ...

  6. intellij idea 主题更换(换黑底或白底)

    更换主题: File-->setting-->Appearance&Behavior-->Appearance Intellij:白底黑字 Darcula:黑底白字

  7. 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

    1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...

  8. windbg遍历进程页表查看内存

    2016-12-09 近期想查看下系统分配了的页的页表项的标志位,但是发现资料较少,所以还是记录下,希望可以对某些朋友有所帮助! 系统:win7 32位虚拟机 平台:KVM虚拟化平台 win7 32位 ...

  9. LInux下桥接模式详解三

    上篇文章介绍了Linux内核桥接模式涉及到的几个结构,本节就重点放在数据包的处理上! 本节所有代码参考LInux 3.10.1内核! 前面已经提到一个数据包从网卡流到Linux内核中的L2层,最终被交 ...

  10. Android开发:带动画的分享效果

    这几天做了个带动画的分享页面.如今把它分享出来,假设你认为实用,请直接使用,避免反复造轮子 先看下效果图 认为仅仅是看效果图不明显.那么用手机扫描以下的二维码下载安装包: