zoukankan      html  css  js  c++  java
  • Python3 迭代器和生成器

    1.迭代器 Iterator

      迭代器是一个可以记住遍历的位置的对象。

      迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

      迭代器有两个基本的方法:iter() 和 next()

      list=[1,2,3,4]
      it = iter(list) # 创建迭代器对象
      for x in it:    #next(it)
        print (x, end=" ")

      一类是集合数据类型,如listtupledictsetstr等;

      一类是generator,包括生成器和带yield的generator function(生成器函数)。

      这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

      可以使用isinstance()判断一个对象是否是Iterable对象:

    >>> from collections.abc import Iterable
    >>> isinstance([], Iterable)
    True
    >>> isinstance({}, Iterable)
    True

       生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

      把listdictstrIterable变成Iterator可以使用iter()函数:

    >>>from collections.abc import Iterator
    >>> isinstance(iter([]), Iterator)
    True
    >>> isinstance(iter('abc'), Iterator)
    True

      Python的for循环本质上就是通过不断调用next()函数实现.

    2.生成器
      在Python中,这种一边循环一边计算的机制,称为生成器:generator。

       创建generator。第一种方法,只要把一个列表生成式的[]改成(),就创建了一个generator:

    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>
    >>> next(g) # 通过next()函数获得generator的下一个返回值
    0
    >>> next(g)
    1

    #也可用for循环来获取,并且不需要关心StopIteration的错误
    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ...     print(n)
     

      第二种,生成器函数。调用一个生成器函数,返回的是一个迭代器对象。

      在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

    使用 yield 实现斐波那契数列:

    #!/usr/bin/python3
     
    import sys
     
    def fibonacci(n): # 生成器函数 - 斐波那契
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n): 
                return
            yield a
            a, b = b, a + b
            counter += 1
    f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
     
    while True:
        try:
            print (next(f), end=" ")
        except StopIteration:
            sys.exit()

    yield返回值及给yield传参,要搞清楚其中的过程

    # x=yield 返回值

    # 一:
    # def dog(name):
    # print('道哥%s准备吃东西啦...' %name)
    # while True:
    # # x拿到的是yield接收到的值
    # x = yield # x = '肉包子'
    # print('道哥%s吃了 %s' %(name,x))
    #
    #
    # g=dog('alex')
    # g.send(None) # 等同于next(g)
    #
    # g.send(['一根骨头','aaa'])
    # # g.send('肉包子')
    # # g.send('一同泔水')
    # # g.close()
    # # g.send('1111') # 关闭之后无法传值

    摘录自python3菜鸟教程和廖雪峰python3

    这篇写得不错:https://www.cnblogs.com/lvcm/p/9372622.html

  • 相关阅读:
    Python学习之路:MINST实战第一版
    Python学习之路:NumPy进阶
    Python学习之路:NumPy初识
    Python学习之路:一天搞定基础部分
    7. 整数反转(leetcode)
    1. 两数之和(leetcode)
    172. 阶乘后的零(leetcode)
    Java模拟斗地主发牌(Collections工具类的应用)
    CF刷题-Codeforces Round #481-G. Petya's Exams
    【android】安卓平台版本和API版本的对应关系
  • 原文地址:https://www.cnblogs.com/yunlong-study/p/12555338.html
Copyright © 2011-2022 走看看