一 、推導式:python
是Python的一種獨有特性。推導式是能夠從一個數據序列構建另外一個新的數據序列的結構體。 共有三種推導,在Python2和3中都有支持:函數
一、列表推導式 (使用[]生成list):spa
基本格式code
variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res: 列表生成元素表達式,也能夠是有返回值的函數。 for out_exp in input_list: 迭代input_list將out_exp傳入out_exp_res表達式中。 if out_exp == 2: 根據條件過濾哪些值能夠。此條件能夠不加
例一: 對象
multiples = [i for i in range(30) if i % 3 is 0] print(multiples) # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
例二: 有返回值的函數blog
def squared(x): return x*x multiples = [squared(i) for i in range(30) if i % 3 is 0] print multiples # Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
二、字典推導式 (使用{}生成dict):ip
字典推導式和列表推導式相似,只是[]換成{}。內存
例一:快速更換key和valueget
mcase = {'a': 10, 'b': 34} mcase_frequency = {v: k for k, v in mcase.items()} # 「for k,v in mcase.items()」 用到python元組拆包 print mcase_frequency # Output: {10: 'a', 34: 'b'}
例二:大小寫key合併input
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys() if k.lower() in ['a','b']}
print mcase_frequency
# Output: {'a': 17, 'b': 34}
三、集合推導式
例一:
squared = {x**2 for x in [1, 1, 2]} print(squared)
# Output: {1, 4} python3
# Output: set([1, 4]) python2
2、生成器表達式:
生成器表達式和列表推導式相似,只是把[ ] 換成了( ) 。
生成器表達式
列表推導式
生成器表達式可迭代
生成器表達式獲得的是一個generator,而列表推導式生成的是一個list,generator是一個生成器對象,可迭代。生成generator的時候,不會在內存中留下一個列表,而在每次for循環運行時才生成一個組合,生成器對象是用到的時候才生成內容的,當數據比較大的時候,生成器表達式能明顯的節約內存。
生成器表達式屬於「惰性計算」,能夠逐個的獲取內容:
python2中可用generator.next()逐個獲取
python3中逐個獲取用法改爲next(generator)
三、生成器表達式可替換map、filter高階函數
filter:
g=(i for i in range(30) if i % 3 is 0) 等效於 g=filter(lambda x:x%3==0,range(30))
map:
g=(i+2 for i in range(10) ) 等效於 g=map(lambda x:x+2,range(10))
reduce (生成的是一個結果,不是generator)
reduce(function, sequence[, initial]) -> value
function參數是一個有兩個參數的函數,reduce依次從sequence中取一個元素,和上一次調用function的結果作參數再次調用function。
第一次調用function時,若是提供initial參數,會以sequence中的第一個元素和initial做爲參數調用function,不然會以序列sequence中的前兩個元素作參數調用function。
python3中 reduce()函數已經被從全局名字空間裏移除了,它如今被放置在fucntools模塊裏