美文网首页Python基础系列初学者
Python 中的匿名函数,你会用吗

Python 中的匿名函数,你会用吗

作者: 我爱学python | 来源:发表于2019-10-04 16:50 被阅读0次

    概念

    我们从一个例子引入。

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

    很容易得到如下代码

    image

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

    image

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

    使用 lambda 关键字自动 return,不需要你自己写只有一行代码 知道了上面的内容,匿名函数的概念也大致清晰了。

    使用误区

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

    1 .给匿名函数命名

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

    image

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

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

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

    image

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

    image

    2. 没有必要的匿名函数

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

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

    image

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

    其实,我们可以直接这样

    image

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

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

    比如这里

    image

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

    image

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

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

    image

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

    image

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

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

    image

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

    image

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

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

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

    image

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

    image

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

    5. 可以不使用 map/filter

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

    用生成器表达式代替 map

    image

    用生成器表达式代替 filter

    image

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

    什么时候使用匿名函数

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

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

    相关文章

      网友评论

        本文标题:Python 中的匿名函数,你会用吗

        本文链接:https://www.haomeiwen.com/subject/ewrspctx.html