匿名函数
lambda
lambda函数,即匿名函数,若函数只有一个表达式,就可以使用lambda函数,而无需使用def来定义复杂的函数了。由于lambda函数比较简洁,通常也叫做lambda表达式。
a.lambda函数实现
add = lambda x,y:x+y
print(add(3,4))
上面的lambda x,y:x+y
就是一个匿名函数,虽然没有return
语句,但依然能够返回结果。lambda x,y
是匿名函数的声明部分,而x+y
则是匿名函数的实现部分。这个匿名函数等价于下面的这个普通函数。
b.普通编程方式实现
def add(x,y):
return x+y
print(add(3,4))
上面的场景,把匿名函数的结果赋值给了add,已经变成了有名函数,与匿名函数的意义不符了。
匿名函数用于临时调用一次的场景,更多的情况是将匿名函数与其他函数配合使用,比如下面将要介绍的几个高阶函数。
高阶函数
只要满足下面的任意一个条件就是高阶函数:
一个函数的函数名作为参数传给另外一个函数;
def func(): print("普通函数") def high(func): print("高阶函数") func() high(func)
一个函数的返回值是另外一个函数;
def func(): print("普通函数") def high(func): print("高阶函数") return func res = high(func) res() 高阶函数 普通函数
map
map
会根据提供的函数对指定序列做映射。有两个参数,第一个参数是一个函数,第二个或多个参数是可迭代的序列。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。最终返回的是一个迭代器。
语法格式:
map(function, iterable,...)
def square(x):
return x ** 2
l1 = map(square,[1,2,3,4,5])
print(list(l1))
[1, 4, 9, 16, 25]
上面的square
函数相对简单,可以使用lambda
表达式进行表示
l2 = map(lambda x:x**2,[1,2,3,4,5])
print(l2)
print(list(l2))
<map object at 0x106121fa0>
[1, 4, 9, 16, 25]
filter
filter
是过滤的功能,比如在一个列表的元素里面过滤出我们想要的数据。filter函数接收两个参数,第一个是过滤函数,第二个是可迭代的序列。序列的每个元素作为参数传递给过滤函数进行判断,返回True或False,最后将返回True的元素放到新列表中
语法格式:
filter(function, iterable)
例如:在range(20)中过滤出大于5的数据
a. 通过列表推导式实现如下:
lists=[x for x in range(20) if x>5]
print(lists)
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
b. 通过普通编程的方式实现如下:
lists=[x for x in range(20)]
def func(li):
data=[]
for item in li:
if item>5:
data.append(item)
return data
print(func(lists))
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
c.通过filter函数实现如下:
lists=[x for x in range(20)]
def func(n):
return n > 5
newlist = filter(func,lists)
print(list(newlist))
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
d.在上例的基础上,通过lambda来实现
lists=[x for x in range(20)]
def func(n):
return n > 5
res = filter(lambda x:x > 5,lists)
print(res)
print(list(res))
<filter object at 0x10d2fafd0>
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
reduce
python3中已不再内置reduce
函数,需要从functools
模块中引用
reduce
函数有三个参数,第一个参数是一个函数,第二个参数是一个序列,第三个参数是initial
,是初始值,默认是None。reduce
函数的作用是通过提供的函数,对序列中的内容进行累积处理,返回函数的计算结果。
语法格式:
reduce(function, sequence[,initial])
from functools import reduce
def add(x,y):
return x + y
print(reduce(add,[1,2,3,4,5,6]))
21
在reduce
中使用lambda
函数
from functools import reduce
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6]))
21
为第三个参数initial
设置初始值
from functools import reduce
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6], 10))
31
sorted
sorted
是个排序函数,可以对list进行排序,也可以接收一个key
函数来实现自定义排序。sorted
函数包含三个参数,第一个参数是可迭代对象,第二个参数是一个key
函数,以一定的算法对第一个参数中的元素进行修改或计算。第三个参数reverse
是排序规则,默认是升序,若要降序只需reverse=True
即可。
语法格式:
sorted(iterable[,key,reverse])
示例1:对列表中的数值进行排序
list1 = [1, 2, 33, 22, 54, 6, 4, 98, 19]
print(sorted(list1))
print(sorted(list1, reverse=True))
[1, 2, 4, 6, 19, 22, 33, 54, 98]
[98, 54, 33, 22, 19, 6, 4, 2, 1]
示例2:对字典中的人安装年龄排序,并按年龄的顺序输出人的名字
dict1 = {
'zhangsan': 18,
'lisi': 22,
'wangwu': 19,
'yanliu': 17
}
res = sorted(dict1)
print(res)
['lisi', 'wangwu', 'yanliu', 'zhangsan']
上面的结果,因为没有指定sorted
的key
参数,默认以字典的key
即名字进行对比排序
改写如下:
dict1 = {
'zhangsan': 18,
'lisi': 22,
'wangwu': 19,
'yanliu': 17
}
def func(k):
return dict1[k]
res = sorted(dict1, key=func)
print(res)
['yanliu', 'zhangsan', 'wangwu', 'lisi']
实现了基本需求。可以再上面的基础上将func使用lambda
匿名函数来实现
dict1 = {
'zhangsan': 18,
'lisi': 22,
'wangwu': 19,
'yanliu': 17
}
res = sorted(dict1, key=lambda k: dict1[k])
print(res)
['yanliu', 'zhangsan', 'wangwu', 'lisi']
这样就实现。另外max()
函数和min()
函数等都可以在类似的场景下使用。
res=max(salaries,key=lambda k:salaries[k])
print(res)
lisi
res=min(salaries,key=lambda k:salaries[k])
print(res)
yanliu
zip
zip
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
语法格式:
zip(iter1[,iter2[...]])
a = [1,2,3]
b = [4,5,6]
c = [7,8,9,10]
z1 = zip(a,b)
print([i for i in z1])
z2 = zip(a,c)
print([j for j in z2])
[(1, 4), (2, 5), (3, 6)]
[(1, 7), (2, 8), (3, 9)]