Python知识点:lambda, map, filter
通过示例介绍Python中的lambda,map,filter 函数的使用方法。
lambda
lambda 操作符(或 lambda函数)通常用来创建小巧的,一次性的匿名函数对象。它的基本语法如下:
lambda arguments : expression
lambda操作符可以有任意数量的参数,但是它只能有一个表达式,且不能包含任何语句,返回一个可以赋值给任何变量的函数对象。
下面通过一个例子来理解一下。首先看看一个Python函数:
def add(x, y): return x+y # call the function add(1, 2) # Output: 3
上述函数名为add, 它需要两个参数x和y,并返回它们的和。
接下来,我们把上面的函数变成一个lambda函数:
add = lambda x, y : x + y print(add(1,2)) # Output: 3
在lambda x, y : x + y中,x和y是函数的参数,x+y是表达式,它被执行并返回结果。
lambda x, y : x + y返回的是一个函数对象,它可以被赋值给任何变量。在本例中函数对象被赋值给了add变量。如果我们查看add的type,可以看到它是一个function
type(add) # Output: function
绝大多数lambda函数作为一个参数传给一个需要函数对象为参数的函数,比如map,reduce,filter等函数。
**map
map的基本语法如下:**
map(function_object, iterable1, iterable2, ...)
map函数需要一个函数对象和任意数量的iterables,如list,dictionary等。它为序列中的每个元素执行function_object,并返回由函数对象修改的元素组成的列表。
示例如下:
def add2(x): return x+2 map(add2, [1,2,3,4]) # Output: [3,4,5,6]
在上面的例子中,map对list中的每个元素1,2,3,4执行add2函数并返回[3,4,5,6]
接着看看如何用map和lambda重写上面的代码:
map(lambda x: x+2, [1,2,3,4]) #Output: [3,4,5,6]
仅仅一行即可搞定!
使用map和lambda迭代dictionary:
dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}] map(lambda x : x['name'], dict_a) # Output: ['python', 'java'] map(lambda x : x['points']*10, dict_a) # Output: [100, 80] map(lambda x : x['name'] == "python", dict_a) # Output: [True, False]
以上代码中,dict_a中的每个dict作为参数传递给lambda函数。lambda函数表达式作用于每个dict的结果作为输出。
map函数作用于多个iterables
list_a = [1, 2, 3] list_b = [10, 20, 30] map(lambda x, y: x + y, list_a, list_b) # Output: [11, 22, 33]
这里,list_a和list_b的第i个元素作为参数传递给lambda函数。
在Python3中,map函数返回一个惰性计算(lazily evaluated)的迭代器(iterator)或map对象。就像zip函数是惰性计算那样。
我们不能通过index访问map对象的元素,也不能使用len()得到它的长度。
但我们可以强制转换map对象为list:
map_output = map(lambda x: x*2, [1, 2, 3, 4]) print(map_output) # Output: map object: list_map_output = list(map_output) print(list_map_output) # Output: [2, 4, 6, 8]
filter
filter的基本语法如下:
filter(function_object, iterable)
filter函数需要两个参数,function_object返回一个布尔值(boolean),对iterable的每一个元素调用function_object,filter只返回满足function_object为True的元素。
和map函数一样,filter函数也返回一个list,但与map函数不同的是,filter函数只能有一个iterable作为输入。
示例:
返回偶数:
a = [1, 2, 3, 4, 5, 6] filter(lambda x : x % 2 == 0, a) # Output: [2, 4, 6]
过滤dicts的list:
dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}] filter(lambda x : x['name'] == 'python', dict_a) # Output: [{'name': 'python', 'points': 10}]
和map一样,filter函数在Python3中返回一个惰性计算的filter对象或迭代器。我们不能通过index访问filter对象的元素,也不能使用len()得到它的长度。
list_a = [1, 2, 3, 4, 5] filter_obj = filter(lambda x: x % 2 == 0, list_a) # filter object even_num = list(filter_obj) # Converts the filer obj to a list print(even_num) # Output: [2, 4]
有关Python技术文章优先发布在我的个人博客:猿人学
公众号:猿人学Pyhton

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
WEB 实时推送技术的总结
前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控、Web 在线通讯、即时报价系统、在线游戏等,都需要将后台发生的变化主动地、实时地传送到浏览器端,而不需要用户手动地刷新页面。本文对过去和现在流行的 Web 实时推送技术进行了比较与总结。 本文完整的源代码请猛戳Github博客,纸上得来终觉浅,建议大家动手敲敲代码。 一、双向通信 HTTP 协议有一个缺陷:通信只能由客户端发起。举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。在WebSocket协议之前,有三种实现双向通信的方式:轮询(polling)、长轮询(long-polling)和iframe流(streaming)。 1.轮询(polling) 轮询是客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。其缺点也很明显:连接数会很多,一个接受,一个发送。而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CP...
- 下一篇
从目录中查找最大和最小的文件(不包括子目录)
从目录中查找最大和最小的文件(不包括子目录),学会使用File类的一些基本方法的调用。代码如下: package file; import java.io.File; public class FindMinAndMaxFile { public static void main(String[] args) { File windows = new File("c:/windows"); File[] fs = windows.listFiles(); int min = -1; int max = -1; int j = min + 1; while (j < fs.length) { if (fs[j].isFile() && fs[j].length() > 0 && min < 0) { min = max = j; j++; continue; } if (fs[j].isFile() && (fs[j].length() != 0)) { if (fs[j].length() < fs[min].le...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19