寫在之前
大家好,這里是零基礎(chǔ)學習 Python 系列,在這里我將從最基本的Python 寫起,然后再慢慢涉及到高階以及具體應(yīng)用方面。我是完全自學的 Python,所以很是明白自學對于一個人的考驗,所以在這里我會盡我最大的努力,把 Python 盡可能簡單的表述清楚,讓更多想要學習 Python 的朋友能夠入門。同時寫這個教程也算是對自己之前所學知識的一個鞏固和提高,喜歡的朋友們可以點個關(guān)注,有問題歡迎隨時和我交流。本文所有的代碼編寫均是Python3 版本。
推導(dǎo)式是從一個或多個迭代器快速簡潔的創(chuàng)建數(shù)據(jù)結(jié)構(gòu)的一種辦法,它可以將循環(huán)和條件判斷結(jié)合,從而可以避免語法冗長的代碼。
列表推導(dǎo)式
我在之前的文章中(零基礎(chǔ)學習 Python 之 for 循環(huán)語句)寫過列表推導(dǎo)式,但是寫的相對簡單,今天我準備再詳細說一下,會的權(quán)當復(fù)習,不會的正好學習。
如果讓你創(chuàng)建一個從 0 到 5 的整數(shù)列表,按照我們之前學過的方法,你可以這樣:
>>> 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]
如果用我們前天學過的 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 風格的創(chuàng)建列表的方式,什么是 Python 風格?當然是簡潔優(yōu)雅!請看下面:
>>> my_list = [i for i in range(0,6)]
>>> my_list
[0, 1, 2, 3, 4, 5]
看完這種方法,再比較之前的那兩種方法,列表推導(dǎo)的優(yōu)點一目了然。
在第一行中,第一個變量 i 為列表的生成值,換句話說,就是將循環(huán)的結(jié)果放在列表 my_list 中,第二個 i 是循環(huán)變量,這里要提一點的是,第一個變量 i 可以是表達式,請看下面的例子:
>>> my_list = [i*i for i in range(0,6)]
>>> my_list
除了上面第一個變量可以是表達式以外,列表推導(dǎo)式也可以加上條件表達式,請看下面的例子:
>>> 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ǎo)式
除了列表,字典其實也有自己的推導(dǎo)式,它和列表推導(dǎo)式其實有些相似,也有 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}
上面的例子是計算句子里每個字母出現(xiàn)的個數(shù),但是不知道你有沒有發(fā)現(xiàn),有些重復(fù)的字母的次數(shù)出現(xiàn)了多次?還記得怎么解決掉字符串里重復(fù)的字母么?是 set 啊,快點動手試試吧。
集合推導(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)式
我們說了三個,是不是掉了什么?對,是存在感最不強的元組,那么元組推導(dǎo)式是什么樣子的呢?你肯定想說:“簡單!不就是把列表推導(dǎo)式的方括號變成圓括號不就得了么?!”,其實我想告訴你的事,確實有圓括號的推導(dǎo)式,但不是元組的,因為元組沒有推導(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ù)傳給迭代器的一種方式就好了,至于生成器我在之后的文章中會詳細講到,盡情期待。
雖然我們還沒學生成器這個概念,但是不妨礙我們學習這個推導(dǎo)式,你可以直接對生成器的對象進行迭代,比如像下面一樣:
>>> for exp in my_exp:
... print(exp)
...
0
1
2
3
4
5
作為一個每個知識點都想寫的人來說,這里勞煩大家再記住一點的是,一個生成器只能生成一次,如果想再生成一次的話,你會發(fā)現(xiàn)它消失掉了,什么意思呢,看下面的例子:
>>> second_exp = list(my_exp)
>>> second_exp
[]
現(xiàn)在生成器先記住這些就可以,記不住也沒關(guān)系,我還會細講生成器,我們到時候再討論。
寫在最后
最后感謝你能看到這里,希望我寫的東西能夠讓你有到收獲,但是我還是希望我在文章里插入的代碼,你們能自己動手試一下,都很簡單。原創(chuàng)不易,每一個字,每一個標點都是自己手敲的,所以希望大家能多給點支持,該關(guān)注關(guān)注,該點贊點贊,該轉(zhuǎn)發(fā)轉(zhuǎn)發(fā),有什么問題歡迎在后臺聯(lián)系我,也可以在公眾號 -- Python空間 找到我的微信加我。
The end。