zoukankan      html  css  js  c++  java
  • python 生成器&迭代器

    列表生成式

    要生成[1x1, 2x2, 3x3, ..., 10x10]
    >>> [x * x for x in range(1, 11)]
    for循环后面还可以加上if判断
    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]

    还可以使用两层循环,可以生成全排列:
    >>> [m + n for m in 'ABC' for n in 'XYZ']
    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

    >>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
    >>> for k, v in d.items():
    ... print(k, '=', v)
    ...
    y = B
    x = A
    z = C

    把一个list中所有的字符串变成小写:
    >>> L = ['Hello', 'World', 'IBM', 'Apple']
    >>> [s.lower() for s in L]
    ['hello', 'world', 'ibm', 'apple']

    生成器:generator
    第一种方法,只要把一个列表生成式的[]改成(),就创建了一个generator:
    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>
    创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。

    通过next()函数获得generator的下一个返回值:
    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    使用for循环,因为generator也是可迭代对象:
    >>> g = (x * x for x in range(10))
    >>> for n in g:
    ... print(n)

    /////////////////a, b = b, a + b(赋值语句)
    另一种方法
    一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
    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的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    迭代器
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator

    把list、dict、str等Iterable变成Iterator可以使用iter()函数:
    >>> isinstance(iter([]), Iterator)
    True
    凡是可作用于for循环的对象都是Iterable类型;
    凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列

     

    朝闻道
  • 相关阅读:
    各种经典透镜投影模型
    表达式和运算
    数组
    如何使用布尔类型
    如何使用数字类型
    如何使用字符串类型
    如何声明变量,如何给变量赋值
    变量 构造函数 New 关键字
    调用write方法打印语句到浏览器
    MVC中几种常用ActionResult
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8453858.html
Copyright © 2011-2022 走看看