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)

猜你喜欢

转载自www.cnblogs.com/zhubincheng/p/12570283.html