Python 中的匿名函数,你滥用了吗?

概念

咱们从一个例子引入。java

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

很容易获得以下代码函数

Python 中的匿名函数,你滥用了吗?

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

Python 中的匿名函数,你滥用了吗?

使用很简单,有以下几个关键点视频

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

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

使用误区

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

1 .给匿名函数命名

PEP 8 中建议咱们不要写相似下面的代码排序

Python 中的匿名函数,你滥用了吗?

匿名函数能够直接当作变量同样传递,好比传给函数做为参数,并不要求它必定有个名字。element

须要注意的是,其实上面的操做并无真正起到给函数命名的做用。开发

若是须要给定义的函数命名,使用 def 关键字便可

Python 中的匿名函数,你滥用了吗?

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

Python 中的匿名函数,你滥用了吗?

2. 没有必要的匿名函数

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

通常有两种状况。一是使用无心义的调用,好比下面的代码

Python 中的匿名函数,你滥用了吗?

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

其实,咱们能够直接这样

Python 中的匿名函数,你滥用了吗?

上面的一提出来你们立刻就理解了,可是平时咱们却或多或少的犯了相似的毛病。

另外一方面,有不少函数,标准库中都已经实现了,咱们不知道,因此作了多余的事情。

好比这里

Python 中的匿名函数,你滥用了吗?

这里的匿名函数能够直接用 mul 函数替换

Python 中的匿名函数,你滥用了吗?

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

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

Python 中的匿名函数,你滥用了吗?

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

Python 中的匿名函数,你滥用了吗?

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

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

Python 中的匿名函数,你滥用了吗?

上面的代码可以实现功能,可是我以为下面的可读性更强一些

Python 中的匿名函数,你滥用了吗?

咱们经过函数函数名就大概知道了函数的做用,若是是匿名函数的话,咱们还得去看相应的逻辑。

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

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

Python 中的匿名函数,你滥用了吗?

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

Python 中的匿名函数,你滥用了吗?

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

5. 能够不使用 map/filter

Python 中的 map 和 filter 通常都结合匿名函数在使用,前者是在迭代过程当中对元素作一些处理,后者是过滤掉一些元素。不少状况下,咱们可使用列表推导式或者生成器表达式代替它们。

用生成器表达式代替 map

Python 中的匿名函数,你滥用了吗?

用生成器表达式代替 filter

Python 中的匿名函数,你滥用了吗?

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

何时使用匿名函数

说了这么多匿名函数使用的误区,那么何时使用比较合理呢?我以为知足下面的几个点,就能够考虑考虑了。

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

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


 

Python 中的匿名函数,你滥用了吗?

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

相关文章
相关标签/搜索