概念

我们从一个例子引入。

这里有一个元素为非空字符串的列表,按字符串最后一个字母将列表进行排序。如果原列表是 ['abc', 'g', 'def'],则结果应该是 ['abc', 'def', 'g']。

很容易得到如下代码

我们发现, get_last_element 这个方法比较简单,并且只用了一次,但必须定义后得到一个名称才能使用。在上面的情境中,使用起来稍微麻烦了点,我们能不能直接定义了就用呢?当然可以。

使用很简单,有如下几个关键点

使用 lambda 关键字
自动 return,不需要你自己写
只有一行代码

知道了上面的内容,匿名函数的概念也大致清晰了。

使用误区

知道了匿名函数后,我们在开发的时候有时候不经意就把这个东西滥用了。

1 .给匿名函数命名

PEP 8 中建议我们不要写类似下面的代码

匿名函数可以直接当做变量一样传递,比如传给函数作为参数,并不要求它一定有个名字。

需要注意的是,其实上面的操作并没有真正起到给函数命名的作用。

如果需要给定义的函数命名,使用 def 关键字即可

通过 def 定义的函数才是真正有名称的,匿名函数的名称永远是 lambda

2. 没有必要的匿名函数

某些时候,我们没有使用匿名函数的必要,但却无意中使用了。

一般有两种情况。一是使用无意义的调用,比如下面的代码

将列表按元素的长度进行排序。

其实,我们可以直接这样

上面的一提出来大家马上就理解了,但是平时我们却或多或少的犯了类似的毛病。

另一方面,有很多函数,标准库中都已经实现了,我们不知道,所以做了多余的事情。

比如这里

这里的匿名函数可以直接用 mul 函数替换

Python 的 operator 模块提供了很多常用的操作,熟悉了后,你会慢慢喜欢上它的。里面除了算术、比较等操作,关于对字典、对象的操作也值得一提。

itemgetter 函数,根据键获取字典的值

attrgetter 函数,根据属性获取对应值

3. 降低可读性的匿名函数

按元素的长度和字典序对列表进行排序

上面的代码能够实现功能,但是我觉得下面的可读性更强一些

我们通过函数函数名就大概知道了函数的作用,如果是匿名函数的话,我们还得去看相应的逻辑。

4. 可能根本不需要传递函数

对一个列表进行求和,我们可能会看到这样的代码

其实,直接使用 sum 函数就行了

对于一些特定的需求,很多时候 Python 可能已经有了现成的方案。我们要有这方面的意识,尽可能简单的去解决问题。

5. 可以不使用 map/filter

Python 中的 map 和 filter 一般都结合匿名函数在使用,前者是在迭代过程中对元素做一些处理,后者是过滤掉一些元素。很多情况下,我们可以使用列表推导式或者生成器表达式代替它们。

用生成器表达式代替 map

用生成器表达式代替 filter

明显的可以看出,使用生成器表达式的代码可读性更强一些。

什么时候使用匿名函数

说了这么多匿名函数使用的误区,那么什么时候使用比较合理呢?我觉得满足下面的几个点,就可以考虑考虑了。

只用一次
函数逻辑简单
使用匿名函数前尽可能的确定 Python 没有自带类似功能的函数

原文链接:
https://blog.csdn.net/sinat_38682860/article/details/83867671


识别图中二维码,领取python全套视频资料

Python 中的匿名函数,你滥用了吗?的更多相关文章

  1. Python中的匿名函数lambda的用法

    一.lambda函数的简介  对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...

  2. python中的匿名函数

    python 使用 lambda 来创建匿名函数. 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数. lambda 只是一个表达式,函数体比 def 简单很多. lambda的主体是一 ...

  3. python 中的匿名函数lamda和functools模块

    为什么 要把匿名函数和functools模块写在一起? 因为 lamda函数和functools模块都是对函数一种增强或者是简化. 匿名函数: 为了解决那些功能很简单的需求而设计一次性的需求函数 #& ...

  4. python中lambda匿名函数与函数之间的关系

  5. Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...

  6. Python中关于Lambda函数的使用总结

    lambda表达式是一种匿名函数,对应python中的自定义函数def,是定义某个函数时比较高级的一种写法.作为python初学者,本文整理了lambda的一些基本用法和特点. lambda和def的 ...

  7. Python中的lambda函数介绍

    Lambda函数,即Lambda 表达式(lambda expression),是一个匿名函数(不存在函数名的函数),Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lam ...

  8. jquery'中的匿名函数

        //jquery'中的匿名函数 (function(){ alert("this is a test"); })(); //和这个基于jQuery的比较下: $(funct ...

  9. python --- Python中的callable 函数

    python --- Python中的callable 函数 转自: http://archive.cnblogs.com/a/1798319/ Python中的callable 函数 callabl ...

随机推荐

  1. Unix系统编程()发送信号kill

    与shell的kill命令类似,一个进程能够使用kill系统调用向另一进程发送信号. 之所以选择kill作为术语,因为早期UNIX实现中大多数信号的默认行为是终止进程. #include <si ...

  2. ip: either "dev" is duplicate, or "type" is garbage

    Driver installation Nothing has to be done for the APF51Dev, the APF28Dev and the APF6Dev. For the A ...

  3. [转]使用rosbridge协议实现安卓跟ros的解耦

    安卓与ROS通信的现状 因为ROS官方支持的语言绑定只有C++和Python,所以目前安卓想与ROS通信,必须借助半官方的rosjava包,而Rosjava太重了,因为它跟C++/Python一样,是 ...

  4. BI开发之——Mdx基础语法(2)(转至指尖流淌)

    结合webcast中老师的讲解,现在把基础语法应用通过几个案例应用如下: 一.维度的概念 上图中一个维度(Dimension):Region 改为度下有四个级别(Levels):country.pro ...

  5. [android] AndroidManifest.xml - 【 manifest -> Application -> activity 】

    <activity android:allowTaskReparenting=["true" | "false"] android:alwaysRetai ...

  6. hdu 1233 还是畅通project

    本题链接:点击打开链接 本题大意: 有n个村庄,n*(n-1)/2条路,输入每条路所连接是哪两个村庄及长度,求使全部村庄均连通(并不是都两两连通) 所铺公路的最短路程. 解题思路: 使用并查集基础及K ...

  7. jQuery过滤HTML标签并高亮显示关键字的方法

    本文实例讲述了jQuery过滤HTML标签并高亮显示关键字的方法.分享给大家供大家参考.具体如下: jQuery实现网页关键字过滤效果,将需要过滤的文字定义在JavaScript中,可定义多个,不过要 ...

  8. loadimage1();有问题

    f.Read(pBuffer, nSize)不能少,少了虽然能读进去数据但是不能显示成图片,可能原因是存进的数据并不是图片数据! 输入图片测试,但是没有CFile先Open再Read

  9. openssl之EVP系列之8---EVP_Digest系列函数具体解释

    openssl之EVP系列之8---EVP_Digest系列函数具体解释     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成     (作 ...

  10. iOS开发之--png图片编译时报错 (Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with exit code 1 )

    编译或者运行APP的时候,老是报这个错误:Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with ...