Python 特殊函数解析(lambda 函数,map 函数,filter 函数,reduce 函数)
写在之前
今天给大家介绍几个比较特殊的函数,他们具有函数式编程的特点,有人将它们视为 Python 可进行 「函数式编程」 的见证,至于什么是函数式编程,不是本篇文章的重点,感兴趣的可以去了解一下。老读者可能都知道,我非常推崇 Python 的简洁优雅,而今天的这几个函数,有了它们,最大的好处就是可以让程序更简洁,当然,没有它们程序也可以用其它方式实现。
lambda 函数
lambda 是一个可以只用一行就能解决问题的函数,让我们先看下面的例子:
- >>> def add(x):
- ... x += 1
- ... return x
- ...
- >>> numbers = range(5)
- >>> list(numbers)
- [0, 1, 2, 3, 4]
- >>> new_numbers = []
- >>> for i in numbers:
- ... new_numbers.append(add(i))
- ...
- >>> new_numbers
- [1, 2, 3, 4, 5]
在上面的这个例子中,函数 add() 充当了一个中间角色,当然上面的例子也可以如下实现:
- >>> new_numbers = [i+1 for i in numbers]
- >>> new_numbers
- [1, 2, 3, 4, 5]
首先我要说,上面的列表解析式其实是很好用的,但是我偏偏要用 lambda 这个函数代替 add(x)
:
- >>> lamb = lambda x: x+1
- >>> new_numbers = []
- >>> for i in numbers:
- ... new_numbers.append(lamb(i))
- ...
- >>> new_numbers
- [1, 2, 3, 4, 5]
在这里的 lamb 就相当于 add(x) ,lamb = lambda x : x+1
就相当于 add(x) 里的代码块。下面再写几个应用 lambda 的小例子:
- >>> lamb = lambda x,y : x + y
- >>> lamb(1,2)
- 3
- >>> lamb1 = lambda x : x ** 2
- >>> lamb1(5)
- 25
由上面的例子我们可以总结一下 lambda 函数的具体使用方法:lambda 后面直接跟变量,变脸后面是冒号,冒号后面是表达式,表达式的计算结果就是本函数的返回值。
在这里有一点需要提醒的是,虽然 lambda 函数可以接收任意多的参数并且返回单个表达式的值,但是 lambda 函数不能包含命令且包含的表达式不能超过一个。如果你需要更多复杂的东西,你应该去定义一个函数。
lambda 作为一个只有一行的函数,在你具体的编程实践中可以选择使用,虽然在性能上没什么提升,但是看着舒服呀。
map 函数
我们在上面讲 lambda 的时候用的例子,其实 map 也可以实现,请看下面的操作:
- >>> numbers = [0,1,2,3,4]
- >>> map(add,numbers)
- [1, 2, 3, 4, 5]
- >>> map(lambda x: x + 1,numbers)
- [1, 2, 3, 4, 5]
map 是 Python 的一个内置函数,它的基本格式是:map(func, seq)
。
func 是一个函数对象,seq 是一个序列对象,在执行的时候,seq 中的每个元素按照从左到右的顺序依次被取出来,塞到 func 函数里面,并将 func 的返回值依次存到一个列表里。
对于 map 要主要理解以下几个点就好了:
1.对可迭代的对象中的每一个元素,依次使用 fun 的方法(其实本质上就是一个 for 循环)。
2.将所有的结果返回一个 map 对象,这个对象是个迭代器。
我们接下来做一个简单的小题目:将两个列表中的对应项加起来,把结果返回在一个列表里,我们用 map 来做,如果你做完了,请往下看:
- >>> list1 = [1,2,3,4]
- >>> list2 = [5,6,7,8]
- >>> list(map(lambda x,y: x + y,list1,list2))
- [6, 8, 10, 12]
你看上面,是不是很简单?其实这个还看不出 map 的方便来,因为用 for 同样也不麻烦,要是你有这样的想法的话,那么请看下面:
- >>> list1 = [1,2,3,4]
- >>> list2 = [5,6,7,8]
- >>> list3 = [9,10,11,12]
- >>> list(map(lambda x,y,z : x + y + z,list1,list2,list3))
- [15, 18, 21, 24]
你看三个呢?是不是用 for 的话就稍显麻烦了?那么我们在想如果是 四个,五个乃至更多呢?这就显示出 map 的简洁优雅了,并且map 在性能上的优势也是杠杠的。
filter 函数
filter 翻译过来的意思是 “过滤器”,在 Python 中,它也确实是起到的是过滤器的作用。这个解释起来略微麻烦,还是直接上代码的好,在代码中体会用法是我在所有的文章里一直在体现的:
- >>> numbers = range(-4,4)
- >>> list(filter(lambda x: x > 0,numbers))
- [1, 2, 3]
上面的例子其实和下面的代码是等价的:
- >>> [x for x in numbers if x > 0]
- [1, 2, 3]
然后我们再来写一个例子体会一下:
- >>> list(filter(lambda x: x != 'o','Rocky0429'))
- ['R', 'c', 'k', 'y', '', '', '', '']
reduce 函数
我在之前的文章中很多次都说过,我的代码都是用 Python3 版本的。在 Python3 中,reduce 函数被放到 functools 模块里,在 Python2 中还是在全局命名空间。
同样我先用一个例子来跑一下,我们来看看怎么用:
- >>> reduce(lambda x,y: x+y,[1,2,3,4])
- 10
reduce 函数的第一个参数是一个函数,第二个参数是序列类型的对象,将函数按照从左到右的顺序作用在序列上。如果你还不理解的话,我们下面可以对比一下它和 map 的区别:
- >>> list1 = [1,2,3,4]
- >>> list2 = [5,6,7,8]
- >>> list(map(lambda x,y: x + y,list1,list2))
- [6, 8, 10, 12]
对比上面的两个例子,就知道两者的区别,map 相当于是上下运算的,而 reduce 是从左到右逐个元素进行运算。
Python 特殊函数解析(lambda 函数,map 函数,filter 函数,reduce 函数)的更多相关文章
- 辅助函数和高阶函数 map、filter、reduce
辅助函数和高阶函数 map.filter.reduce: 一.辅助函数:(1-1)响应式函数 (数组更新检测): push() pop() shift() unshift() ...
- python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...
- Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数
python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作: 一:使用内置open()函数操作文件,基本语法如下: with ...
- Python 函数之lambda、map、filter和reduce
1.lambda函数 lambda()是Python里的匿名函数,其语法如下: lambda [arg1[, arg2, ... argN]]: expression 学习条件运算时,对于简单的 if ...
- Python的map、filter、reduce函数 [转]
1. map函数func作用于给定序列的每个元素,并用一个列表来提供返回值. map函数python实现代码: def map(func,seq): mapped_seq = [] fo ...
- lambda 、 map 、filter 、reduce 及 reversed 常用函数
lambda 匿名函数 什么是lambda? lambda 操作符(或 lambda 函数)通常用来创建小巧的,一次性的匿名函数对象.它的基本语法如下: lambda arguments : expr ...
- python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r
一.作用域 作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 二.匿名函数 lambda:正常和其他函数进行配合使用.正常无需把匿名函数赋值给一个变量. f=lambda x:x*x p ...
- python中的map、filter、reduce函数
三个函数比较类似,都是应用于序列的内置函数.常见的序列包括list.tuple.str. 1.map函数 map函数会根据提供的函数对指定序列做映射. map函数的定义: map(function ...
- Python 高阶函数map(),filter(),reduce()
map()函数,接收两个参数,一个是函数,一个是序列,map()把传入的函数依次作用于序列的每个元素,并把结果作为新的序列返回: aa = [1, 2, 3, 4, 5] print("ma ...
- Map、Filter和Reduce函数(Python)
Map map(function_to_apply, list_of_inputs) 设有以下代码: >>> items = [1, 2, 3, 4, 5] >>> ...
随机推荐
- 【Java每日一题】20170117
20170116问题解析请点击今日问题下方的“[Java每日一题]20170117”查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; import jav ...
- (9)Microsoft office Word 2013版本操作入门_文本框_word排版
1.插入文本框 :[插入]---[文本框]可以自己画,也可以选择已有的模板 2.文本框设置 :点中文本框选择[格式]---[对齐文本]可以让文字上下居中,[形状填充]填充不同的颜色.[形状轮廓]可以改 ...
- 搭建基于nginx-rtmp-module的流媒体服务器
1.业务流程图 2.软件下载 2.1 windows下载obs 2.2 linux 安装nginx(附加rtmp模块) 1.cd /usr/local 2.mkdir nginx 3.cd nginx ...
- C# Dev XtraReport 简单测试
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DevExpre ...
- Javascript 对象 - 字符串对象
字符串对象 字符串对象是JavaScript中比较常见的一种基本数据类型,他封装了一个字符串,并且提供了相应的方法.例如连接字符串.取字符串.分割字符串等.JavaScript中字符串是不可变的,原始 ...
- Python_json数据检索与定位之jsonPath类库
json数据检索与定位之jsonPath类库 by:授客 QQ:1033553122 实践环境 win7 64 Python 3.4.0 jsonpath_ng-1.4.3-py2.py3-non ...
- html之CSS样式学习笔记
本文内容: 字体样式 文本样式 背景样式 尺寸样式 盒子模型 边框样式 边距样式 浮动布局 定位布局 [CSS3]伸缩布局 标签显示方式 列表样式 [CSS3]过渡样式 [CSS3]变换样式之2D变形 ...
- MySQL 基本语句(2)
1.创建数据库 :create database 名称 [charset 字符集 collate 校对规则] ; 如: drop database if exists `mydb` ; # 若存在就 ...
- linux卸载openjdk
本来不想写的网上的东西罗嗦死了 sudo apt-get purge openjdk*
- c/c++ 多维数组和指针
c/c++ 多维数组和指针 知识点 1,初始化多维数组,对应代码里的test1 2,遍历多维数组,除了最内层循环外,其他所有层都必须是引用类型,对应代码里的test2 3,指针和多维数组 ,对应代码里 ...