专栏首页后场技术Python下小米加步枪lambda和相关函数使用

Python下小米加步枪lambda和相关函数使用

什么是lambda

lambda定义匿名函数,并不会带来程序运行效率的提高,只会使代码更简洁, 为了减少单行函数的定义而存在的。

lambda的使用大量简化了代码,使代码简练清晰。但是值得注意的是,这会在一定程度上降低代码的可读性。如果是初学Python的人也许会对此比较难理解。

如果可以使用for...in...if来完成的,坚决不要用lambda,因为如果你的代码包含循环,如果有,宁愿定义函数来完成,使代码获得可重用性和更好的可读性。

如果你就是喜欢用lambda来做,那也无可厚非,但是有内置函数减弱了代码的可读性!

好了介绍完成了lambda,那就让我们来实际用一下,实例如下:

与其他函数的结合

下面我们再来看看小米加上步枪的结合使用。

1. reduce + lambda

什么是reduce:

Python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(列表,元组等)中的所有数据进行如下操作:

传给reduce中的函数func() (必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。

关于Python reduce的详细解析,后续详细介绍,下面我们介绍一下reduce + lambda的应用案例:

#!/usr/local/bin/python3
# Author: nock
"""
首先在Python3版本中,直接使用reduce()的话,系统会报错,提示不存在reduce()函数, 在Python3里,reduce()函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里, Python2可以直接import
"""

from functools import reduce

num_list = [1, 2, 3, 4, 5]
result = reduce(lambda x,y: x+y, num_list)
print(result)

这种方式用lambda表示来当做参数,因为没有提供reduce的第三个参数,所以第一次执行时x=1, y=2, 第二次x=1+2, y=3 即列表的第三个元素。

等同于:

#!/usr/local/bin/python3
# Author: nock
from functools import reduce

num_list = [1, 2, 3, 4, 5]
result = reduce(lambda x,y: x+y, num_list, 0)
print(result)

# result等于 15

这种方式没用lambda当做参数,因为指定了reduce的第三个参数为0,所以的第一次执行时x=1, y=2, 第二次则x=1+2, y=3, 即列表的第三个元素。 假设指定reduce的第三个参数为100,那么第一次执行x=100y依然是遍历列表中的元素,最后结果就是115。

执行过程视图:

2. map + lambda

什么是map:

map函数应用于每一个可迭代的项,返回的结果是一个list。如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理。map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

语法: map(func, seq1[, seq2...] )

Python函数式编程中的map()函数是将func作用于seq中的每一个元素,并用一个列表给出返回值。如果func为None,作用同zip()。

#!/usr/local/bin/python3
# Author: nock

num_list = [1, 2, 3]
new_list = list(map(lambda i: i + 1, num_list))
print(new_list)

# result: [2, 3, 4]

如上,使用map函数将会对列表中的所有元素操作; map中有2个参数(函数, 列表), 它会在内部遍历列表中的每一个元素,执行传递过来的函数参数,然后输出到新的列表中。

执行过程视图:

map同时也可以实现多个列表相加:

#!/usr/local/bin/python3
# Author: nock

list_one = [1, 2, 3]
list_two = [4, 5, 6]
new_list = list(map(lambda x,y: x + y, list_one, list_two))
print(new_list)

# result: [5, 7, 9]

说明:

这里需要注意的是: 使用Python3的时候,map函数有一个变化那就是,如果不在map前加上list,lambda函数根本就不会执行。

Python2中,map会直接返回结果:

而在Python3下面,返回的就是一个map对象:

<map object at 0x7f381112ad50>

所以,Python3环境下,如果要得到结果,必须用list作用于这个map对象。

3. filter + map

什么是filter

filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤。最终一次性返回过滤后的结果。

map()类似,filter()也接收一个函数和一个序列, 和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

语法: filter(function or None, sequence), 简单示例如下:

#!/usr/local/bin/python3
# Author: nock

num_list = [100, 20, 24, 50, 110]
new_list = list(filter(lambda x: x < 50, num_list))
print(new_list)

# result: [20, 24]

filter 跟map一样,在Python3的环境下,必须加list转换类型,默认返回的是一个对象。

执行过程视图:

到这里Python小米加步枪几个函数结合使用简单介绍到这里就结束了,有什么不对的地方,可以留言交流并指正。

本文分享自微信公众号 - 后场技术(opstalk),作者:诺克大叔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python版本的选择和项目目录规范

    Python同时支持多个版本,这已不是什么秘密。解释器的每个次要版本都获得18个月的错误修复支持和5年的安全支持。例如,2018年6月27日发布的Python ...

    后场技术
  • ent orm笔记4---Code Generation

    在前面几篇文章中,我们经常使用的可能就是entc这个命令了,entc这个工具给带来了很多功能,这篇文章主要整理关于ent orm 中Code Generatio...

    后场技术
  • JVM加载TimeZone读取文件优先级实战分析

    前几天线上新上线一个Kafka Java Consumer程序,出现一个异常的问题,那就通过查看日志,数据写入到了Elasticsearch索引里面,但是前端查...

    后场技术
  • Python高阶函数

    在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在 python 中一切皆对象,函数也不例外。比如求绝对值函数 abs,我们可以用一个变量 f 指向 a...

    Python编程与实战
  • Python的lambda表达式

    介绍几个 序列处理的函数,比如序列过滤、把所有元素都拿过来做某些操作,这种的序列处理函数。

    py3study
  • Python入门高阶教程-高阶函数

    前面写的 Python 入门教程中只有基础入门和基础进阶两部分,可以在公众号下拉菜单中找到,小一我都已经分好类了。

    小一不二三
  • 按部就班的吴恩达机器学习网课用于讨论(11)

    知道了核函数的表示形式(使用例如高斯核函数作为工具,计算样本x和地标l之间的距离作为特征f,其中f为核函数),之后就是讨论核函数地标的选择。

    嘘、小点声
  • Python面试题之Python中的lambda map filter reduce zip

    map()将函数func应用于序列seq中的所有元素。在Python3之前,map()返回一个列表,列表中的每个元素都是将列表或元组“seq”中的相应元素传入函...

    Jetpropelledsnake21
  • 内置函数 -- filter 和 map

    参考地址:http://www.cnblogs.com/sesshoumaru/p/6000788.html

    用户7798898
  • Python进阶|谈谈几个常用的内置函数

    但是我们有没有想过,如果我们需要一个函数,比较简短,而且只需要使用一次(无需重复调用),那还需要定义一个有名字的函数么?

    罗罗攀

扫码关注云+社区

领取腾讯云代金券