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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值