内置函数补充map、reduce和filter等

map函数:映射功能

map(function, iterable, ...):可迭代对象向函数function传入元素,并得到一个返回值.

1 >>> map(lambda x :x+1,[1,2,3.4])
2 [2, 3, 4.4]
3 >>> map(lambda x :x+"_key",{"key":"value","key1":"value2"})
4 ['key1_key', 'key_key']

注意,在python2和python3中,map函数的返回的类型不一样。

python2 map函数返回的是列表。

1 >>> l = map(lambda x :x+"_key",{"key":"value","key1":"value2"})
2 >>> l
3 ['key1_key', 'key_key']
4 >>> type(l)
5 <type 'list'>

python3中,map函数返回的是map对象,它是一个迭代器,可以调用next方法。

 1 >>> l = map(lambda x :x+"_key",{"key":"value","key1":"value2"})
 2 >>> l
 3 <map object at 0x10558c1d0>
 4 >>> next(l)
 5 'key_key'
 6 >>> 
 7 >>> next(l)
 8 'key1_key'
 9 >>> next(l)
10 Traceback (most recent call last):
11   File "<stdin>", line 1, in <module>
12 StopIteration

 reduce函数:处理一个序列,并返回一个值,适合求和。python2中自带reduce函数,python3中需要导入“from functool import reduce”。

reduce(function, iterable[, initializer ]):可迭代对象会把元素传给函数function,function会接收到两个值,如果未指定初始值initializer,则默认传0.

python3

1 >>> from functools import reduce 
2 >>> l = reduce(lambda x,y:x+y,range(1,100),100) #给一个初始值100
3 >>> l
4 5050

filter函数:

filter(function, iterable):把可迭代对象变成迭代器,把每一个元素传入函数function,function会返回布尔值,结果为Ture则保留。

python2: 

 1 >>> item_price =[
 2 ...     {"item":"apple","price":5},
 3 ...     {"item":"egg","price":4.5},
 4 ...     {"item":"water","price":1.5},
 5 ...     {"item":"fish","price":15}
 6 ... ]
 7 >>> l = filter(lambda d: d["price"]>=5,item_price)
 8 >>> type(l)
 9 <type 'list'>
10 >>> l
11 [{'item': 'apple', 'price': 5}, {'item': 'fish', 'price': 15}]

python3

>>> item_price =[
...     {"item":"apple","price":5},
...     {"item":"egg","price":4.5},
...     {"item":"water","price":1.5},
...     {"item":"fish","price":15}
... ]
>>> l = filter(lambda d: d["price"]>=5,item_price)
>>> type(l)
<class 'filter'>
>>> l
<filter object at 0x10558c438>
>>> next(l)
{'item': 'apple', 'price': 5}
>>> next(l)
{'item': 'fish', 'price': 15}
>>> next(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

 pyhton3中封装了很多,类型就是类。所以我们使用map、reduce和fliter返回的都是各自的类型,且都是生成器,可以调用next方法。而python2则都是列表。

原文地址:https://www.cnblogs.com/greatkyle/p/6726361.html