模拟实现一个enumerate函数

def myEnumerate(seq, start=0):
results = []
n = start
for i in seq:
results.append((n, i))
return results

返回一个list, 如果list数据过多,则占用内存太大。而迭代器每次只需要很小的内存。再往下看迭代器。

迭代器

内建函数iter()可以生成一个iterator迭代器。相比list来说,iterator不需要很大的内存空间。

迭代器通过next()来遍历元素,并且完成遍历时抛出StopIteration()异常。

it = iter(range(5))
print it.next() # 0
print it.next() # 1
print it.next() # 2
print it.next() # 3
print it.next() # 4 print it.next() # StopIteration()

可以用for循环对迭代器进行遍历

it = iter(range(5))
for i in it:
print i print it.next() # StopIteration()

遍历完成时,调用it.next(),抛出StopIteration()异常。可以看出for循环调用的是next()方法。就像下边这样。

while True:
try:
print it.next()
except StopIteration:
break

用迭代器改进enumerate的实现

一个类只要实现了__iter__与next()方法, 便可以进行迭代。

class myEnumerate:
def __init__(self, seq, start=0):
self.seq = seq
self.start = start
self.n = 0 def __iter__(self):
return self def next(self):
if self.n == len(self.seq):
raise StopIteration()
item = self.seq[self.n]
index = self.start
self.n += 1
self.start += 1
return index, item

使用迭代器解决了空间占用的问题,不过代码也太繁琐了,一点没有python风格。

yield

于是,简洁的代码便来了。一个可迭代的并且简洁的简洁的方案。使用next()方法会依次返回元素,并且越界时报StopIteration异常。

def myEnumerate(seq, start=0):
n = start
for i in seq:
yield n, i
n += 1 it = myEnumerate(range(5))
print it.next() # (0, 0)
print it.next() # (1, 1)
print it.next() # (2, 2)
print it.next() # (3, 3)
print it.next() # (4, 4)
print it.next() # StopIteration

iter, yield与enumerate的实现的更多相关文章

  1. python进阶学习三——第四天

    一. iter&yield迭代器 1.1 iter names = iter(['zeng', 'chun', 'yun']) print(names) print(names.__next_ ...

  2. 数学之路-分布式计算-disco(4)

    第一个參数iter是一个迭代器,涉及被map函数产生的键和值.它们是reduce实例. 在本例中.单词随机被托付给不同的reduce实例.然后,要单词同样,处理它的reduce也同样.可确保终于合计是 ...

  3. 2019-03-06-day012-生成器与推导式

    01 昨日回顾 迭代器: 迭代器有iter方法 next方法就是迭代器 递归: 自己调用自己 明确的结束条件 递归的最大深度 官方 1000 实际测试:998/997 import sys sys.s ...

  4. mapPartitions

    mapPartitions操作与 map类似,只不过映射的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器,如果映射过程需要频繁创建额外的对象,使用mapPartitions操作要比map操 ...

  5. 使用T4模板调用Sqlserver链接生成自己的模板

    <#@ template debug="false" hostspecific="false" language="C#" #> ...

  6. 机器学习入门-交叉验证选择参数(数据切分)train_test_split(under_x, under_y, test_size, random_state), (交叉验证的数据切分)KFold, recall_score(召回率)

    1. train_test_split(under_x, under_y, test_size=0.3, random_state=0)  # under_x, under_y 表示输入数据, tes ...

  7. python3 生成器笔记

    #生成器def MyDemo(M): for i in range(M): yield i**2for item in MyDemo(9): print(item) # #生成器import sysa ...

  8. day12——生成器、推导式、简单内置函数

    day12 生成器 迭代器:python中内置的一种节省空间的工具 生成器的本质就是一个迭代器 迭代器和生成器的区别:一个是pyhton自带的,一个是程序员自己写的 写一个生成器 基于函数 在函数中将 ...

  9. sparkJavaApi逐个详解

    说明:掌握spark的一个关键,就是要深刻理解掌握RDD各个函数的使用场景,这样我们在写业务逻辑的时候就知道在什么时候用什么样的函数去实现,得心应手,本文将逐步收集整理各种函数原理及示例代码,持续更新 ...

随机推荐

  1. 让 collabtive-11 支持中文

    collabtive, 不错的项目管理工具, 将在新项目中使用之; 但在默认安装 collabtive-11 之后 发现在里面输入中文后会出错, 网上找不了少资料但对 11这版本的中文支持的修改不起不 ...

  2. 怎么增加照片的KB大小

    之前都是要想办法压缩图片的大小 今天有人发来一张1.8MB的图片让我帮忙调到30MB左右 一下子放大这么多着实有点茫然 之后想到了一个办法 首先把图片占用体积变大,是不会增加清晰度的,而减小占用体积却 ...

  3. tomcat无法正常启动的一个原因

    简要报错信息: java.lang.IllegalArgumentException: Document base E:\apache-tomcat-7.0.65\webapps\springmvc0 ...

  4. PHP判断是中文还是英文

    static function ischinese($s){ $allen = preg_match("/^[^/x80-/xff]+$/", $s); //判断是否是英文 $al ...

  5. 以正方教务系统为例,用php模拟登陆抓取课表、空教室

    课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. 其实稍微了解一点php的话,我们也可以做一个类似这样的web ...

  6. codeblock编译Object-C

    http://blog.csdn.net/ldl22847/article/details/7482971 http://www.cnblogs.com/qingyuan/p/3524791.html ...

  7. 阿里云ECS每天一件事D4:安装mysql5.5.40

    Linux平台上MySQL也没什么好说的了,首先准备一下软件环境: yum install gcc gcc-c++ gcc-g77 autoconf automake make cmake bison ...

  8. 浅谈qt 布局器

    在一个颜值当道的今天,无论买衣服,买车还是追星,颜值的高低已经变成了大家最看重的(不管男性女性都一样,千万别和我说你不是):而对于程序猿来说,开发一款软件,不再只注重逻辑和稳定性,美观和用户友好性也是 ...

  9. QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)

    如何使QTreeView快速显示1000万条数据,并且内存占用量少呢?这个问题困扰我很久,在网上找了好多相关资料,都没有找到合理的解决方案,今天在这里把我的解决方案提供给朋友们,供大家相互学习. 我开 ...

  10. Delphi XE的RTTI增强,动态Hook某些内部事件

    Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下: Delphi2010 ...