美文网首页
python入门(三)迭代器和生成器

python入门(三)迭代器和生成器

作者: 淡漠不淡漠 | 来源:发表于2019-11-08 09:50 被阅读0次

迭代器

  • 迭代器可以记住遍历位置的对象
  • list、tuple、dict都只是可以迭代的对象,不是迭代器,所以要创建一个迭代器
  • 迭代器的俩个基本方法 iter() 和 next()
  • iter() 用于创建一个迭代器、next() 输出当前位置的对象,只能往前不能后退
  • 从一个简单的例子开始,list 输出前俩个元素
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)  #创建迭代器
print(next(it))
print(next(it))
#输出结果
1
2
  • 如何用于for循环呢
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)
for x in it:
    print(x)
#输出结果
1
2
3
4
5
6
7
8
9
  • 使用next()方法来遍历呢
  • next()遍历到最后的时候会抛出StopIteration异常,捕获然后跳出循环
#!/usr/bin/python3
num = [1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(num)
while True:
    try:
        print(next(it))
    except StopIteration:
        break
#输出结果 同上

生成器

  • 生成器是迭代器的一种
  • 使用yield函数 就像单步调试一样记住当前执行的位置,使用next()之后会从原来的位置继续执行。
  • 先来个简单的例子看下怎么使用
#!/usr/bin/python3
def foo():
    while True:
        yield 4
        print('end....')

f = foo()
print(next(f))
print('中间')
print(next(f))
#输出结果
4
中间
end....
4
  • 使用def 定一个了一个函数foo,单独看这个函数while循环一直是true,这里先把yield 看成return返回4
  • f = foo() 将函数赋值给了f
  • 执行print(next(f)) 会先输出4
  • 由于使用了yield 所以函数不会继续执行
  • 那就执行print('中间') 输出了 ‘中间’
  • print(next(f)) 这次再次执行会在原来的执行位置继续执行 print('end....')
  • 最后while继续执行输出 4

总结一下:其实从例子完全可以看出, yield会返回一个结果,并且记住当前执行的位置,通过使用next() 会在原来执行的位置继续执行程序。

来一个稍微复杂点的,使用生成器实现斐波那契数列

#!/usr/bin/python3
def foo(n):
    a, b, item = 0, 1, 1
    while True:
        if(item > n):
            return
        yield b
        a, b = b, a+b
        item+=1

f = foo(10)
while True:
    try:
        print(next(f))
    except StopIteration:
        print('end...')
        break

#输出结果
1
1
2
3
5
8
13
21
34
55
end...

相关文章

网友评论

      本文标题:python入门(三)迭代器和生成器

      本文链接:https://www.haomeiwen.com/subject/oifibctx.html