生成式
三元表达式
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
列表生成式
[expr for i in iterable if condition]
文件 单词总数
len([word for line in f for m in line.split()])
文件 字符总数
sum([len(word) for line in f for m in line.split()])
[y if cond else x for i in iterable if condition]
for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else
字典生成式
{key:value for i in iterable if condition}
集合生成式
{expr for i in iterable if condition}
生成器生成式
(expr for i in iterable if condition)
一、三元表达式
三元表达式是python为我们提供的一种简化代码的解决方案,语法如下
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
针对下述场景
def max2(x,y):
if x > y:
return x
else:
return y
res = max2(1,2)
用三元表达式可以一行解决
x=1
y=2
res = x if x > y else y # 三元表达式
案例
# 案例
# [1,2,3,4,5,6,7,8] 前三个数不变,后面的数都平方
a =[]
for n,m in enumerate(range(1,9)):
if n <3:
a.append(m)
else:
a.append(pow(m,2))
print(a) #[1, 2, 3, 16, 25, 36, 49, 64]
#改写三元表达式
# m if n <3 else pow(m,2)看着一个成体,添加到列表
res = [m if n <3 else pow(m,2) for n,m in enumerate(range(1,9))]
print(res) #[1, 2, 3, 16, 25, 36, 49, 64]
二、列表生成式
列表生成式是python为我们提供的一种简化代码的解决方案,用来快速生成列表,语法如下
精简语法:[expr for i in iterable if condition]
- expr 表达式
- condition 条件
[expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN
]
#类似于
res=[]
for item1 in iterable1:
if condition1:
for item2 in iterable2:
if condition2
...
for itemN in iterableN:
if conditionN:
res.append(expression)
在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else
# 列表生成式
# 语法: [expr for i in iterable if condition]
# L = ['Hello', 'World', 18, 'Apple', None] ,将里面的所有英文小写
L = ['Hello', 'World', 18, 'Apple', None]
L= [i.lower() if isinstance(i,str) else i for i in L]
print(L) # ['hello', 'world', 18, 'apple', None]
三、生成器生成式
创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将[]换成(),即:
(expr for i in iterable if condition)
对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象
>>> [x*x for x in range(3)]
[0, 1, 4]
>>> g=(x*x for x in range(3))
>>> g
at 0x101be0ba0>
对比列表生成式,生成器表达式的优点自然是节省内存(一次只产生一个值在内存中)
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g) #抛出异常StopIteration
如果我们要读取一个大文件的字节数,应该基于生成器表达式的方式完成
# 案例 统计文件有多少个字符
# 方式一
with open("dedai.txt","rt",encoding="utf-8") as f:
res = 0
for line in f:
res += len(line)
print(res)
# 方式2
with open("dedai.txt","rt",encoding="utf-8") as f:
res = sum([len(line) for line in f ])
print(res)
# 方式3:效率最高
with open("dedai.txt","rt",encoding="utf-8") as f:
g = (len(line) for line in f ) # 生成器创建的时候,里面的个数是0个,只有next()调完才知道长度
res = sum(g)
print(res)
四、其他推导式
如下图: