【python】迭代器和生成器的区别和联系
一.迭代器通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。#encoding=utf-9li=[5,6,7]it=iter(li)print itprint it.next()print it.next()print it.next(...
·
一.迭代器
通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。
#encoding=utf-9
li=[5,6,7]
it=iter(li)
print it
print it.next()
print it.next()
print it.next()
print it.next() #此次调用会抛异常
举例说明:将列表[1,2,3,4,5,6],生成字典,奇数位为key,偶数位为value
#coding=utf-8
'''
将列表[1,2,3,4,5,6],生成字典,奇数位为key,偶数位为value '''
a = [1,2,3,4,5,6]
b={}
"普通方法"
for i in range(0,len(a),2):
b[a[i]] = a[i+1]
print b
c=iter(a)
d={}
"迭代器"
for i in range(len(a)/2):
key = c.next()
value = c.next()
d[key]=value
print d
二.生成器
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
代码示例:
L = [x * x for x in range(10)]
print L
g = (x * x for x in range(10))
print g
print g.next()
print g.next()
print g.next()
print g.next()
for n in g:
print n
举例说明; ps:yield 通常和生成器一起使用
代码示例:
def odd():
print 'step 1'
yield 1
print 'step 2'
yield 3
print 'step 3'
yield 5
o = odd()
print o.next()
print o.next()
print o.next()
print o.next()
#for i in o:
# print i #可以遍历执行函数
三.异同
1.通过实现迭代器协议对应的__iter__()和next()方法,可以自定义迭代器类型。对于可迭代对象,for语句可以通过iter()方法获取迭代器,并且通过next()方法获得容器的下一个元素。
2.生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。
3.生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。
更多推荐
已为社区贡献1条内容
所有评论(0)