Python 拓展之推導(dǎo)式

寫在之前

大家好尚洽,這里是零基礎(chǔ)學(xué)習(xí) Python 系列,在這里我將從最基本的Python 寫起叁熔,然后再慢慢涉及到高階以及具體應(yīng)用方面。我是完全自學(xué)的 Python诫隅,所以很是明白自學(xué)對于一個人的考驗(yàn)腐魂,所以在這里我會盡我最大的努力,把 Python 盡可能簡單的表述清楚逐纬,讓更多想要學(xué)習(xí) Python 的朋友能夠入門蛔屹。同時寫這個教程也算是對自己之前所學(xué)知識的一個鞏固和提高,喜歡的朋友們可以點(diǎn)個關(guān)注豁生,有問題歡迎隨時和我交流兔毒。本文所有的代碼編寫均是Python3 版本。

推導(dǎo)式是從一個或多個迭代器快速簡潔的創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的一種辦法甸箱,它可以將循環(huán)和條件判斷結(jié)合眼刃,從而可以避免語法冗長的代碼。

列表推導(dǎo)式

我在之前的文章中(零基礎(chǔ)學(xué)習(xí) Python 之 for 循環(huán)語句)寫過列表推導(dǎo)式摇肌,但是寫的相對簡單,今天我準(zhǔn)備再詳細(xì)說一下仪际,會的權(quán)當(dāng)復(fù)習(xí)围小,不會的正好學(xué)習(xí)。

如果讓你創(chuàng)建一個從 0 到 5 的整數(shù)列表树碱,按照我們之前學(xué)過的方法肯适,你可以這樣:

>>> my_list = []
>>> my_list.append(0)
>>> my_list.append(1)
>>> my_list.append(2)
>>> my_list.append(3)
>>> my_list.append(4)
>>> my_list.append(5)
>>> my_list
[0, 1, 2, 3, 4, 5]

如果用我們前天學(xué)過的 for 循環(huán),你可以這樣:


>>> my_list = []
>>> for i in range(0,6):
...     my_list.append(i)
... 
>>> my_list
[0, 1, 2, 3, 4, 5]

上面的兩個方法都是可行的 Python 方法成榜,得到的都是相同的結(jié)果框舔,但是這都不是最像 Python 風(fēng)格的創(chuàng)建列表的方式,什么是 Python 風(fēng)格赎婚?當(dāng)然是簡潔優(yōu)雅刘绣!請看下面:

>>> my_list = [i for i in range(0,6)]
>>> my_list
[0, 1, 2, 3, 4, 5]

看完這種方法,再比較之前的那兩種方法挣输,列表推導(dǎo)的優(yōu)點(diǎn)一目了然纬凤。

在第一行中,第一個變量 i 為列表的生成值撩嚼,換句話說停士,就是將循環(huán)的結(jié)果放在列表 my_list 中,第二個 i 是循環(huán)變量完丽,這里要提一點(diǎn)的是恋技,第一個變量 i 可以是表達(dá)式,請看下面的例子:


>>> my_list = [i*i for i in range(0,6)]
>>> my_list

除了上面第一個變量可以是表達(dá)式以外逻族,列表推導(dǎo)式也可以加上條件表達(dá)式蜻底,請看下面的例子:

>>> my_list = [i for i in range(0,6) if i  % 2 == 1]
>>> my_list
[1, 3, 5]

上述的例子通過列表推導(dǎo)式得到一個 0 到 5 之間的奇數(shù)列表,是不是要比傳統(tǒng)的方法簡潔很多呢聘鳞?所以朱躺,現(xiàn)在你是不是該動動手指寫一個傳統(tǒng)的求奇數(shù)列表的例子來對比對比呢刁赖?

上面我們用的一直是一個 for 循環(huán)的例子,那如果是雙層 for 循環(huán)呢长搀?


>>> first = range(1,4)
>>> second = range(7,9)
>>> for i in first:
...    for j in second:
...            print(i,j)
... 
1 7
1 8
2 7
2 8
3 7
3 8

如果是上面這個例子宇弛,你該怎么用列表推導(dǎo)式呢?如果你思考完源请,請看下面的答案:


>>> first = range(1,4)
>>> second = range(7,9)
>>> results = [(i,j) for i in first for j in second]
>>> for result in results:
...     print(result)
... 
(1, 7)
(1, 8)
(2, 7)
(2, 8)
(3, 7)

我在這將上面的例子用了元組輸出枪芒,具體用什么形式,看當(dāng)時的情況和自己的心情谁尸。

字典推導(dǎo)式

除了列表舅踪,字典其實(shí)也有自己的推導(dǎo)式,它和列表推導(dǎo)式其實(shí)有些相似良蛮,也有 if 條件判斷以及多個 for 循環(huán)的迭代語句抽碌,下面舉個最簡單的例子:


