分享

python迭代器和生成器区别

 文炳春秋 2020-04-07
迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string、list、dict、tuple 等这类容器对象,使用 for 循环遍历是很方便的。

在后台 for 语句对容器对象调用 iter()函数,iter()是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,next() 也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异常。(推荐学习:Python视频教程

1

2

3

4

5

# 随便定义一个list

listArray=[1,2,3]

# 使用iter()函数

iterName=iter(listArray)

print(iterName)

生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# 菲波那切数列

def Fib(max):

    n, a, b = 0, 0, 1

    while n < max:

        yield b

        a, b = b, a + b

        n = n + 1

    return '亲!没有数据了...'

# 调用方法,生成出10个数来

f=Fib(10)

# 使用一个循环捕获最后return 返回的值,保存在异常StopIteration的value中

while  True:

    try:

        x=next(f)

        print("f:",x)

    except StopIteration as e:

        print("生成器最后的返回值是:",e.value)

        break

区别:

生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration 异常。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多