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就直接退出函数并返回一个值了

  • 相关阅读:
    (原创)批处理中变量的用法
    (收藏)Android 的各种listener and states event
    (转)Android 、BlackBerry 文本对齐方式对比
    (转)Android中尺寸单位杂谈
    批处理文章集锦
    Launch custom android application from android browser
    【原创】我的批处理命令例子
    Android文字居中
    (转)androd之绘制文本(FontMetrics)
    (批处理之二):setlocal enabledelayedexpansion (详解)
  • 原文地址:https://www.cnblogs.com/luocodes/p/10727019.html
Copyright © 2011-2022 走看看