谈谈python里面那些高级函数

简介: 谈谈python里面那些高级函数

谈到python,我们就不得不说python里面的一些黑魔法,例如我们的高阶函数就是黑魔法其中之一。

640.jpg


高阶函数是什么?

简而言之就是将一个函数作为参数传到另一个函数A中,那么这个函数A就是高阶函数。(可接收其他函数作为参数的函数称为高阶函数)


我们来看一个简单的小例子:


def func(a, list):
    return [a(x) for x in list]
def double(x):
    return 2 * x
print(func(double, [1, 3, 5, 7]))


640.png


上面的代码中,func 是一个高阶函数,它接收两个参数,第 1 个参数是函数,也就是我们定义的double函数,第 2 个参数是list,func 的功能是将函数 a 逐个作用于list上,生成一个新的数组。


我们在使用func函数的时候传入的第一个参数是函数的名字,不需要括号和其他的东西,只传函数名即可。


下面我们来看看,python自带了一些高阶函数,他们分别是map,reduce,filter。除此之外还有一个很特别的函数叫匿名函数lambda。

在了解内置高阶函数之前,我们先来看看lambda是个怎么样的东西。


就拿我们刚刚定义的double函数来说,它的功能是将传入的参数整体乘2,对于这么简单的功能,我们可能都不需要用def来定义函数,这个时候我们使用lambda来快捷定义函数即可:

double = lambda x: 2 * x
print(double(3))

640.png



代码形式:

lambda 参数: 表达式


主要看来其实就是定义的时候换了一种方式,类似于定义一个表达式这样,可以对这个表达式直接进行赋值。调用的时候还是一样,函数的名字就是赋值的变量名。

当然,我们也可以在定义的时候直接调用,也能运算结果:

print((lambda x: 2 * x)(3))


640.png


lambda定义与使用如此方便就决定了它的使用场景会特别的多,一般的:当我们需要创建一些临时的、小巧的函数时,就会使用lambda了。一般的,当我们使用高阶函数的时候会经常和lambda函数一起联用。

对于上面的高阶函数我们可以使用lambda改写:

a = func(lambda x: 2 * x, [1, 3, 5, 7])
print(a)


Tips:

  • 匿名函数本质上是一个函数,没有函数名称,因此使用匿名函数不用担心函数名冲突;
  • 匿名函数一般适用于创建一些临时性的,小巧的函数;



map函数


下面我们来看看MAP函数:

map函数的使用形式如下:

map(function, sequence)

function就是传入的函数名,sequence就是需要被function函数处理元素组成的序列。 整个过程可以理解成如下:

sequence = [item1, item2, item3, item4, item5]
for i in sequence:
    function(i)



我们来看看几个例子:

map(lambda x: x**2, [1, 2, 3])


640.png

这是一个map对象(迭代器),我们可以通过将它结果输出:

for i in map(lambda x: x**2, [1, 2, 3]):
    print(i)


640.png

当然,我们也可以将map的结果直接转化成list:

list(map(lambda x: x**2, [1, 2, 3]))



reduce函数


python3版本的reduce函数已经不再是内置函数了,它需要在functools模块中导入:

from functools import reduce

reduce函数的使用形式如下:

reduce(function, sequence[, initial])

先将 sequence 的前两个 item 传给 function,即 function(item1, item2),函数的返回值和 sequence 的下一个 item 再传给 function,即 function(function(item1, item2), item3),如此迭代,直到 sequence 没有元素,如果有 initial,则作为初始值调用。

reduece(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
a = reduce(lambda x, y: x*y, [1, 2, 3, 4, 5, 6])
print(a)

有一点需要注意的是reduce的传入函数需要传入两个参数,例如上面的例子:我们先选取list中的前两个元素进行lambda函数相乘,然后将相乘的结果再与第三个元素相乘,如此继续下去,一直到整个list元素都被读取为止。

reduce(lambda x, y: x * y, [1, 2, 3, 4])  # 相当于 ((1 * 2) * 3) * 4
reduce(lambda x, y: x * y, [1, 2, 3, 4], 5) # ((((5 * 1) * 2) * 3)) * 4
reduce(lambda x, y: x / y, [2, 3, 4], 72)  #  (((72 / 2) / 3)) / 4
reduce(lambda x, y: x + y, [1, 2, 3, 4], 5)  # ((((5 + 1) + 2) + 3)) + 4
reduce(lambda x, y: x - y, [8, 5, 1], 20)  # ((20 - 8) - 5) - 1
f = lambda a, b: a if (a > b) else b   # 两两比较,取最大值
reduce(f, [5, 8, 1, 10])



filter函数


filter 函数用于过滤元素,它的使用形式如下:

filter(function, sequnce)

解释:将 function 依次作用于 sequnce 的每个 item,即 function(item),将返回值为 True 的 item 组成一个 List/String/Tuple (取决于 sequnce 的类型,python3 统一返回迭代器, 和map一样) 返回。


其实简单来说filter就是一个过滤器,筛选sequnce里面有用的元素。整个过程类似如下:

sequence = [item1, item2, item3, item4, item5]
sequence2 = []
for i in sequence:
    if function(i)==True:
        sequence2.append(i)
print(sequence2)



我们来看一个例子:

def odd(x):
    return x % 2
number = filter(odd,range(10))
print(number)
            <filter object at 0x0000000002F58D68>
number = list(filter(odd,range(10)))
print(number)
            [1, 3, 5, 7, 9]


换成lambda:

number = list(filter(lambda x: x%2,range(10)))
print(number)
            [1, 3, 5, 7, 9]

以上就是我们在python3中常用也不常用的高阶函数了,他们为函数式编程提供了不少便利,可使代码变得更简洁,如果有需要用到的地方大家以后可以尽量去使用哦!

相关文章
|
2月前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
80 0
|
21天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
124 67
|
14天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
42 18
|
6天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
37 8
|
15天前
|
Python
Python中的函数
Python中的函数
31 8
|
22天前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
29天前
|
Python
Python中的`range`函数与负增长
在Python中,`range`函数用于生成整数序列,支持正向和负向增长。本文详细介绍了如何使用`range`生成负增长的整数序列,并提供了多个实际应用示例,如反向遍历列表、生成倒计时和计算递减等差数列的和。通过这些示例,读者可以更好地掌握`range`函数的使用方法。
45 5
|
2月前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解
|
2月前
|
存储 数据安全/隐私保护 索引
|
1月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。