Python匿名函数和高阶函数


匿名函数

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']

上面的结果,因为没有指定sortedkey参数,默认以字典的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)]

文章作者: 老百
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 老百 !
 上一篇
Python之面向对象编程 Python之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的方法。Python就是一种面向对象的语言,支持面向对象编程,在其内部,一切都被视作对象。
2022-10-15
下一篇 
Python之装饰器 Python之装饰器
装饰器(Decorator)是Python中一个重要部分,它本质上是一个函数,不同于普通函数,装饰器的返回值是一个函数对象。通过利用装饰器,我们可以让其他函数在不做任何代码改动的情况下增加额外的功能,同时也能够让代码更加简洁。
2022-10-11
  目录