Python入门高阶教程-高阶函数

xiaoyi
xiaoyi
xiaoyi
14
文章
0
评论
2021-03-2911:54:16 评论 1,173 2831字
摘要

准确的说,Lambda 函数并不能称为高阶函数。但是在实际项目的开发过程中,Lambda 函数使用的相当频繁,并且效率也相当高,所以,一起来看看吧!

做数据分析的话,我觉得高阶部分的内容你一节都不要错过,这部分内容算是数据预处理的核心了。我也将会从高阶函数的使用,NumPy,SciPy,Pandas 以及可能会用到的 Scikit-learn 几个部分开始。你可能现在还不懂这些基础包是干什么的,这不重要,我会在干货内容中插入一些我踩过坑的小项目,回过头你再来品一下文章,想必收获会非常大。

一、Lambda 函数

准确的说,Lambda 函数并不能称为高阶函数。但是在实际项目的开发过程中,Lambda 函数使用的相当频繁,并且效率也相当高,所以,一起来看看吧!

Lambda 函数又称为 Python 的匿名函数,一次性函数。

Lambda函数是使用 lambda 运算符创建的,可以包含任意多的参数,但它只有一个表达式。其语法如下:

lambda参数:表达式

例如:计算一个数的平方

# 通过 lambda 表达式计算一个数的平方result = lambda x: x*xprint(result(5))

例如:计算两个数相乘

# 通过 lambda 表达式计算两个数相乘result = lambda x, y: x*yprint(result(2, 5))

可能大家都明白 lambda 函数怎么用了吧。

相比起普通函数,为什么 lambda 表达式会更简单方便呢,我再举个例子:

# 输出10以内每个数乘以2:# 定义函数def new_func(number):    return number*2# 一般函数写法result_number = [new_func(number) for number in range(10)]print(result_number)# lambda 函数写法result_number = list(map(lambda x: x*2, [number for number in range(10)]))print(result_number)# 输出结果[0, 2, 4, 6, 8, 10, 12, 14, 16, 18][0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

可以看到,同样的结果,使用 lambda 的方式会更简单些。

这里在 lambda 表达式中使用了高阶函数 map,后面也会介绍到,往下看

二、map 函数

说到map,我首先想到的是 Java 中的 map 数据类型:Map<K,V>一种键值对的存储方式。其次想到的是 reduce,map-reduce,Hadoop早期的一种大数据处理方式。放一张 Google MapReduce 的中文版摘要,大家细品

Python入门高阶教程-高阶函数

map 函数是 Python 的内建函数,可以直接使用。map() 函数接接收两个参数,一个是函数,一个是可迭代对象 Iterable。

map将传入的函数依次作用到每个Iterable 上,并把结果作为新的 Iterator 返回。

别慌,上面一段话你可能云里雾里,我举个例子你在品

举例:有一个函数f(x)=x*2,要把这个函数作用在list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]上

熟不熟悉?这不就是上面 lambda 中的例子吗?

其中,0-9数据集合是可迭代对象, f(x)=x*2作为我们的 lambda 函数,返回的新数据集是 Iterator。

再来个例子,将刚才的 list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 全部转换为字符

# 将[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 全部转换为字符list(map(str, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))# 输出["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

看懂了吧,map() 就是一个映射函数,会根据提供的函数对指定序列做映射,映射的结果可以进行相应的类型转换。

三、reduce 函数

再来看 reduce 函数,reduce 函数也是 Python 的内建函数,可以直接使用。reduce() 函数接收和 map 同样的两个参数,不同的是 reduce 把上一次的结果继续和序列的下一个元素做累积计算。

直接看例子:

# 猜猜这是在干嘛?reduce(lambda x,y: x+y, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])# 输出45

你可能猜到了,做累加,对,没错!0~9数字的累加和,结果是45

reduce 函数的效果可以这样表示

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

再来张图,别说你还看不懂:

Python入门高阶教程-高阶函数

reduce() 是累积运算函数,会根据提供的运算函数对迭代类型参数中的元素进行累积运算。

四、filter 函数

filter 的中文翻译是过滤,filter 函数也是 Python 的内建函数,可以直接使用。filter() 函数同样接收两个参数:一个函数和一个序列。

filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True 或者 False 决定保留还是丢弃该元素。

这个介绍应该都能看懂,就把 filter 想象成一个过滤器。

看个例子:对于 list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 输出其中的偶数

# 输出所有的偶数list(filter(lambda x:x%2==0, [1, 2, 3, 4, 5, 6, 7, 8, 9]))# 输出[2, 4, 6, 8]

很简单,filter() 是过滤函数,会根据提供的过滤函数对迭代类型参数中的元素进行过滤,保留使运算函数返回 true 的元素。

五、sorted 函数

sorted 函数也如它的中文意思一样,可以对所有可迭代的对象进行排序操作。

看一下sorted 的语法 :

sorted(iterable, cmp=None, key=None, reverse=False)
  • iterable :表示一个可迭代对象
  • cmp:比较的函数,比较可迭代对象中的两个对象
  • key:要来比较的元素
  • reverse:排序规则。reverse = True 降序 , reverse = False 升序(默认)

举例1:将[2, 5, 7, 8, 1, -1]从大到小排列

sorted([2, 5, 7, 8, 1, -1], reverse=True)# 输出[8, 7, 5, 2, 1, -1]

举例2:将 [("b",2),("a",1),("c",3),("d",4)] 比较每个元组的第一位数进行排序

list_number = [("b", 2), ("a", 1), ("c", 3), ("d", 4)]sorted(list_number, key=lambda x: x[0])# 输出[("a", 1), ("b", 2), ("c", 3), ("d", 4)]

可以看到,sorted 函数支持的排序更加的广泛。这里不要将 sort 和 sorted 搞混了,sort 函数用于对列表进行排序,而 sorted 函数支持对所有可迭代对象进行排序。

End.

爱数据网专栏作者:xiaoyi

作者介绍:数据分析从业者,金融风控爱好者,不定期原创技术分享,努力成为数据分析、金融风控领域的终身学习者、实践者、传播者

个人微信公众号:小一的学习笔记(ID:xiaoyi_learning)

本文为挖数网专栏作者原创文章,未经允许禁止转载,需要转载请微信联系授权(微信号:lovedata0520)

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: