对python过滤器和lambda函数的用法详解
作者:HP的博客 发布时间:2022-04-23 06:37:47
1. 过滤器
Python 具有通过列表解析 将列表映射到其它列表的强大能力。这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。
过滤列表语法: [ mapping-expression for element in source-list if filter-expression ]
这是列表解析的扩展,前三部分都是相同的,最后一部分,以 if开头的是过滤器表达式。过滤器表达式可以是返回值为真或者假的任何表达式 (在 Python 中是几乎任何东西)。任何经过滤器表达式演算值为真的元素都可以包含在映射中,其它的元素都将忽略,它们不会进入映射表达式,更不会包含在输出列表中。
列表过滤介绍
>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> [elem for elem in li if len(elem) > 1]
['mpilgrim', 'foo']
// 由于 Python 会遍历整个列表,它将对每个元素执行过滤器表达式,如果过滤器表达式演算值为真,该元素就会被映射,同时映射表达式的结果将包含在返回的列表中,这里过滤掉了所有单字符的字符串,留下了一个由长字符串构成的列表。
>>> [elem for elem in li if elem != "b"]
['a', 'mpilgrim', 'foo', 'c', 'd', 'd']
// 这里过滤掉了一个特定值 b ,注意这个过滤器会过滤掉所有的 b, 因为每次取出 b, 过滤表达式都将为假。
>>> [elem for elem in li if li.count(elem) == 1]
['a', 'mpilgrim', 'foo', 'c']
// count 是一个列表方法,返回某个值在列表中出现的次数,你可以认为这个过滤器将从列表中删除重复元素,返回一个只包含了在原始列表中有着唯一值拷贝的列表。但并非如此,因为在原始列表中出现两次的值 (在本例中, b 和 d ) 被完全剔除了,从一个列表中排除重复值有多种方法,但过滤并不是其中的一种。
filter 内置函数
Python2.7.13官方文档中的介绍: filter(function, iterable) Construct a list from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If iterable is a string or a tuple, the result also has that type; otherwise it is always a list. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed.
Note that filter(function, iterable) is equivalent to [item for item in iterable if function(item)] if function is not None and [item for item in iterable if item] if function is None.
See itertools.ifilter() and itertools.ifilterfalse() for iterator versions of this function, including a variation that filters for elements where the function returns false.
Python内建的filter()函数用于过滤序列
// 保留长度大于1的字符串
>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
>>> def func(s):
... return len(s) > 1
>>> filter(func,li)
['mpilgrim', 'foo']
// 删除奇数
>>> def del_odd(n):
... return n % 2 == 0
>>> filter(del_odd,[0,1,2,3,4,5,6,7,8,9])
[0, 2, 4, 6, 8]
2. lambda函数
Python 支持一种有趣的语法, 它允许你快速定义单行的最小函数, 这些叫做
lambda 的函数, 是从 Lisp 借用来的, 可以用在任何需要函数的地方。
>>> def f(x):
... return x*2
>>> f(3)
6
>>> g = lambda x : x*2
>>> g(3)
6
// 这是一个 lambda 函数,完成同上面普通函数相同的事情。注意这里的简短的语法:在参数列表周围没有括号,而且忽略了 return 关键字 (隐含存在,因为整个函数只有一行)。而且,该函数没有函数名称,但是可以将它赋值给一个变量进行调用。
>>> (lambda x : x*2)(3)
6
// 使用 lambda 函数时甚至不需要将它赋值给一个变量。
总的来说, lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。 lambda 函数不能包含命令, 包含的表达式不能超过一个, 不要试图向 lambda 函数中塞入太多的东西, 如果你需要更复杂的东西, 应该定义一个普通函数, 然后想让它多长就多长。
Note: lambda函数 是可选的, 它是一种风格问题,不一定非要使用它们,任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换,应将它们用在需要封装特殊的、非重用代码上,避免代码充斥着大量单行函数。
来源:https://blog.csdn.net/Oscer2016/article/details/54583780


猜你喜欢
- Tensorflow数据读取有三种方式:Preloaded data: 预加载数据Feeding: Python产生数据,再把数据喂给后端。
- 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。以下文章来源于Pyth
- remove 删除单个元素,删除首个符合条件的元素,按值删除,返回值为空List_remove = [1, 2, 2, 2, 3, 4]pr
- 目录一、慢在哪?二、是否查询了不需要的数据1. 查询不需要的记录2. 多表关联时返回全部列3. 总是查询出全部列4. 重复查询相同的数据三、
- 如下所示:# -*- coding: utf-8 -*-import sysfrom PySide.QtGui import *from P
- Restful风格的WebService正在渐渐取代传统的SOAP, Java 也有很多Restful的框架,很方便简洁,Jersey,re
- 前言python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来帮助一些想要学习pyth
- CBV添加装饰器给CBV添加装饰器有三种方法,三种方法都需要导入模块:from django.utils.decorators import
- 一、浮点数是什么?浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。浮点数在计算机中主要用来表示小数,浮点
- 1、去空格及特殊符号s.strip().lstrip().rstrip(',')2、复制字符串#strcpy(sStr1,s
- 本文实例讲述了PHP实现的AES加密、解密封装类与用法。分享给大家供大家参考,具体如下:<?php/** * Class AES *
- 使用BootstrapValidator进行注册校验和登录错误提示,具体内容如下1、介绍在AdminEAP框架中,使用了BootstrapV
- 目录用Python实现定时任务用Python实现定时任务的四种方法利用while True: + sleep()实现定时任务利用thread
- 一、提要python的@property是python的一种装饰器,是用来修饰方法的。python @property 装饰器使一个方法可以
- 前言最近由于在寻找方向上迷失自我,准备了解更多的计算机视觉任务重的模型。看到语义分割任务重Unet一个有意思的模型,我准备来复现一下它。一、
- 0.前言回调函数是一种在编程中常见的技术,通常在异步编程中使用。简单来说,回调函数是一个被传递给另一个函数的函数,它在该函数的某个时间点被调
- 译者:AlphaImageLoader是一个让IE6正常显示PNG32时要用到的一个滤镜,但它在使用中也会产生一系列的问题,本文对使用Alp
- 今年五一放了四天假,很多人不再只是选择周边游,因为时间充裕,选择了稍微远一点的景区,甚至出国游。各个景点成了人山人海,拥挤的人群,甚至去卫生
- 按下键的时候,焦点要落在窗口上,不能落在cmd窗口上。另外,一般在imshow()后要使用waitKey(),给图像绘制留下时间,不然窗口会
- 前言在我们使用线程池控制线程运行时,或者是写爬虫时不停发送request获取地址,都需要我们对运行的线程加以控制。有这样一种场景,当你写入一