(一)使用List Comprehension的好處
在了解Python的List Comprehension之前,我們習慣使用for循環創建列表,比如下面的例子:
numbers = range(10) my_list = [] for number in numbers: my_list.append(number * number) print(my_list)
可是在Python中,我們有更簡潔,可讀性更好的方式創建列表,就是List Comprehension:
my_list = [number * number for number in numbers]
我們也可以用map加上lambda實現上述List Comprehension的功能:
my_list = map(lambda a: a*a, numbers)
上面三個代碼段的功能類似,除了map函數返回的是iterator,但是從可讀性來說,List Comprehension是最好的
(二)一些較為復雜的List Comprehension
(1)加上if判斷條件的List Comprehension:
my_list = [number for number in numbers if number % 2 == 0]
(2)多個維度,可以包含多個for
colors = ['Black', 'White'] sizes = ['S', 'M', 'L'] tshirts = [(color, size) for color in colors for size in sizes]
(三)Dictionary/Set Comprehension
與List Comprehension類似,我們可以對Dictionary和Set操作:
假設我們有如下兩個列表:
names = ['Bruce', 'Clark', 'Peter', 'Logan', 'Wade'] heros = ['Batman', 'Superman', 'Spiderman', 'Wolverine', 'Deadpool']
我們利用內置函數zip將上面兩個列表打包成包含元組的iterator zip(names, heros) ,用for循環輸出如下:
('Bruce', 'Batman') ('Clark', 'Superman') ('Peter', 'Spiderman') ('Logan', 'Wolverine') ('Wade', 'Deadpool')
如果使用for循環把上面的iterator生成字典的話,代碼如下:
my_dict = [] for name, hero in zip(names, heros): my_dict[name] = hero print(my_dict)
而用Dictionary Comprehension的等價代碼是這樣的:
my_dict = {name: hero for name, hero in zip(names, heros)} print(my_dict)
是不是更為簡潔?同樣也有Set Comprehension:
numbers = [1, 1, 2, 2, 2, 3, 4, 5] my_set = {number for number in numbers} print(my_set)
(四)Generator Comprehension
生成器表達式與列表或其他序列類型相比,更節省內存,因為它一次只產出一個值,與List Comprehension的語法非常類似,只是不用[],而使用(),
比如我們求字母序列的ASCII碼:
letters = 'ABCDEFG' genexp_1etters = (ord(letter) for letter in letters) for letter in genexp_1etters: print(letter)
程序輸出ABCDEF的ASCII碼 65 - 71.