迭代器(用来生成惰性序列)

迭代器的理解,学过Java的都是知道的,java也是都是由迭代器的,而且是一种设计思想,实际上。可以把迭代器理解成一种特殊的 list + function实际上,迭代器是一个特殊的函数

迭代器的特性

  1. 可迭代的
  2. 使用next这个内置函数来移动内部的下一个指针
  3. 通过 for 遍历的时候实际也是调用 next,遍历结束,意味着使用 next 的次数已经超出

迭代器的创建方法

  1. 将列表生成表达式 [] 换成 () 之后我们得到的就是一个 generator()
g = (x for x in range(1,11)) # 这样,我们的g就是一个迭代器
  1. 类似函数,但是使用 yield 关键字
def t_yield():
    yield 0
    yield 1
    yield 2
    yield 3


g = t_yield()
for item in g:
    print(item)

上面的代码里面,我们每次调用一次 next() 函数,g就会返回一个 yield 后面的值

迭代器是函数,怎么获取返回值

正常情况下,next 可以获取迭代器的下一个值,既然能够获取下一个值,就说明这个迭代器函数就还没有结束,因此我们要获取返回值,就需要迭代器的 yield 都已经结束了

def t_yield():
    _sum = 0
    for i in range(0, 2):
        _sum += i
        yield i
    return _sum


# 正常便利,遍历结束意味着 next 指针已经指向了最后,再次执行将会返回(报错)
g = t_yield()
for item in g:
    print(item)

try:
    a = next(g)
except StopIteration as e:  # 实际的错误是 StopIteration
    print(e.value)          # None ??? 为什么

再看看下面的结果

def t_yield():
    _sum = 0
    for i in range(0, 2):
        _sum += i
        yield i
    return _sum


# 正常便利,遍历结束意味着 next 指针已经指向了最后,再次执行将会返回(报错)
g = t_yield()
next(g)
next(g)

try:
    a = next(g)
except StopIteration as e:  # 实际的错误是 StopIteration
    print(e.value)          # 2