>>> words = 'rocky like python'
>>> letter_cnt = {letter:words.count(letter) for letter in words}
>>> letter_cnt
{'r': 1, 'o': 2, 'c': 1, 'k': 2, 'y': 2, ' ': 2, 'l': 1, 'i': 1, 'e': 1, 'p': 1, 't': 1, 'h': 1, 'n': 1}

上面的例子是計(jì)算句子里每個字母出現(xiàn)的個數(shù),但是不知道你有沒有發(fā)現(xiàn)决瞳,有些重復(fù)的字母的次數(shù)出現(xiàn)了多次货徙?還記得怎么解決掉字符串里重復(fù)的字母么?是 set 啊皮胡,快點(diǎn)動手試試吧痴颊。

集合推導(dǎo)式

集合也不例外,也有自己的推導(dǎo)式屡贺,也是跟上面的列表推導(dǎo)式和字典推導(dǎo)式類似蠢棱,不只是在簡單的,或者是帶條件判斷的都是如此甩栈,請看下面的例子:


>>> my_set = {i for i in range(0,6) if i % 3 == 1}
>>> my_set
{1, 4}

生成器推導(dǎo)式

我們說了三個泻仙,是不是掉了什么?對量没,是存在感最不強(qiáng)的元組饰豺,那么元組推導(dǎo)式是什么樣子的呢?你肯定想說:“簡單允蜈!不就是把列表推導(dǎo)式的方括號變成圓括號不就得了么冤吨?!”饶套,其實(shí)我想告訴你的事漩蟆,確實(shí)有圓括號的推導(dǎo)式,但不是元組的妓蛮,因?yàn)樵M沒有推導(dǎo)式怠李!圓括號的那個推導(dǎo)式是生成器推導(dǎo)式,不信的話請看下面的例子:


>>> my_exp = (i for i in range(0,6))
>>> my_exp
<generator object <genexpr> at 0x110090308>
>>> type(my_exp)
<class ‘generator'>

你現(xiàn)在只需要知道生成器是將數(shù)據(jù)傳給迭代器的一種方式就好了,至于生成器我在之后的文章中會詳細(xì)講到捺癞,盡情期待夷蚊。

雖然我們還沒學(xué)生成器這個概念,但是不妨礙我們學(xué)習(xí)這個推導(dǎo)式髓介,你可以直接對生成器的對象進(jìn)行迭代惕鼓,比如像下面一樣:

>>> for exp in my_exp:
...    print(exp)
... 
0
1
2
3
4
5

作為一個每個知識點(diǎn)都想寫的人來說,這里勞煩大家再記住一點(diǎn)的是唐础,一個生成器只能生成一次箱歧,如果想再生成一次的話,你會發(fā)現(xiàn)它消失掉了一膨,什么意思呢呀邢,看下面的例子:


>>> second_exp = list(my_exp)
>>> second_exp
[]

現(xiàn)在生成器先記住這些就可以,記不住也沒關(guān)系豹绪,我還會細(xì)講生成器价淌,我們到時候再討論。

寫在最后

最后感謝你能看到這里瞒津,希望我寫的東西能夠讓你有到收獲蝉衣,但是我還是希望我在文章里插入的代碼,你們能自己動手試一下仲智,都很簡單。原創(chuàng)不易姻氨,每一個字钓辆,每一個標(biāo)點(diǎn)都是自己手敲的,所以希望大家能多給點(diǎn)支持肴焊,該關(guān)注關(guān)注前联,該點(diǎn)贊點(diǎn)贊,該轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)娶眷,有什么問題歡迎在后臺聯(lián)系我似嗤,也可以在公眾號 -- Python空間 找到我的微信加我。

The end届宠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烁落,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子豌注,更是在濱河造成了極大的恐慌伤塌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧铁,死亡現(xiàn)場離奇詭異每聪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門药薯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绑洛,“玉大人,你說我怎么就攤上這事童本≌嫱停” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵巾陕,是天一觀的道長讨跟。 經(jīng)常有香客問我,道長鄙煤,這世上最難降的妖魔是什么晾匠? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮梯刚,結(jié)果婚禮上凉馆,老公的妹妹穿的比我還像新娘。我一直安慰自己亡资,他們只是感情好澜共,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锥腻,像睡著了一般嗦董。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘦黑,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天京革,我揣著相機(jī)與錄音,去河邊找鬼幸斥。 笑死匹摇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甲葬。 我是一名探鬼主播廊勃,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼经窖!你這毒婦竟也來了坡垫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤画侣,失蹤者是張志新(化名)和其女友劉穎葛虐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棉钧,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屿脐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年涕蚤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片的诵。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡万栅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出西疤,到底是詐尸還是另有隱情烦粒,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布代赁,位于F島的核電站扰她,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芭碍。R本人自食惡果不足惜徒役,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窖壕。 院中可真熱鬧忧勿,春花似錦、人聲如沸瞻讽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速勇。三九已至晌砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烦磁,已是汗流浹背养匈。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留个初,地道東北人乖寒。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓猴蹂,卻偏偏與公主長得像院溺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子磅轻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容