py_20三元表達式和【列表|字典|集合|生成器生成式

生成式
    三元表達式
        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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末仿野,一起剝皮案震驚了整個濱河市个唧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件则酝,死亡現(xiàn)場離奇詭異惠奸,居然都是意外死亡,警方通過查閱死者的電腦和手機桨螺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門宾符,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灭翔,你說我怎么就攤上這事魏烫。” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵哄褒,是天一觀的道長稀蟋。 經(jīng)常有香客問我,道長呐赡,這世上最難降的妖魔是什么退客? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮链嘀,結果婚禮上萌狂,老公的妹妹穿的比我還像新娘。我一直安慰自己怀泊,他們只是感情好茫藏,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霹琼,像睡著了一般务傲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碧囊,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天树灶,我揣著相機與錄音,去河邊找鬼糯而。 笑死天通,一個胖子當著我的面吹牛,可吹牛的內容都是我干的熄驼。 我是一名探鬼主播像寒,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓜贾!你這毒婦竟也來了诺祸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祭芦,失蹤者是張志新(化名)和其女友劉穎筷笨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龟劲,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡胃夏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昌跌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰禀。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚕愤,靈堂內的尸體忽然破棺而出答恶,到底是詐尸還是另有隱情饺蚊,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布悬嗓,位于F島的核電站污呼,受9級特大地震影響,放射性物質發(fā)生泄漏烫扼。R本人自食惡果不足惜曙求,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望映企。 院中可真熱鬧悟狱,春花似錦、人聲如沸堰氓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽双絮。三九已至浴麻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囤攀,已是汗流浹背软免。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焚挠,地道東北人膏萧。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蝌衔,于是被迫代替她去往敵國和親榛泛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355