一.迭代器

通过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一次返回一个结果。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