橡皮擦,一個逗趣的互聯網高級網蟲,新的系列,讓我們一起
Be More Pythonic,
四、串列推導式與字典推導式
在 Python 中推導式是一種非常 Pythonic 的知識,本篇博客將為你詳細解答串列推導式與字典推導式相關的技術知識,
4.1 串列推導式
串列推導式可以利用串列,元組,字典,集合等資料型別,快速的生成一個特定需要的串列,
語法格式如下:
[運算式 for 迭代變數 in 可迭代物件 [if 條件運算式]]
if 條件運算式 非必選,學完串列推導式之后,你可以發現它就是 for 回圈的一個變種陳述句,例如咱們現有一個需求是將一個串列中的所有元素都變成原值的 2 倍,
for 回圈寫法
my_list = [1,2,3]
new_list = []
for i in my_list:
new_list.append(i*2)
print(new_list)
串列推導式寫法
nn_list = [i*2 for i in my_list]
print(nn_list)
是不是對比看就是將 for 回圈陳述句做了變形之后,增加了一個 [],不過需要注意的是,串列推導式最侄訓將得到的各個結果組成一個新的串列,
再看一下串列推導式語法構成 nn_list = [i*2 for i in my_list] ,for 關鍵字后面就是一個普通的回圈,前面的運算式 i*2 其中的 i 就是 for 回圈中的變數,也就是說運算式可以用后面 for 回圈迭代產生的變數,理解這個內容串列推導式就已經掌握 9 成內容了,剩下的是熟練度的問題,
在將 if 陳述句包含進代碼中,運行之后,你也能掌味訓本技巧,if 陳述句是一個判斷,其中 i 也是前面回圈產生的迭代變數,
nn_list = [i*2 for i in my_list if i>1]
print(nn_list)
這些都是一般技能,串列推導式能支持兩層 for 回圈,例如下述代碼:
nn_list = [(x,y) for x in range(3) for y in range(3) ]
print(nn_list)
當然如果你想**加密(誰都看不懂你的代碼)**你的代碼,你可以無限套娃下去,串列推導式并沒有限制回圈層數,多層回圈就是一層一層的嵌套,你可以展開一個三層的串列推導式,就都明白了
nn_list = [(x,y,z,m) for x in range(3) for y in range(3) for z in range(3) for m in range(3)]
print(nn_list)
當然在多層串列推導式里面,依舊支持 if 陳述句,并且 if 后面可以用前面所有迭代產生的變數,不過不建議超過 2 成,超過之后會大幅度降低你代碼的可閱讀性,
當然如果你希望你代碼更加難讀,下面的寫法都是正確的,
nn_list = [(x, y, z, m) for x in range(3) if x > 1 for y in range(3) if y > 1 for z in range(3) for m in range(3)]
print(nn_list)
nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 and y > 1]
print(nn_list)
nn_list = [(x, y, z, m) for x in range(3) for y in range(3) for z in range(3) for m in range(3) if x > 1 if y > 1]
print(nn_list)
現在你已經對串列推導式有比較直觀的概念了,串列推導式對應的英文是 list comprehension,有的地方寫作串列決議式,基于它最后的結果,它是一種創建串列的語法,并且是很簡潔的語法,
有了兩種不同的寫法,那咱們必須要對比一下效率,經測驗小資料范圍影響不大,當回圈次數到千萬級時候,出現了一些差異,
import time
def demo1():
new_list = []
for i in range(10000000):
new_list.append(i*2)
def demo2():
new_list = [i*2 for i in range(10000000)]
s_time = time.perf_counter()
demo2()
e_time = time.perf_counter()
print("代碼運行時間:", e_time-s_time)
運行結果:
# for 回圈
代碼運行時間: 1.3431036140000001
# 串列推導式
代碼運行時間: 0.9749278849999999
在 Python3 中串列推導式具備區域作用域,運算式內部的變數和賦值只在區域起作用,運算式的背景關系里的同名變數還可以被正常參考,區域變數并不會影響到它們,所以其不會有變數泄漏的問題,例如下述代碼:
x = 6
my_var = [x*2 for x in range(3)]
print(my_var)
print(x)
串列推導式還支持嵌套
參考代碼如下,只有想不到,沒有做不到的,
my_var = [y*4 for y in [x*2 for x in range(3)]]
print(my_var)
4.2 字典推導式
有了串列推導式的概念,字典推導式學起來就非常簡單了,語法格式如下:
{鍵:值 for 迭代變數 in 可迭代物件 [if 條件運算式]}
直接看案例即可
my_dict = {key: value for key in range(3) for value in range(2)}
print(my_dict)
得到的結果如下:
{0: 1, 1: 1, 2: 1}
此時需要注意的是字典中不能出現同名的 key,第二次出現就把第一個值覆寫掉了,所以得到的 value 都是 1,
最常見的哪里還是下述的代碼,遍歷一個具有鍵值關系的可迭代物件,
my_tuple_list = [('name', '橡皮擦'), ('age', 18),('class', 'no1'), ('like', 'python')]
my_dict = {key: value for key, value in my_tuple_list}
print(my_dict)
4.3 元組推導式與集合推導式
其實你應該能猜到,在 Python 中是具備這兩種推導式的,而且語法相信你已經掌握了,不過語法雖然差不多,但是元組推導式運行結果卻不同,具體如下,
my_tuple = (i for i in range(10))
print(my_tuple)
運行之后產生的結果:
<generator object <genexpr> at 0x0000000001DE45E8>
使用元組推導式生成的結果并不是一個元組,而是一個生成器物件,需要特別注意下,這種寫法在有的地方會把它叫做生成器語法,不叫做元組推導式,
集合推導式也有一個需要注意的地方,先看代碼:
my_set = {value for value in 'HelloWorld'}
print(my_set)
因為集合是無序且不重復的,所以會自動去掉重復的元素,并且每次運行顯示的順序不一樣,使用的時候很容易暈掉,
4.4 這篇博客的總結
這篇博客,我們學習了串列和字典推導式,掌握并熟練的應用二者之后,你 Python 技能又向前進了一步,
相關閱讀
- Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧
- Python 爬蟲小課,精彩 9 講
今天是持續寫作的第 98 / 100 天,
如果你想跟博主建立親密關系,可以關注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的互聯網高級網蟲,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏,
CSDN認證博客專家
高級產品經理
互聯網從業者
業余編程愛好者
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266380.html
標籤:python
上一篇:Python對Excel進行處理
