前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内置函数 -- filter 和 map

内置函数 -- filter 和 map

作者头像
用户7798898
发布2020-09-27 15:33:08
3520
发布2020-09-27 15:33:08
举报

参考地址:http://www.cnblogs.com/sesshoumaru/p/6000788.html

英文文档:

filter(function, iterable)

Construct an iterator from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.

Note that filter(function, iterable) is equivalent to the generator expression (item for item in iterable if function(item)) if function is not None and (item for item in iterable if item) if function is None.

See itertools.filterfalse() for the complementary function that returns elements of iterable for which function returns false.

说明:

  1. filter函数用于过滤序列。过滤的方式则是采用传入的函数,去循环序列的元素调用,如果函数计算的结果为True则保留元素,否则将舍弃该元素。

代码语言:javascript
复制
>>> a = list(range(1,10)) #定义序列
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> def if_odd(x): #定义奇数判断函数
    return x%2==1

>>> list(filter(if_odd,a)) #筛选序列中的奇数
[1, 3, 5, 7, 9]

  2. 当function参数传入None时,序列中的元素值如果为False,也会自动舍弃。

代码语言:javascript
复制
>>> c = ['',False,'I',{}] #定义序列
>>> c
['', False, 'I', {}]

>>> list(filter(None,c)) #筛选函数为None,自动舍弃序列中的False值,空字符串、False值、空序列都是False值,所以丢弃
['I']

总结 : 简单的说(来自老男孩python全栈课程)

代码语言:javascript
复制
  filter: 过滤,符合条件的选取,不符合条件的过滤掉
代码语言:javascript
复制
  filter有两个参数, 第一个参数是一个函数, 第二个参数是一个可迭代的对象.  循环遍历第二个参数, 取出每一个,执行第一个函数,执行函数的结果返回ture,符合条件则留下,如果返回false,就是不满足条件
代码语言:javascript
复制
def f1(x):
    if x>20:
        return True
    else:
        return False

r1 = filter(f1,[11,22,33,44])

for i in r1:
    print(i)

当函数是一个很简单的表达式时,可以使用lambda表达式

代码语言:javascript
复制
r2 = filter(lambda x : x > 22,[11,22,33,44])
for i in r2:
    print(i)
代码语言:javascript
复制
map和filter是类似的.
代码语言:javascript
复制
  map: 对可迭代的集合中的每一个元素,传递到第一个函数中, 返回执行结果
代码语言:javascript
复制
  map有一个固定参数,一个可变参数, 第一个参数是一个函数, 可变参数是可迭代的对象.
代码语言:javascript
复制
#对集合中的内一个元素都加20
def m1(x):
    return x+20
m = map(m1, [1, 2, 3, 4, 5])
print(list(m))

  返回结果:

代码语言:javascript
复制
[21, 22, 23, 24, 25]
代码语言:javascript
复制
map的可变参数传递, 可以参考下面的内容, 转自文章http://www.cnblogs.com/sesshoumaru/p/6031819.html

英文文档:

map(function, iterable, ...)Return an iterator that applies function to every item of iterable, yielding the results. If additional iterable arguments are passed, functionmust take that many arguments and is applied to the items from all iterables in parallel. With multiple iterables, the iterator stops when the shortest iterable is exhausted. For cases where the function inputs are already arranged into argument tuples, see itertools.starmap().说明:  1. 函数接受一个函数类型参数、一个或者多个可迭代对象参数,返回一个可迭代器,此迭代器中每个元素,均是函数参数实例调用可迭代对象后的结果。

代码语言:javascript
复制
>>> a = map(ord,'abcd')
>>> a
<map object at 0x03994E50>
>>> list(a)
[97, 98, 99, 100]

  2. 当传入多个可迭代对象时,函数的参数必须提供足够多的参数,保证每个可迭代对象同一索引的值均能正确传入函数。

代码语言:javascript
复制
>>> a = map(ord,'abcd')
>>> list(a)
[97, 98, 99, 100]
>>> a = map(ord,'abcd','efg') # 传入两个可迭代对象,所以传入的函数必须能接收2个参数,ord不能接收2个参数,所以报错
>>> list(a)
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    list(a)
TypeError: ord() takes exactly one argument (2 given)

>>> def f(a,b):
    return a + b

>>> a = map(f,'abcd','efg') # f函数可以接受2个参数
>>> list(a)
['ae', 'bf', 'cg']

  3. 当传入多个可迭代对象时,且它们元素长度不一致时,生成的迭代器只到最短长度。

代码语言:javascript
复制
>>> def f(a,b):
    return a + b

>>> a = map(f,'abcd','efg') # 选取最短长度为3
>>> list(a)
['ae', 'bf', 'cg']

  4. map函数是一个典型的函数式编程例子。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档