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

    列表生成式

    列表生成式可以快速创建list。

    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]

    迭代对象

      常用的迭代对象有str、list、dict等,可以通过dir函数来查看对象的所有方法,可迭代对象有__iter__方法,有__iter__方法的对象都可以进行for循环。

    迭代器

      可以被__next__()函数调用并不断返回下一个值的对象称为迭代器,对象的__iter__()方法就可以获取到对象的迭代器,使用__next__()方法获取对象迭代过程中的下一个元素。

    使用while循环+迭代器来模拟for循环:

    lst = [1,2,3]
        lst_iter = lst.__iter__()
        while 1:
            try:
                i = lst_iter.__next__()
                print(i)
            except StopIteration:
                break

    生成器

      python中可以一边循环一边计算的机制称为生成器:generator,生成器也是可迭代对象。

    创建生成器方法一:

    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>

    创建方式二:

      函数中包含yield关键字,此时这个函数就是生成器函数。

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'

      generator和普通函数的执行流程不一样,普通函数顺序执行,遇到return或者函数最后一行就返回,而generator函数每次调用next()执行,遇到yield语句返回,当再次执行时从上次返回的yield语句出继续执行。

    def odd():
        print('step 1')
        yield 1
        print('step 2')
        yield(3)
        print('step 3')
        yield(5)
    
    >>> o = odd()
    >>> next(o)
    step 1
    1
    >>> next(o)
    step 2
    3
    >>> next(o)
    step 3
    5
    >>> next(o)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
  • 相关阅读:
    JavaEE Tutorials (25)
    洛谷 P2677 超级书架 2
    洛谷 P1029 最大公约数和最小公倍数问题
    洛谷 P1305 新二叉树
    洛谷 P3817 小A的糖果
    洛谷 P1618 三连击(升级版)
    洛谷 P2097 资料分发1
    洛谷 P1068 分数线划定
    洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
    洛谷 P1223 排队接水
  • 原文地址:https://www.cnblogs.com/heshike/p/10497799.html
Copyright © 2011-2022 走看看