Python 拓展之推導式

2022-05-30 01:30:15 字數 2813 閱讀 6505

推導式是從乙個或多個迭代器快速簡潔的建立資料結構的一種辦法,它可以將迴圈和條件判斷結合,從而可以避免語法冗長的**。

我在之前的文章中(零基礎學習 python 之 for 迴圈語句)寫過列表推導式,但是寫的相對簡單,今天我準備再詳細說一下,會的權當複習,不會的正好學習。

如果讓你建立乙個從 0 到 5 的整數列表,按照我們之前學過的方法,你可以這樣:

>>> my_list = 

>>> my_list

[0, 1, 2, 3, 4, 5]

如果用我們前天學過的 for 迴圈,你可以這樣:

>>> my_list = 

>>> for i in range(0,6):

...

>>> my_list

[0, 1, 2, 3, 4, 5]

上面的兩個方法都是可行的 python 方法,得到的都是相同的結果,但是這都不是最像 python 風格的建立列表的方式,什麼是 python 風格?當然是簡潔優雅!請看下面:

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

>>> my_list

[0, 1, 2, 3, 4, 5]

看完這種方法,再比較之前的那兩種方法,列表推導的優點一目了然。

在第一行中,第乙個變數 i 為列表的生成值,換句話說,就是將迴圈的結果放在列表 my_list 中,第二個 i 是迴圈變數,這裡要提一點的是,第乙個變數 i 可以是表示式,請看下面的例子:

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

>>> my_list

除了上面第乙個變數可以是表示式以外,列表推導式也可以加上條件表示式,請看下面的例子:

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

>>> my_list

[1, 3, 5]

上述的例子通過列表推導式得到乙個 0 到 5 之間的奇數列表,是不是要比傳統的方法簡潔很多呢?所以,現在你是不是該動動手指寫乙個傳統的求奇數列表的例子來對比對比呢?

上面我們用的一直是乙個 for 迴圈的例子,那如果是雙層 for 迴圈呢?

>>> first = range(1,4)

>>> second = range(7,9)

>>> for i in first:

... for j in second:

... print(i,j)

...

1 71 8

2 72 8

3 73 8

如果是上面這個例子,你該怎麼用列表推導式呢?如果你思考完,請看下面的答案:

>>> 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)

我在這將上面的例子用了元組輸出,具體用什麼形式,看當時的情況和自己的心情。

除了列表,字典其實也有自己的推導式,它和列表推導式其實有些相似,也有 if 條件判斷以及多個 for 迴圈的迭代語句,下面舉個最簡單的例子:

>>> words = 'rocky like python'

>>> letter_cnt =

>>> letter_cnt

上面的例子是計算句子裡每個字母出現的個數,但是不知道你有沒有發現,有些重複的字母的次數出現了多次?還記得怎麼解決掉字串裡重複的字母麼?是 set 啊,快點動手試試吧。

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

>>> my_set = 

>>> my_set

我們說了三個,是不是掉了什麼?對,是存在感最不強的元組,那麼元組推導式是什麼樣子的呢?你肯定想說:「簡單!不就是把列表推導式的方括號變成圓括號不就得了麼?!」,其實我想告訴你的事,確實有圓括號的推導式,但不是元組的,因為元組沒有推導式!圓括號的那個推導式是生成器推導式,不信的話請看下面的例子:

>>> my_exp = (i for i in range(0,6))

>>> my_exp

at 0x110090308>

>>> type(my_exp)

你現在只需要知道生成器是將資料傳給迭代器的一種方式就好了,至於生成器我在之後的文章中會詳細講到,盡情期待。

雖然我們還沒學生成器這個概念,但是不妨礙我們學習這個推導式,你可以直接對生成器的物件進行迭代,比如像下面一樣:

>>> for exp in my_exp:

... print(exp)

... 01

2345

>>> second_exp = list(my_exp)

>>> second_exp

現在生成器先記住這些就可以,記不住也沒關係,我還會細講生成器,我們到時候再討論。

python 推導式 Python 入門之 推導式

推導式就是構建比較有規律的列表,生成器,字典等一種簡便的方式。1 推導式 1 列表推導式 1 普通迴圈 變數 for迴圈 print i for i in range 10 2 篩選模式 加工後的變數 for迴圈 加工條件 print i for i in range 10 if i 2 0 2 集...

python之推導式

推導式是可以從乙個資料序列表構建另乙個新的資料序列 推導式包括 1.列表推導式 基本格式 變數名 表示式 for 臨時變數 in 列表 執行流程 從列表中遍歷每乙個元素給臨時變數,表示式使用臨時變數做一些邏輯判斷,最後 將行的資料放到乙個新的列表 lst 1,2,3,4,5,6,7 new lst ...

python之推導式

推導式 推導式comprehensions 又稱解析式 是python的一種獨有特性。推導式是可以從乙個資料序列構建另乙個新的資料序列。推導式包括 1.列表 list 推導式 2.字典 dict 推導式 3.集合 set 推導式。python語言有一種獨特的推導式語法,相當於語法糖的存在,可以幫你在...