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