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