iter, yield与enumerate的实现
模拟实现一个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的实现的更多相关文章
- python进阶学习三——第四天
一. iter&yield迭代器 1.1 iter names = iter(['zeng', 'chun', 'yun']) print(names) print(names.__next_ ...
- 数学之路-分布式计算-disco(4)
第一个參数iter是一个迭代器,涉及被map函数产生的键和值.它们是reduce实例. 在本例中.单词随机被托付给不同的reduce实例.然后,要单词同样,处理它的reduce也同样.可确保终于合计是 ...
- 2019-03-06-day012-生成器与推导式
01 昨日回顾 迭代器: 迭代器有iter方法 next方法就是迭代器 递归: 自己调用自己 明确的结束条件 递归的最大深度 官方 1000 实际测试:998/997 import sys sys.s ...
- mapPartitions
mapPartitions操作与 map类似,只不过映射的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器,如果映射过程需要频繁创建额外的对象,使用mapPartitions操作要比map操 ...
- 使用T4模板调用Sqlserver链接生成自己的模板
<#@ template debug="false" hostspecific="false" language="C#" #> ...
- 机器学习入门-交叉验证选择参数(数据切分)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 ...
- python3 生成器笔记
#生成器def MyDemo(M): for i in range(M): yield i**2for item in MyDemo(9): print(item) # #生成器import sysa ...
- day12——生成器、推导式、简单内置函数
day12 生成器 迭代器:python中内置的一种节省空间的工具 生成器的本质就是一个迭代器 迭代器和生成器的区别:一个是pyhton自带的,一个是程序员自己写的 写一个生成器 基于函数 在函数中将 ...
- sparkJavaApi逐个详解
说明:掌握spark的一个关键,就是要深刻理解掌握RDD各个函数的使用场景,这样我们在写业务逻辑的时候就知道在什么时候用什么样的函数去实现,得心应手,本文将逐步收集整理各种函数原理及示例代码,持续更新 ...
随机推荐
- springMvc 支持hibernate validator
SpringMVC 支持Hibernate Validator 发表于9个月前(2014-08-04 11:34) 阅读(1780) | 评论(0) 11人收藏此文章, 我要收藏 赞0 5月23日 ...
- ASP.NET LINQ SQL执行超时的问题
最近在写一个航材取价的程序.由于执行的语句复杂,数据量比较大,容易造成超时. 看提示应该是执行SQL的时候超时,我在程序中用的linq. 实际把SQL语句单独执行的时候观察也要40秒左右. 查资料得知 ...
- sql server varchar(10)和 nvarchar(10)存储数据长度
) 存储10个字母,英文标点符号等,5个汉字以及中文标点等. )存储10汉字.字母等,不区分中英文.
- perl正则表达式第三周笔记
正则引擎的分类 正则引擎的分类 正则引擎的分类主要分两种: DFA:egrep.awk.lex.flex NFA:.NET.PHP.Perl.Ruby.Python.GNU Emacs.ed.sec. ...
- JS 操作日期
var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...
- java简易编辑器
package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swi ...
- codeforces 632D. Longest Subsequence 筛法
题目链接 记录小于等于m的数出现的次数, 然后从后往前筛, 具体看代码. #include <iostream> #include <vector> #include < ...
- 批量添加target属性
<script> addTarget(); function addTarget(){ var oa=document.getElementsByTagName('a'); for(var ...
- angular的$q服务和promise模式
此承诺/延迟(promise/deferred)实现的灵感来自于 Kris Kowal's Q CommonJS Promise建议文档 将承诺(promise) 作为和 异步执行操作(action) ...
- 51nod 1237 最大公约数之和 V3(杜教筛)
[题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...