生成式
三元表達式
res = 條件成立時返回的值 if 條件 else 條件不成立時返回的值
列表生成式
[expr for i in iterable if condition]
文件 單詞總數(shù)
len([word for line in f for m in line.split()])
文件 字符總數(shù)
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] 前三個數(shù)不變,后面的數(shù)都平方
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]
三掰烟、生成器生成式
創(chuàng)建一個生成器對象有兩種方式爽蝴,一種是調用帶yield關鍵字的函數(shù),另一種就是生成器表達式纫骑,與列表生成式的語法格式相同蝎亚,只需要將[]換成(),即:
(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
<generator object <genexpr> at 0x101be0ba0>
對比列表生成式发框,生成器表達式的優(yōu)點自然是節(jié)省內存(一次只產(chǎn)生一個值在內存中)
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g) #拋出異常StopIteration
如果我們要讀取一個大文件的字節(jié)數(shù),應該基于生成器表達式的方式完成
# 案例 統(tǒng)計文件有多少個字符
# 方式一
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 ) # 生成器創(chuàng)建的時候煤墙,里面的個數(shù)是0個梅惯,只有next()調完才知道長度
res = sum(g)
print(res)
四、其他推導式
如下圖:
image.png