迭代器
可以用isinstance()判断一个对象是否是Iterable
In [1]: from collections import Iterable In [2]: isinstance("abc",Iterable) Out[2]: True In [3]: isinstance([],Iterable) Out[3]: True In [4]: isinstance({},Iterable) Out[4]: True
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
可以用isinstance()判断一个对象是否是Iterator对象
In [6]: from collections import Iterator In [7]: isinstance("abc",Iterator) Out[7]: False In [8]: isinstance([],Iterator) Out[8]: False In [10]: isinstance((i for i in range(10)),Iterator) Out[10]: True
iter()函数
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数
In [12]: isinstance("abc",Iterator) Out[12]: False In [13]: isinstance(iter("abc"),Iterator) Out[13]: True In [14]: isinstance([],Iterator) Out[14]: False In [15]: isinstance(iter([]),Iterator) Out[15]: True
In [16]: a = [11,22,33] In [17]: isinstance(a,Iterator) Out[17]: False In [18]: b = iter(a) In [19]: isinstance(b,Iterator) Out[19]: True In [20]: next(b) Out[20]: 11 In [21]: next(b) Out[21]: 22 In [22]: next(b) Out[22]: 33 In [23]: next(b) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-23-adb3e17b0219> in <module>() ----> 1 next(b) StopIteration:
只要函数里出现了yield,这个函数就不能叫普通函数,叫生成器函数。
执行这个生成器函数就获取到一个生成器。
yield具备保存上一次执行位置的功能
def xrange(): print(11) yield 1 print(22) yield 2 print(33) yield 3 # r叫生成器,具有一种生成能力。 r = xrange() # 生成器的__next__方法,执行函数寻找下一个yield ret = r.__next__() print(ret) ret = r.__next__() print(ret) ret = r.__next__() print(ret)
以上代码执行结果:
11 1 22 2 33 3
def xrange(n): start = 0 while True: if start >= n: return yield start start +=1 # r就叫生成器,具有一种生成能力。 r = xrange(5)
# 具有访问能力的东西,就叫迭代器 ret = r.__next__() print(ret) ret = r.__next__() print(ret) ret = r.__next__() print(ret) ret = r.__next__() print(ret) ret = r.__next__() print(ret)
以上代码执行结果:
0
1
2
3
4
for循环相当于来内部调用了__next__()
def xrange(n): start = 0 while True: if start >= n: return yield start start +=1 for i in xrange(5): print(i)
以上代码执行结果:
0
1
2
3
4