[编程经验]Python中的Lambda,Map, Reduce小结

今天要和大家分享的是Python匿名函数(anonymous functions),也叫lambda函数。匿名函数的意思就是说这个函数没有显式的函数名,因为一般在Python中定义函数的时候都是这个样子的,def function_name(参数列表): balabalaba。暂且把具有function_name的函数称作常规函数,而匿名函数就称作lambda函数。匿名函数没有显式的函数名,但是有显式的lambda标志,写了lambda的函数就可以称作匿名函数。一般情况大家不愿意用匿名函数(因为他

们不会用!),但是无论是Python的书还是网络教程,都会讲这个,而且是开始比较基础的部分,而匿名函数刚开始学又比较抽象,所以有必要给大家安利一下这个坑到底是什么!下面开始栗子讲解.

# lambda

"""
>>> def function_1(x, y):
       return x + y

>>> function_2 = lambda x,y: x + y
>>>
>>> function_1(1,2)
3
>>> function_2(1,2)
3
"""

通过这个栗子我们发现,function_1和function_2都可以用相同方式来调用。

区别在于匿名函数没有return语句,而匿名函数的返回值就是它定义的表达式。

匿名函数的生存周期就是在当前行,就是在那定义的,就在那里用,过了这村,后面就再不用他了。这也暗示了匿名函数为啥没有函数名,因为不会再用它啊,取个名字也是浪费感情。

# map()函数说明

一般和lambda表达式同时出现的还有map和reduce函数,接下来我们再看看

这是什么鬼。你可能听说过Hadoop里面的Map-Reduce过程,这里的和那个的

原理是类似的。map的意思不太好翻译,这样理解一下,有一个函数A,一个需要计算的对象B,把A map一下到B那么都对B里的每一个元素都使用了函数A。

接下来举个计算三角函数值的栗子。

import math
def function_5(x):
    return math.sin(x)

>>> list_1 = [-math.pi/4, math.pi/4]
>>> map(function_5, list_1)
[-0.7071067811865475, 0.7071067811865475]

如果我们不用常规函数,而是用lambda表达式,则

>>> map(lambda x: math.sin(x), list_1)

原来要用3行的代码,现在只要1行就可以搞定。

# reduce函数

如果我们直接reduce刚才定义的函数,看下会发生什么。

>>> reduce(function_5, list_a)

Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    reduce(function_5, list_a)
TypeError: function_5() takes exactly 1 argument (2 given)

TypeError,类型错误,它说function_5本来只要1个参数,而你给了2个。

哪里来的两个?因为我们的list_1中有2个元素,就是这么来的。

# reduce的语法是:

reduce(function, seq)

reduce会根据function的表达式,来依次计算seq中的元素。

还是举个栗子好了。

>>> reduce(lambda x,y: x+y, [47,11,42,13])
113
113 <== (((47 + 11) + 42) + 13)
# 计算一下1到100的和。
>>> reduce(lambda x, y: x+y, range(1,101))
5050

刚才我们的map函数返回值是多个,而reduce则只返回一个值。注意这里的区别。

# 是不是很简单 ?

最后需要说的是在Python 3里面,reduce函数被放到了functools模块里面,要用的话,需要from functools import reduce。

That‘s all!

每天进步一点点,日积月累,你就是那个可以把内裤穿在外面的人!加油哦~

本文为作者原创,如有雷同,必然是别人抄我的。

原文发布于微信公众号 - 机器学习和数学(ML_And_Maths)

原文发表时间:2017-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

算法02 七大排序之:直接选择排序和堆排序

上一篇总结了交换排序的冒泡排序和快速排序。这一篇要总结的是选择排序,选择排序分为直接选择排序和堆排序,主要从以下几点进行总结。 1、直接选择排序及算法实现 2、...

36570
来自专栏noteless

[一]基础类型概述

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

13630
来自专栏Python爬虫与算法进阶

说一道排序题

关于Python的sorted排序算法,这篇文章讲的比较详细:python sort函数内部实现原理,说到Python使用的是著名的Timesort算法。

8420
来自专栏数据结构与算法

06:整数奇偶排序

06:整数奇偶排序 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 给定10个整数的序列,要求对其重新排序。排序要求: 1...

40460
来自专栏数据结构与算法

P3709 大爷的字符串题(50分)

题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问...

35170
来自专栏小小挖掘机

各种排序算法的分析及java&python实现

排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。...

40370
来自专栏小樱的经验随笔

C/C++中连接函数strcat的应用(简单讲解)

有位学弟问到我如何将两个字符连接起来,想想java/python里面可以直接用+连接起来,可是C/C++里面有没有这么方便的做法呢?

12020
来自专栏五分钟学算法

每天一算:Evaluate Reverse Polish Notation

我们会在每天早上8点30分准时推送一条LeetCode上的算法题目,并给出该题目的动画解析以及参考答案,每篇文章阅读时长为五分钟左右。

7410
来自专栏五分钟学算法

五分钟弄懂有点难度的排序:堆排序

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

15140
来自专栏猿人谷

寻找和为定值的两个数

题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即...

29270

扫码关注云+社区

领取腾讯云代金券