zoukankan      html  css  js  c++  java
  • 4 三元表达式 列表解析 生成器表达式

    三元表达式

    #!/usr/bin/env python3 
    # _*_ coding:utf-8 _*_
    # @File    : 三元表达式 
    # @Version : 1.0
    
    
    '''
        三元表达式能实现简单的 if else  语句 so....
    
        有那三元呢:自己理解
                    1. 左边成立执行的代码  2. if 判断条件  3. esle 不成立所执行的代码
    
                    -- 最后的结果用变量接收
    '''
    
    
    # 简单的 if else 语句:
    
    num = 7
    
    if num > 10:
        print('大于10的数字')
    else:
        print('小于10的数字')
    
    # -------------------------
    
    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    print(max2(3,7))
    
    
    
    # 三元表达式:将简单的 if els 写在一行,赋值给一个变量接受
    
    
    ret = '大于10的数字' if num > 10 else '小于10的数字'
    print(ret)
    
    # ---------------------------------------------
    
    def max2(x,y):
        return x if x > y else y
    
    print(max2(3,7))
    
    # ---------------------------------------------
    days = 45
    
    result =  '必掀起大浪' if days >= 45 else 'select'
    print(result)

    列表解析 生成器表达式

    #!/usr/bin/env python3 
    # _*_ coding:utf-8 _*_
    # @File    : 列表解析
    # @Version : 1.0
    
    from collections import Iterator
    
    
    '''
    将迭代数据,利用列表解析,生成新的列表。但数量大的时不可用列表解析,会引爆内存。
    
    '''
    
    
    # 取得列表元素的平方
    
    l = [11,22,33,44,55,66,77,88,99]
    new_l = []
    
    # 1 正常解析
    
    for k in l:
        new_l.append(k**2)
    
    print(new_l)    # [121, 484, 1089, 1936, 3025, 4356, 5929, 7744, 9801]
    
    # -----------------------------------------------------------------------------------------
    
    # 2 列表解析
    
    ret = [ k**2 for k in l ]
    
    print(ret)          # [121, 484, 1089, 1936, 3025, 4356, 5929, 7744, 9801] 效果一样
    
    
    # 3 列表解析时也可加入条件
    
    '''
        [ 列表解析肯定要用list包起来 表达式之间空格即可 不需要写特殊分隔符 结果肯定也是个list ]
    
        列表解析的好处缩减代码两
    '''
    #    [ 列表最左边对解析出的每一个元素处理  中间是解析语句  最右边是过滤条件 ]
    
    ret = [ k**2 for k in l if k > 44 ]
    
    print(ret)          # [3025, 4356, 5929, 7744, 9801]
    
    
    # 再弄个例子
    
    l2 = ['tony','seven','eggtea']
    
    new_l2 = [ k.capitalize()  for k in l2 ]
    
    print(new_l2)       # ['Tony', 'Seven', 'Eggtea']
    
    
    
    # -----------------------------------------------------------------------------------------
    
    # 将 [] 换成() 会是啥玩意呢             --- 生成器表达式
    
    
    new_l2_ = ( k.capitalize() for k in l2 )
    
    print(new_l2_)                          # <generator object <genexpr> at 0x7f194c8982b0>  是个生成器
    
    print(type(new_l2_))                    # <class 'generator'>   是个生成器
    
    print(isinstance(new_l2_,Iterator))     # True  迭代器 __iter__ ,__next__ 
    
    print(next(new_l2_))                    # Tony
    print(next(new_l2_))                    # Seven
    print(next(new_l2_))                    # Eggtea
    
    # so ...
    
    list_old = [1,2,3,4,5,6,7,8,9]
    
    new_list = ( k**2 for k in list_old if k > 4 )      #  [] 换成了() 结果是 generator
    
    print(new_list)                                     # <generator object <genexpr> at 0x7f2d59946410>
    
    for i in new_list:
        print(i)
    
    
    '''
            so ... 将列表解析的 [] 换成 () 结果是一个生成器(迭代器)不确定生成器里元素的数量时
    
                                不要用next 取值 用 独有特性的 for 循环 取值
    '''
    
    
    # 列表解析 [] 换成 () 后 结果是个生成器, 就成了生成器表达式,这样解析数量大的时就不会爆内存了 
    
    # 弄个例子
    
    # ret = [ 'egg%s' %k  for k in range(100000000)]    这种情况内存吃不了
    
    g = ('egg%s' %k for k in range(10000000000000000))  # 数据在大也无妨,next 只有一个值在内存中
    
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())         # 可以无限next 
    
    
    g1 = ('egg%s' %k for k in range(10000000000000000) if k == 9) # 后面加上过滤条件
    
    
    print(next(g1))             # 生成器里就一个过滤成功的一个值,只能next一次
    #print(next(g1))             # StopIteration Error 
    
    
    
    # ------------------------------------------------------------------------------------------
    
    #        生成器表达式应用场景于读取大文件比较好
    
    
    with open('test.c',encoding='utf-8') as f_read:
        g=( line.strip() for line in f_read )       # 去掉换行符,整个文本搞成生成器
        print(next(g))
        print(next(g))
        for k in g:
            print(k)
    
    print(100*'{0}'.format('-'))
    
    '''
        这里循环生成器不行,此时文件已关闭,生成器不存在了
    
    for i in g:
        print(i)        # ValueError: I/O operation on closed file
    
    '''
    
    
    # 在弄个例子 --如:数据库中的数据
    '''
    apple 10 3
    tesla 100000 1
    mac 3000 2
    lenovo 30000 3
    chicken 10 3
    '''
    
    # 计数总消费
    
    with open('db.txt',encoding='utf-8') as f:
        '''
        ret = [ float(line.split()[1]) * int(line.split()[2]) for line in f]
        print(ret)      # [30.0, 100000.0, 6000.0, 90000.0, 30.0]
        print(sum(ret)) # 196060.0
        '''
        cont = sum(float(line.split()[1]) * int(line.split()[2]) for line in f)
        print(cont)     # 196060.0
    
    
    
    
    
    # 格式化输出数据 [{'name':xxx,},{'price':xxxx},{'price':xxx}]
    
    with open('db.txt',encoding='utf-8') as f_read:
        goods_info  = [ {'name':line.split()[0],
                    'price':line.split()[1],
                    'count':line.split()[2]} for line in f_read ]
    
        print(goods_info)       #           [{'count': '3', 'name': 'apple', 'price': '10'},
                                #           {'count': '1', 'name': 'tesla', 'price': '100000'},
                                #           {'count': '2', 'name': 'mac', 'price': '3000'},
                                #           {'count': '3', 'name': 'lenovo', 'price': '30000'},
                                #           {'count': '3', 'name': 'chicken', 'price': '10'}]
  • 相关阅读:
    Java-Class-C:org.springframework.util.Assert.java
    获取数组中最大最小值方法
    1423 Greatest Common Increasing Subsequence (LCIS)
    Strange Addition
    APUE读书笔记-第15章-进程间通信
    【技术文档】开发一个人力资源管理系统遇到的问题及解决的方法
    picture control控件
    armlinux下的网路传输(tcp/ip)
    黑马程序员—面向接口编程的好处
    【.NET中AOP的实现方案】静态代理
  • 原文地址:https://www.cnblogs.com/liushubao/p/7700729.html
Copyright © 2011-2022 走看看