map,enumerate,zip,filter



1、並行遍歷:zip和map

內置的zip函數可以讓我們使用for循環來並行使用多個序列。在基本運算中,zip會取得一個或多個序列爲參數,然後返回元組的列表,將這些序列中的並排的元素配成對。

示例一:
L1 = [1,2,3,4]

L2 = [5,6,7,8]

#要合併這些列表中的元素,可以使用zip來創建一個元組對的列表。與range一樣,zip是一個可迭代對象,因此,必須將其包含在一個list調用中一邊一次性顯示所有結果。

zip(L1,L2)

list(zip(L1,L2))   #!註釋掉這一行,運行結果依然如次

for (x,y) in zip(L1,L2):

       print(x,'+',y,'=',x + y)

運行結果爲:

1 + 5 = 6

2 + 6 = 8

3 + 7 = 10

4 + 8 = 12

 

示例二:

L1 = [1,2,3,4]

L2 = [5,6,7,8]

L3 = [9,10,11,12]

zip(L1,L2,L3)

list(zip(L1,L2,L3))

for (x,y,z) in zip(L1,L2,L3):

       print(x,'+',y,'+',z,'=',x + y + z)

結果爲:

1 + 5 + 9 = 15

2 + 6 + 10 = 18

3 + 7 + 11 = 21

4 + 8 + 12 = 24

 

嚴格來講,zip比這個例子更一般化。可以有接受任何類型的序列(就是任何可迭代的對象,包括文件),可以有兩個以上的參數。當參數長度不同時,zip會以最短序列的長度爲準來截斷所得到的的元組。
在Python 2.X中,相關的內置map函數,用類似方式把序列的元素配對起來,但是如果參數長度不同,則會爲較短的序列用None補齊。而python3不再支持該函數。一般來講,map會帶一個函數,以及一個或多個的序列參數,然後用從序列中取出的並行元素調用函數的結果收集起來。、
使用zip構造字典,非常方便。

示例:

keys = ['spam','eggs','toast']

vals = [1,3,5]

list(zip(keys,vals))

D2 = {}

for (k,v) in zip(keys,vals):

       D2[k] = v

print(D2)

運行結果爲:{'toast': 5, 'eggs': 3, 'spam': 1}

在python2.2和後續版本中,可以完全跳過for循環,直接把zip過的健/值列表傳給內置的dict構造函數,以上劃線部分可以換做D3 = dict(zip(keys,vals))。

內置變量名dict其實是python中的類型名稱。




2、產生偏移和元素:enumerate

#enumerate 是python中的內置函式


#enumerate(iterable)



#適合for循環,可以同時循環序號和元素

mylist=["a","b","c","d","e","f"]

 print enumerate(mylist)

 for index,object in enumerate(mylist):
     print index,object



#結果爲
1 a
2 b
3 c
4 d
5 e
6 f


我們可以通過range產生字符串中元素的偏移值或是偏移值處的元素,在有些程序中,我們兩者都需要:要用的元素以及這個元素的偏移值。我們可以使用for循環來實現:

示例一:

S = "spam"

offset = 0

for item in S:

       print(item,'appears at offset',offset)

       offset += 1



結果爲:

s appears at offset 0

p appears at offset 1

a appears at offset 2

m appears at offset 3

 

但是呢,內置函數enumerate可以幫我們做到:結果同上。

for (offset,item) in enumerate(S):

       print(item,'appears at offset',offset)

Enumerate函數返回一個生成器對象:這個對象有一個next方法,由下一個內置函數調用它,並且在循環中每次迭代的時候它會返回一個(index,value)的元組。



3、 filter函數

filter()函數可以對序列做過濾處理,就是說可以使用一個自定的函數過濾一個序列,把序列的每一項傳到自定義的過濾函數裏處理,並返回結果做過濾。最終一次性返回過濾後的結果。

【filter()函數有兩個參數】

第一個,自定函數名,必須的

第二個,需要過濾的列,也是必須的

filter(function, sequence):對sequence中的item依次執行function(item),將執行結果爲True的item組成一個List/String/Tuple(取決於sequence的類型)返回:
>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> filter(f, range(2, 25)) 
[5, 7, 11, 13, 17, 19, 23]
>>> def f(x): return x != 'a' 
>>> filter(f, "abcdef") 
'bcdef'


【DEMO】

需求,過濾大於5小於10的數

# coding=utf8
# 定義大於5小於10的函數
def guolvhanshu(num):
if num>5 and num<10:
return num

# 定義一個序列
seq=(12,50,8,17,65,14,9,6,14,5)

# 使用filter函數
result=filter(guolvhanshu,seq)

# (8,9,6)
print result



執行結果

(8, 9, 6)

因爲8,9,6大於5,小於10所以被過濾下來了。



4、reduce函數

reduce(function, sequence, starting_value):對sequence中的item順序迭代調用function,如果有starting_value,還可以作爲初始值調用,例如可以用來對List求和:
>>> def add(x,y): return x + y 
>>> reduce(add, range(1, 11)) 
55 (注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20) 
75 (注:1+2+3+4+5+6+7+8+9+10+20

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章