三元表达式与生成式

一 三元表达式

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

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

具体案列:

res = 1 if 1 > 2 else 2
print(res) #2

针对以下需求修改成三元表达式:

普通格式:

def func(x,y):
  	if x > y:
      return x
    else:
      return y
   
res = func(1,2)
print(res)#2

三元表示式格式:

def func(x, y):
    res = x if x > y else y
    return res
res = func(5, 2)
print(res)  # 5

二 列表生成式

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

l = ['alex_dsb', 'egon', 'wxx_dsb', 'lxx_dsb']
# new_l = []
# for name in l:
#     if name.endswith('dsb'):
#         new_l.append(name)
# print(new_l) #['alex_dsb', 'wxx_dsb', 'lxx_dsb']

#列表生成式
new_l = [name for name in l if name.endswith('dsb')]
print(new_l) #['alex_dsb', 'wxx_dsb', 'lxx_dsb']

#把所有小写字母都变成大写
new_l = [name.upper() for name in l]
print(new_l) #['ALEX_DSB', 'EGON', 'WXX_DSB', 'LXX_DSB']

#去掉后缀_dsb
new_l = [name.strip('_dsb') for name in l]
print(new_l) #['alex', 'egon', 'wxx', 'lxx']

三 字典生成式

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

#字典生成式
keys = ['name', 'age', 'gender']
dic = {key:None for key in keys}
print(dic) #{'name': None, 'age': None, 'gender': None}

#去掉 gender 关键字
items = [('name', 'egon'),('age', 18), ('gender','female')]
dic = {key:value for key, value in items if key != 'gender'}
print(dic) #{'name': 'egon', 'age': 18}

四 集合生成式

#集合生成式
keys = ['name', 'age', 'gender']
set1 = {key for key in keys}
print(set1,type(set1))  #{'gender', 'name', 'age'} <class 'set'>

注:元组没有生成式(元组不可变)

五 生成器生成式

创建一个生成器对象有两种方式:一种是调用带 yield 关键字的 函数,另一种就是生成器表达式。

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

#生成式生成器
g = (i for i in range(7) if i>3)
print(g) #<generator object <genexpr> at 0x10408fe08>
#此刻g 内部一个值也没有

print(next(g)) #4
print(next(g)) #5
print(next(g)) #6
print(next(g)) #抛出异常

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

​ 原因:生成器相当于一个功能,占用的内存空间非常少

#统计文件内容长度
with open('a.txt', 'r', encoding='utf-8')as f:
    #方式一
    # res = 0
    # for line in f:
    #     res += len(line)
    # print(res)
    
    #方式二
    res = sum([len(line) for line in f]) #sum 底层就相当于 for 循环取值再依次相加
    print(res)
    #方式三:效率最高
    res = sum((len(line) for line in f)) #使用生成器对象,不会占用过多的内存空间
    print(res)
    #上述可以简写为如下形式:
    res = sum(len(line) for line in f)
    print(res)

posted @ 2020-03-25 16:52  蛋蛋的丶夜  阅读(270)  评论(0编辑  收藏  举报