①filter(参数1, 参数2) 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
参数1 : 函数名(lambda匿名函数也行)
参数2 : 可迭代对象
import math
# 过滤1到 10的偶数
def is_even(n):
return n % 2 == 0
ret_1 = filter(is_even, range(1, 11))
print(type(ret_1), ret_1 ,list(ret_1))
# <class 'filter'> <filter object at 0x0000026C660E95F8> [2, 4, 6, 8, 10]
# 过滤出1-100种平方根是整数的数
def is_sqr(x):
return math.sqrt(x) % 1 == 0
ret_2 = filter(is_sqr, range(1, 101))
print(type(ret_2), ret_2, list(ret_2))
# <class 'filter'> <filter object at 0x000001E5E717E128> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 匿名函数写法
# ret_3 = filter(lambda x : math.sqrt(x) % 1 == 0, range(1, 101))
②map(参数1, 参数2-1, 参数2-2.....) # 参数1中的方法需要几个参数, 参数2就需要几个
# 1
def add(x):
return x*x
ret1 = map(add, range(1, 10))
print(ret1) # <map object at 0x000002266AD98780>
print(list(ret1)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 2
def add(x, y):
return x+y
ret1 = map(add, range(1, 101), range(1, 2))
print(ret1) # <map object at 0x000002266AD98780>
print(list(ret1)) # [2] 第三个参数短,最后结果以他的长度为主
# 3
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_result) # <map object at 0x000001D070197828>
print(list(list_result)) # [103, 107, 113, 121]
# 4 用于对名字书写的修改
name_list={'toM', 'jEEry', 'loore'}
def format_name(s):
ss = s[0:1].upper()+s[1:].lower()
return ss
print(list(map(format_name, name_list)))
两者不同:
# map返回的是False和True
ret_map = map(lambda x: x > 5, range(10))
print(list(ret_map)) # [False, False, False, False, False, False, True, True, True, True]
# filter后汉书是将不符合元素的条件过滤掉
ret_filter = filter(lambda x: x > 5, range(10))
print(list(ret_filter)) # [6, 7, 8, 9]
其它: reduce函数之前也在内置函数中, Python3放在functools里了
from functools import reduce
def add_(x, y):
ret = x + y
return ret
ret = reduce(add_, [1, 2, 3, 4, 5, 6]) # 21
三者区别:
filter 过滤 map 检查 reduce 加工