生成器表達式和推導式

一 、推導式python

是Python的一種獨有特性。推導式是能夠從一個數據序列構建另外一個新的數據序列的結構體。 共有三種推導,在Python2和3中都有支持:函數

  • 列表(list)推導式(或稱:列表表達式
  • 字典(dict)推導式
  • 集合(set)推導式   

 

一、列表推導式 (使用[]生成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模塊裏

相關文章
相關標籤/搜索