xone

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

迭代器

可以用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

 

posted on 2017-04-26 15:30  周小百  阅读(108)  评论(0编辑  收藏  举报