美文网首页
py_20三元表达式和【列表|字典|集合|生成器生成式

py_20三元表达式和【列表|字典|集合|生成器生成式

作者: 阿登20 | 来源:发表于2020-08-18 17:59 被阅读0次
    生成式
        三元表达式
            res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
        列表生成式
            [expr for i in iterable if condition]
                文件 单词总数
                    len([word for line in f for m in line.split()])
                文件 字符总数
                    sum([len(word) for line in f for m in line.split()])
                [y if cond else x for i in iterable if condition]
                    for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else
        字典生成式
            {key:value for i in iterable if condition}
        集合生成式
            {expr for i in iterable if condition}
        生成器生成式
            (expr for i in iterable if condition)
    

    一、三元表达式

    三元表达式是python为我们提供的一种简化代码的解决方案,语法如下

    res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
    

    针对下述场景

    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    res = max2(1,2)
    

    用三元表达式可以一行解决

    x=1
    y=2
    res = x if x > y else y # 三元表达式
    

    案例

    # 案例
    # [1,2,3,4,5,6,7,8] 前三个数不变,后面的数都平方
    
    a =[]
    for n,m in enumerate(range(1,9)):
        if n <3:
            a.append(m)
        else:
            a.append(pow(m,2))
    
    print(a) #[1, 2, 3, 16, 25, 36, 49, 64]
    
    #改写三元表达式
    # m if n <3 else pow(m,2)看着一个成体,添加到列表
    res = [m if n <3 else pow(m,2) for n,m in enumerate(range(1,9))]
    print(res) #[1, 2, 3, 16, 25, 36, 49, 64]
    

    二、列表生成式

    列表生成式是python为我们提供的一种简化代码的解决方案,用来快速生成列表,语法如下

    精简语法:[expr for i in iterable if condition]

    • expr 表达式
    • condition 条件
    [expression for item1 in iterable1 if condition1
    for item2 in iterable2 if condition2
    ...
    for itemN in iterableN if conditionN
    ]
    
    #类似于
    res=[]
    for item1 in iterable1:
        if condition1:
            for item2 in iterable2:
                if condition2
                    ...
                    for itemN in iterableN:
                        if conditionN:
                            res.append(expression)
    

    在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else

    
    # 列表生成式
    # 语法: [expr for i in iterable if condition]
    
    # L = ['Hello', 'World', 18, 'Apple', None] ,将里面的所有英文小写
    L = ['Hello', 'World', 18, 'Apple', None]
    
    L= [i.lower() if isinstance(i,str) else  i for i in L]
    print(L)  # ['hello', 'world', 18, 'apple', None]
    

    三、生成器生成式

    创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将[]换成(),即:

    (expr for i in iterable if condition)
    

    对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象

    >>> [x*x for x in range(3)]
    [0, 1, 4]
    >>> g=(x*x for x in range(3))
    >>> g
    <generator object <genexpr> at 0x101be0ba0>
    

    对比列表生成式,生成器表达式的优点自然是节省内存(一次只产生一个值在内存中)

    >>> next(g)
    0
    >>> next(g)
    1
    >>> next(g)
    4
    >>> next(g) #抛出异常StopIteration
    

    如果我们要读取一个大文件的字节数,应该基于生成器表达式的方式完成

    # 案例 统计文件有多少个字符
    
    # 方式一
    with open("dedai.txt","rt",encoding="utf-8") as f:
        res = 0
        for line in f:
            res += len(line)
    
    print(res)
    
    # 方式2
    with open("dedai.txt","rt",encoding="utf-8") as f:
        res = sum([len(line) for line in f ])
    
    print(res)
    
    # 方式3:效率最高
    with open("dedai.txt","rt",encoding="utf-8") as f:
        g = (len(line) for line in f ) # 生成器创建的时候,里面的个数是0个,只有next()调完才知道长度
        res = sum(g)
        print(res)
    

    四、其他推导式

    如下图:

    image.png

    相关文章

      网友评论

          本文标题:py_20三元表达式和【列表|字典|集合|生成器生成式

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