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