zoukankan      html  css  js  c++  java
  • 列表/字典/集合解析式和生成器

    列表解析式

    列表解析式是将一个列表(实际上适用于任何 可迭代对象(iterable) )转换成另一个列表的工具。在转换过程中,可以指定元素必须符合一定的条件,才能添加至新的列表中,这样每个元素都可以按需要进行转换。

    a0=dict(zip(('a','b','c'),(1,2,3)))
    a1=range(10)
    a2=[i for i in a1 if i in a0]
    print(a2)

    以上代码打印的是一个空列表

    我们来解释一下代码列表解析式运用的逻辑:

    a0=dict(zip(('a','b','c'),(1,2,3)))
    a1=range(10)
    a2=[]
    for i in a1:
        if i in a0:
            a2.append(i)
    print(a2)

    前面两个创建列表的方法等价,这时你就可以理解了列表解析式的基本运用了

    这时还有一个问题,为什么打印的值为空呢?这是因为 if i in a0这个语句判断的是i是否在字典中,判断的是字典的key值而不是value值,所以不等价返回的是False

    字典解析式

    用于创建一个字典(可加条件语句或嵌套语句)

    A1=range(10)
    A2={i:i*8 for i in A1 if i>5}
    print(A2)
    #{6: 48, 7: 56, 8: 64, 9: 72}

    字典的形式是{key,value},所以这里用的是花括号并传递key和value用冒号隔开

    集合解析式

    用于创建一个集合(可加条件语句或嵌套语句)

    A1=range(10)
    A2={i for i in A1 if i>5}
    print(A2)
    print(type(A2))
    #{8, 9, 6, 7}
    #<class 'set'>

    注意集合的顺序是随机的

     

    生成器

    生成器是可迭代对象,可用list()转换成列表和循环遍历出值

    有两种生成器创建方法:生成器表达式和生成器函数

    生成器表达式

    用于创建一个生成器(可加条件语句或嵌套语句)

    A1=range(10)
    A2=(x*2 for x in A1)
    print(A2)
    #<generator object <genexpr> at 0x007ED090>

    生成器函数

    def gen(n):
        for i in range(n):
            yield i*i
    for item in gen(5):
        print(item)
    # 0
    # 1
    # 4
    # 9
    # 16

    这里用yield返回一个生成器

    yield会一次返回一个结果,然后挂起,下次从挂起处继续执行,这能有效的减少内存损耗

    如果是return就直接退出函数并返回一个值了

  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/luocodes/p/10727019.html
Copyright © 2011-2022 走看看