filter函数和map函数
字符串函数strip的作用filter
filter()函数接收⼀个函数 f 和⼀个可迭代对象,这个函数 f 的作⽤是对每个元素进⾏判断,返回 True或 False,filter()根据判断结果⾃动过滤掉不符合条件的元素,返回由符合条件元素组成的filter对象(⼀个迭代器)。
例如,要从⼀个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,⾸先,要编写⼀个判断奇数的函数:
def is_odd(x):
return x % 2 == 1
然后,利⽤filter()过滤掉偶数:
>>>list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17]))
结果:
[1, 7, 9, 17]
利⽤filter(),可以完成很多有⽤的功能,例如,删除 None 或者空字符串:
def is_not_empty(s):
return s and len(s.strip()) > 0
>>>list(filter(is_not_empty, ['test', None, '', 'str', '', 'END']))
结果:
['test', 'str', 'END']
注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
当rm为空时,默认删除空⽩符(包括'\n', '\r', '\t', ' '),如下:
>>> a = ' 123'
>>> a.strip()
'123'
>>> a = '\t\t123\r\n'
>>> a.strip()
'123'
练习:
请利⽤filter()过滤出1~100中平⽅根是整数的数,即结果应该是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
⽅法:
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
print list(filter(is_sqr, range(1, 101)))
结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
map
中的map函数应⽤于每⼀个可迭代的项,返回的是⼀个结果迭代器。如果有其他的可迭代参数传进来,map函数则会把每⼀个参数都以相应的处理函数进⾏迭代处理。map()函数接收两个参数,⼀个是函数,⼀个是序列,map将传⼊的函数依次作⽤到序列的每个元素,并把结果作为map对象返回。
有⼀个list, L = [1,2,3,4,5,6,7,8],我们要将f(x)=x^2作⽤于这个list上,那么我们可以使⽤map函数处理。
l=[1,2,3,4]
def pow2(x):
return x*x
print(map(pow2,l))  #<map object at 0x02EF5530>
print(list(map(pow2,l)))    # [1, 4, 9, 16]
print(tuple(map(pow2,l)))  # (1, 4, 9, 16)
>>>def square(x) :            # 计算平⽅数
...    return x ** 2
...
>>> map(square, [1,2,3,4,5])  # 计算列表各个元素的平⽅
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使⽤ lambda 匿名函数
[1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进⾏相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
如果函数有多个参数, 但每个参数的序列元素数量不⼀样, 会根据最少元素的序列进⾏:
>>> listx = [1,2,3,4,5,6,7]      # 7 个元素
>>> listy = [2,3,4,5,6,7]        # 6 个元素
>>> listz = [100,100,100,100]    # 4 个元素
>>> list_result = map(lambda x,y,z : x**2 + y + z,listx, listy, listz)
>>> print(list(list_result))
[103, 107, 113, 121]
明显可以看出是由于 lambda 中的 z 参数,实际是使⽤了 listz, ⽽ listz ⾥⾯只有 4 个元素, 所以即使 listx 有 7 个元素, listy 有 6 个元素,也不会继续执⾏了,只执⾏了 4 个元素的的计算。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。