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

2020-09-03 17:04:36 浏览数 (1)

什么是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的应用案例:

代码语言:javascript复制
#!/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 即列表的第三个元素。

等同于:

代码语言:javascript复制
#!/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()。

代码语言:javascript复制
#!/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同时也可以实现多个列表相加:

代码语言:javascript复制
#!/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对象:

代码语言:javascript复制
<map object at 0x7f381112ad50>

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

3. filter map

什么是filter

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

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

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

代码语言:javascript复制
#!/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小米加步枪几个函数结合使用简单介绍到这里就结束了,有什么不对的地方,可以留言交流并指正。

0 人点赞