一、filter
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
filter(function, iterable(可迭代对象))
例1:要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数。
def is_odd(x):
return x % 2 == 1
然后,利用filter()过滤掉偶数。
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
#输出结果为:[1, 7, 9, 17]
例2:利用filter() 删除 None 或者空字符串:
def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
#执行结果: ['test', 'str', 'END']
filter
这些内置函数一般都喜欢与lambda
一起搭配使用,因此上述的两个例子,其实可以直接用一行代码改写为:
#例1:
filter(lambda x :x %2==1, [1, 4, 6, 7, 9, 12, 17])
#例2:
filter(lambda s:s and len(s.strip())>0, ['test', None, '', 'str', ' ', 'END'])
二、map
map()
函数应用于每一个可迭代的项,返回的是一个结果list。
如果有其他的可迭代参数传进来,map()
函数则会把每一个参数都以相应的处理函数进行迭代处理。
map()
函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
map(function, iterable(可迭代对象))
例3:有一个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
map(pow2,L)
#返回的是一个迭代对象,循环后输出结果:[1, 4, 9, 16]
#lambda写法:
map(lambda x :x*x, L)
三、max
函数功能为取传入的多个参数中的最大值,或者传入的可迭代对象元素中的最大值。默认数值型参数,取值大者;字符型参数,取字母表排序靠后者。还可以传入命名参数key,其为一个函数,用来指定取最大值的方法。default命名参数用来指定最大值不存在时返回的默认值。
函数至少传入两个参数,但是有只传入一个参数的例外,此时参数必须为可迭代对象,返回的是可迭代对象中的最大元素。
>>> max(1) # 传入1个参数报错
Traceback (most recent call last):
File "", line 1, in
max(1)
TypeError: 'int' object is not iterable
>>> max(1,2) # 传入2个参数 取2个中较大者
2
>>> max(1,2,3) # 传入3个参数 取3个中较大者
3
>>> max('1234') # 传入1个可迭代对象,取其最大元素值
'4'
- 当传入参数为数据类型不一致时,传入的所有参数将进行隐式数据类型转换后再比较,如果不能进行隐式数据类型转换,则会报错。
>>> max(1,1.1,1.3E1) # 整数与浮点数可取最大值
13.0
>>> max(1,2,3,'3') # 数值与字符串不能取最大值
Traceback (most recent call last):
File "", line 1, in
max(1,2,3,'3')
TypeError: unorderable types: str() > int()
>>> max([1,2],[1,3]) # 列表与列表可取最大值
[1, 3]
>>> max([1,2],(1,3)) # 列表与元组不能取最大值
Traceback (most recent call last):
File "", line 1, in
max([1,2],(1,3))
TypeError: unorderable types: tuple() > list()
- 当存在多个相同的最大值时,返回的是最先出现的那个最大值。
#定义a、b、c 3个列表
>>> a = [1,2]
>>> b = [1,1]
>>> c = [1,2]
#查看a、b、c 的id
>>> id(a)
68128320
>>> id(b)
68128680
>>> id(c)
68128240
#取最大值
>>> d = max(a,b,c)
>>> id(d)
68128320
#验证是否最大值是否是a
>>> id(a) == id(d)
True
- 默认数值型参数,取值大者;字符型参数,取字母表排序靠后者;序列型参数,则依次按索引位置的值进行比较取最大者。还可以通过传入命名参数key,指定取最大值方法。
>>> max(1,2) # 取数值大者
2
>>> max('a','b') # 取排序靠后者
'b'
>>> max('ab','ac','ad') # 依次按索引比较取较大者
'ad'
>>> max(-1,0) # 数值默认去数值较大者
0
>>> max(-1,0,key = abs) # 传入了求绝对值函数,则参数都会进行求绝对值后再取较大者
-1
- key参数的另外一个作用是,不同类型对象本来不能比较取最大值的,传入适当的key函数,变得可以比较能取最大值了。
>>> max(1,2,'3') #数值和字符串不能取最大值
Traceback (most recent call last):
File "", line 1, in
max(1,2,'3')
TypeError: unorderable types: str() > int()
>>> max(1,2,'3',key = int) # 指定key为转换函数后,可以取最大值
'3'
>>> max((1,2),[1,1]) #元组和列表不能取最大值
Traceback (most recent call last):
File "", line 1, in
max((1,2),[1,1])
TypeError: unorderable types: list() > tuple()
>>> max((1,2),[1,1],key = lambda x : x[1]) #指定key为返回序列索引1位置的元素后,可以取最大值
(1, 2)
- 当只传入的一个可迭代对象时,而且可迭代对象为空,则必须指定命名参数default,用来指定最大值不存在时,函数返回的默认值。
>>> max(()) #空可迭代对象不能取最大值
Traceback (most recent call last):
File "", line 1, in
max(())
ValueError: max() arg is an empty sequence
>>> max((),default=0) #空可迭代对象,指定default参数为默认值
0
>>> max((),0) #默认值必须使用命名参数进行传参,否则将被认为是一个比较的元素
Traceback (most recent call last):
File "", line 1, in
max((),0)
TypeError: unorderable types: int() > tuple()
四、min
min 函数与max函数的用法基本一致,只是min函数是用来求迭代对象的最小值,max是用来求最大值。