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
  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/heshike/p/10497799.html
Copyright © 2011-2022 走看看