美文网首页PYTHON基础
9.解析式与生成器

9.解析式与生成器

作者: Stone_説 | 来源:发表于2020-12-15 01:14 被阅读0次

    目录
    1.列表解析
    2.生成器表达式
    3.集合解析式
    4.字典解析式

    1. 列表解析介绍

    1.1 列表解析介绍

    语法:

    [返回值 for 元素 in 可迭代对象 if 条件]
    使用中括号[],内部是for循环,if条件语句可选
    返回一个新列表
    
    >>> even = []
    >>> for x in range(10):
    ...     if x % 2 == 0:
    ...             even.append(x)
    >>> print(even)
    [0, 2, 4, 6, 8]
    列表解析方法:
    >>> even2 = [x for x in range(10) if x % 2 == 0]
    >>> print(even2)
    [0, 2, 4, 6, 8]
    
    1.2 列表解析进阶

    [expr for item in iterable if cond1 if cond2]
    等价于

    ret = []
    for item in iterable:
      if cond1:
        if cond2:
          ret.append(expr)
    

    例1:20以内,既能被2整除又能被3整除的数

    >>> [i for i in range(20) if i%2 == 0 and i%3 == 0]
    [0, 6, 12, 18]
    >>> [i for i in range(20) if i%2 == 0 if i%3 == 0]
    [0, 6, 12, 18]
    

    [expr for i in iterable1 for j in iterable2]
    等价于

    ret = []
    for i in iterable1:
      for j in iterable2:
        ret.append(expr)
    

    例2:

    >>> [(x,y) for x in 'abcde' for y in range(2)]
    [('a', 0), ('a', 1), ('b', 0), ('b', 1), ('c', 0), ('c', 1), ('d', 0), ('d', 1), ('e', 0), ('e', 1)]
    >>> [[x,y] for x in 'abcde' for y in range(2)]
    [['a', 0], ['a', 1], ['b', 0], ['b', 1], ['c', 0], ['c', 1], ['d', 0], ['d', 1], ['e', 0], ['e', 1]]
    >>> [{x,y} for x in 'abcde' for y in range(2)]
    [{0, 'a'}, {'a', 1}, {0, 'b'}, {1, 'b'}, {0, 'c'}, {1, 'c'}, {'d', 0}, {'d', 1}, {0, 'e'}, {'e', 1}]
    

    2.生成器表达式

    2.1 介绍

    语法介绍:

    (返回值 for 元素 in 可迭代对象 if 条件)
    列表解析式的中括号换成小括号即可,返回一个生成器
    列表解析的区别:
        生成器表达式是按需计算(或称惰性求值,延迟计算),需要的时候才计算值列,表解析式是立即返回值
        可迭代对象和迭代器均属于生成器
    

    例1:

    >>> g = ["{:04}".format(i) for i in range(1,5)]
    >>> g
    ['0001', '0002', '0003', '0004']
    >>> for x in g :
    ...     print(x)
    0001
    0002
    0003
    0004
    >>> for x in g:
    ...     print(x)
    0001
    0002
    0003
    0004
    使用生成器:
    >>> g = ("{:04}".format(i) for i in range(1,5))
    >>> g
    <generator object <genexpr> at 0x7f1054aa3c80>
    >>> next(g)
    '0001'
    >>> for x in g:
    ...     print(x)
    0002
    0003
    0004
    >>> for x in g:
    ...     print(x)
    

    总结

    生成器:                                                   列表
    1.延迟计算                                                立即计算
    2.返回迭代器,可以迭代                                     返回的不是迭代器,返回可迭代对象列表
    3.从前到后走完一遍,数据只能使用一次                        数据可反复,多次使用
    

    3.集合解析式

    3.1 语法介绍

    {返回值 for 元素 in 可迭代对象 if 条件}
    列表解析式的中括号换成大括号{}就行了
    立即返回一个集合

    3.2 举例
    >>> {(x,x+1) for x in range(3)}
    {(0, 1), (1, 2), (2, 3)}
    >>> {x for x in range(3)}
    {0, 1, 2}
    >>> {[x] for x in range(3)}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 1, in <setcomp>
    TypeError: unhashable type: 'list'
    

    4.字典解析式

    4.1 语法介绍

    {返回值 for 元素 in 可迭代对象 if 条件}
    列表解析式的中括号换成大括号{}就行了
    使用key:value形式
    立即返回一个字典

    4.2 举例
    >>> {x:x+1 for x in range(3)}
    {0: 1, 1: 2, 2: 3}
    >>> {x:[x,x+1] for x in range(3)}
    {0: [0, 1], 1: [1, 2], 2: [2, 3]}
    >>> {(x,):[x,x+1] for x in range(3)}
    {(0,): [0, 1], (1,): [1, 2], (2,): [2, 3]}
    >>> {chr(0x41+x):x**2 for x in range(3)}
    {'A': 0, 'B': 1, 'C': 4}
    >>> {str(x):y for x in range(3) for y in range(4)}
    {'0': 3, '1': 3, '2': 3}
    >>> {[x]:[x,x+1] for x in range(3)}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 1, in <dictcomp>
    TypeError: unhashable type: 'list'
    

    相关文章

      网友评论

        本文标题:9.解析式与生成器

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