python 列表生成式_深度好文:Python之列表生成式、生成器、可迭代对象与迭代器(一)...
作者:云游道士
原文:https://www.cnblogs.com/yyds/p/6281453.html
本節內容
語法糖的概念
列表生成式
生成器(Generator)
可迭代對象(Iterable)
迭代器(Iterator)
Iterable、Iterator與Generator之間的關系
一、語法糖的概念
“語法糖”,從字面上看應該是一種語法。“糖”,可以理解為簡單、簡潔。其實我們也已經意識到,沒有這些被稱為“語法糖”的語法,我們也能實現相應的功能,而?“語法糖”使我們可以更加簡潔、快速的實現這些功能。?只是Python解釋器會把這些特定格式的語法翻譯成原本那樣復雜的代碼邏輯而已,沒有什么太高深的東西。
到目前為止,我們使用和介紹過的語法糖有:
if...else 三元表達式:?可以簡化分支判斷語句,如 x = y.lower() if isinstance(y, str) else y
with語句:?用于文件操作時,可以幫我們自動關閉文件對象,使代碼變得簡潔;
裝飾器:?可以在不改變函數代碼及函數調用方式的前提下,為函數增加增強性功能;
這里會再介紹兩個:
列表生成式:?用于生成一個新的列表
生成器:?用于“惰性”地生成一個無限序列
二、列表生成式
顧名思義,列表生成式就是一個用來生成列表的特定語法形式的表達式。
1. 語法格式:
基礎語法格式
[exp for iter_var in iterable]工作過程:
迭代iterable中的每個元素;
每次迭代都先把結果賦值給iter_var,然后通過exp得到一個新的計算值;
最后把所有通過exp得到的計算值以一個新列表的形式返回。
相當于這樣的過程:
L = []for iter_var in iterable: L.append(exp)帶過濾功能語法格式
[exp for iter_var in iterable if_exp]工作過程:
迭代iterable中的每個元素,每次迭代都先判斷if_exp表達式結果為真,如果為真則進行下一步,如果為假則進行下一次迭代;
把迭代結果賦值給iter_var,然后通過exp得到一個新的計算值;
最后把所有通過exp得到的計算值以一個新列表的形式返回。
相當于這樣的過程:
L = []for iter_var in iterable: if_exp: L.append(exp)循環嵌套語法格式
[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]工作過程:
每迭代iterable_A中的一個元素,就把ierable_B中的所有元素都迭代一遍。
相當于這樣的過程:
L = []for iter_var_A in iterable_A: for iter_var_B in iterable_B: L.append(exp)2. 應用場景
其實列表生成式也是Python中的一種“語法糖”,也就是說列表生成式應該是Python提供的一種生成列表的簡潔形式,應用列表生成式可以快速生成一個新的list。它最主要的應用場景是:根據已存在的可迭代對象推導出一個新的list。
3. 使用實例
我們可以對幾個生成列表的要求分別通過“不使用列表生成式”和“使用列表生成式”來實現,然后做個對比總結。
實例1:生成一個從3到10的數字列表
# 不使用列表生成式實現list1 = list(range(3, 11))# 使用列表生成式實現list2 = [x for x in range(3, 11)]實例2:生成一個2n+1的數字列表,n為從3到11的數字
# 不使用列表生成式實現list3 = []for n in range(3, 11): list3.append(2*n + 1)# 使用列表生成式實現list4 = [2*n + 1 for n in range(3, 11)]實例3:過濾出一個指定的數字列表中值大于20的元素
L = [3, 7, 11, 14,19, 33, 26, 57, 99]# 不使用列表生成式實現list5 = []for x in L: if x < 20: list5.append(x)# 使用列表生成式實現list6 = [x for x in L if x > 20]實例4:計算兩個集合的全排列,并將結果作為保存至一個新的列表中
L1 = ['香蕉', '蘋果', '橙子']L2 = ['可樂', '牛奶']# 不使用列表生成式實現list7 = []for x in L1: for y in L2: list7.append((x, y))# 使用列表生成式實現list8 = [(x, y) for x in L1 for y in L2]實例5:將一個字典轉換成由一組元組組成的列表,元組的格式為(key, value)
D = {'Tom': 15, 'Jerry': 18, 'Peter': 13}# 不使用列表生成式實現list9 = []for k, v in D.items(): list9.append((k, v))# 使用列表生成式實現list10 = [(k, v) for k, v in D.items()]可見,使用列表生成式確實要方便、簡潔很多,使用一行代碼就搞定了。
4. 列表生成式與map()、filter()等高階函數功能對比
我覺得,大家應該已經發現這里說的列表生成式的功能與之前?這篇文章?中講到的map()和filter()高階函數的功能很像,比如下面兩個例子:
實例1:把一個列表中所有的字符串轉換成小寫,非字符串元素原樣保留
L = ['TOM', 'Peter', 10, 'Jerry']# 用列表生成式實現list1 = [x.lower() if isinstance(x, str) else x for x in L]# 用map()函數實現list2 = list(map(lambda x: x.lower() if isinstance(x, str) else x, L))實例2:把一個列表中所有的字符串轉換成小寫,非字符串元素移除
L = ['TOM', 'Peter', 10, 'Jerry']# 用列表生成式實現list3 = [x.lower() for x in L if isinstance(x, str)]# 用map()和filter()函數實現list4 = list(map(lambda x: x.lower(), filter(lambda x: isinstance(x, str), L)))對于大部分需求來講,使用列表生成式和使用高階函數都能實現。但是map()和filter()等一些高階函數在Python3中的返回值類型變成了Iteraotr(迭代器)對象(在Python2中的返回值類型為list),這對于那些元素數量很大或無限的可迭代對象來說顯然是更合適的,因為可以避免不必要的內存空間浪費。關于迭代器的概念,下篇會單獨進行說明。
覺得不錯,點個在看唄!
總結
以上是生活随笔為你收集整理的python 列表生成式_深度好文:Python之列表生成式、生成器、可迭代对象与迭代器(一)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: torchvision0.2.2_速度全
- 下一篇: git add remote_收藏向 |