迭代器
>>> a=[1,2,3]
>>> it=iter(a)
>>> print(it)
<list_iterator object at 0x000001AC6F61AB08>
>>> print(it.__next__())
1
>>> print(it.__next__())
2
>>> print(it.__next__())
3
>>> print(it.__next__())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> a=[1,2,3,4,5]
>>> a=iter(a)
>>> next(a)
1
>>> next(a)
2
>>> next(a)
3
>>> next(a)
4
>>> next(a)
5
>>>
>>> try:
... next(a)
... except StopIteration:
... print("没有元素可以用了")
...
没有元素可以用了
自定义迭代器
iter()和__next__()方法这两个方法是迭代器最基本的方法:
➢一个用来获得迭代器对象
➢一个用来获取容器中的下一个元素
class MyRange(object):
def __init__(self, n):
self.idx = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.idx < self.n:
val = self.idx
self.idx += 1
return val
else:
raise StopIteration()
myRange = MyRange(3)
print (next(myRange))
print (next(myRange))
print (next(myRange))
C:\Users\39621>py -3 d:\2019\py1.py
0
1
2
生成器
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推 算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python 中,这种一边循环一边计算的机制,称为生成器(Generator)。
迭代器只是遍历,生成器要计算。
l=(x*x for x in range(10))
print(l)
print(next(l))
print(next(l))
print(next(l))
for i in l:
print(i)
C:\Users\39621>py -3 d:\2019\py1.py
<generator object <genexpr> at 0x0000020FFBE236C8>
0
1
4
9
16
25
36
49
64
81
def odd():
print ('step 1')
yield 1
print ('step 2')
yield 3
print ('step 3')
yield 5
o = odd()
print (next(o))
print (next(o))
print (next(o))
for i in o:
print (i) #可以遍历执行函数
迭代器与生成器的区别
通过实现迭代器协议对应的__iter__()和__next__()方法 ,可以自定义迭代器类型。对于可迭代对象,for语句可 以通过iter()方法获取迭代器,并且通过next 方法获得容器的下一个元素。
生成器是一种特殊的迭代器, 内部支持了生成器协议,不需要明确定义__iter__()和 next()方法。
生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。