zoukankan      html  css  js  c++  java
  • 12-三元表达式、生成式

    一、三元表达式

    为什么要有三元表达式?

    # 针对以下需求
    def func(x,y):
        if x > y:
            return x
        else:
            return y
    
    res=func(1,2)
    print(res)

    三元表达式的语法格式: 条件成立时 要返回的值  if 条件 else 条件不成立时 要返回的值

    x=1
    y=2
    
    res=x if x > y else y
    print(res)

    应用举例:

    # 应用举例
    def func():
        """
        if 1 > 3:
            x=1
        else:
            x=3
        """
        x = 1 if 1 > 3 else 3

    二、生成式

    2.1 列表生成式

    l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']
    
    # 不使用生成式实现:
    new_l=[]
    for name in l:
        if name.endswith('dsb'):
            new_l.append(name)
    print(new_l)                            # ['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'xxq_dsb']
    
    # 使用生成式实现:
    new_l=[name for name in l if name.endswith('dsb')]
    print(new_l)                            # ['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'xxq_dsb']
    
    new_l=[name for name in l]              # 若无须条件判断,则可省略后面的判断
    print(new_l)                            # ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']

    其他需求:

    # 把所有小写字母全变成大写
    new_l=[name.upper() for name in l]
    
    # 把所有的名字去掉后缀_dsb
    new_l=[name.replace('_dsb','') for name in l]

    2.2 字典生成式

    keys=['name','age','gender']
    dic={key:None for key in keys}
    print(dic)
    
    items=[('name','egon'),('age',18),('gender','male')]
    res={k:v for k,v in items if k != 'gender'}
    print(res)

    2.3 集合生成式

    keys=['name','age','gender']
    set1={key for key in keys}
    print(set1,type(set1))

    2.4 生成器表达式(***重点***)

    g=(i for i in range(10) if i > 3)
    # !!!!!!!!!!!强调!!!!!!!!!!!!!!!
    # 此刻g内部一个值也没有
    
    print(g,type(g))        # <generator object <genexpr> at 0x000001AB56B61890> <class 'generator'>
    
    print(next(g))          # 4
    print(next(g))          # 5
    print(next(g))          # 6
    print(next(g))          # 7
    # g.close()             # 此处若关闭生成器,在下一次next(g)时就会抛出异常
    print(next(g))          # 8
    print(next(g))          # 9
    print(next(g))          # 抛出异常 StopIteration

    2.5  生成式应用

    计算文件大小

    储备知识:

    sum(__iterable)    #可计算可迭代对象的和(可迭代对象的元素必须是int类型)

    法一:代码冗余

    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
      
        res=0
        for line in f:
            res+=len(line)
        print(res)

    法二:行数过多时,列表占用大量内存

    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
    
        res=sum([len(line) for line in f])
        print(res)

    法三:代码简洁,且不占用内存

    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
        # 方式三 :效率最高
        # res = sum((len(line) for line in f))
        # 上述可以简写为如下形式(无括号默认为生成器表达式)
        res = sum(len(line) for line in f)
        print(res)

     三、匿名函数与生成式联用

    def dd():
        return [lambda x:i*x for i in range(4)]
    
    print([m(2) for m in dd()])  # [6,6,6,6] 
    # lambda中i并非函数内的局部变量,列表生成器生成的是函数 i*x,则在调用时会到全局找i,则i已经循环为3,故每次输出都为6 
  • 相关阅读:
    5G网络类型 ?
    命令行签名
    软件著作权之源代码
    汗,查了很久的问题,竟然是重载错函数
    终于考完PMP
    ImportError: No module named _tkinter on macos
    numpy.trace对于三维以上array的解析
    ValueError: output parameter for reduction operation logical_and has too many dimensions ?
    numexpr low version warning
    Execution failed for task ':compileDebugAidl'.
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12570283.html
Copyright © 2011-2022 走看看