Python 历史遗孤lambda函数和他的四个小伙伴map()、reduce()、filter()、sorted()

⭐ 简介:大家好,我是zy阿二,我是一名对知识充满渴望的自由职业者。
☘️ 最近我沉溺于Python的学习中。你所看到的是我的学习笔记。
❤️ 如果对你有帮助,请关注、点赞,让我们共同进步。有不足之处请留言指正!

🌵lamdba和四小伙伴的主要用法:

test_l = [1, 8, 5, 6, 3]

a = list(map(lambda i: i + 1, test_l))
# a = {list} [2, 9, 6, 7, 4]
# 对列名中的每个value +1 

a = list(filter(lambda i: i < 5, test_l))
# a ={list} [1, 3]
# 过滤,返回小于5的值


a = sorted(test_l, key=lambda item: item, reverse=True)
# a = {list} [8, 6, 5, 3, 1]
# 降序排序, 默认 reverse=False 升序


from functools import reduce
a = reduce(lambda i, j: i + j, test_l, 5)
# a = {int} 28
# 逐一累加,1+8+5+6+3=23,默认值/初始值= 5 所以最终a = 28

🌵话题的起源?

Python 之父吉多·范罗苏姆(Guido van Rossum)早在2005年就想要移除 lambda。要了解为什么Guido要删除lambda,就得谈及Python设计的初衷:人生苦短。我的理解:让程序员专注在实现功能上,而不是选择工具上。 为什么要出现作用完全相同但是使用方法完全不同的工具?

🌵前世

图片文章来源:https://www.artima.com/weblogs/viewpost.jsp?thread=98196

在这里插入图片描述

lambda是大约12年前由其他开发者贡献进来的, 包括reduce()filter()map(),但是Guido始终觉得这些方法应当在python3中会被移除。可是在后来 Guido 更新写到 lambda、filter和map将保留(后两个只做了小改动,返回迭代器而不是列表)。只有reduce才会从3.0标准库中移动到functools库中。

🌵今生

在这里插入图片描述
其实删除filter() 和 map() 是没有争议的,例如开头提及的这2个用法,我们完全可以用非常的优雅,很Pythonic列表推导式来解决。而且这样跟容易阅读

list(map(lambda i: i + 1, test_l)) == [i + 1 for i in test_l]

list(filter(lambda i: i < 5, test_l)) == [i for i in test_l if i < 5]

sorted(test_l, key=lambda item: item) 排序实现的方法则更加的简单test_l.sort()
同样reduce(lambda i, j: i + j, test_l, 5) 累加只需要sum(test_l,5)


在这里插入图片描述
lambda要源于Lisp、Scheme,而现在大部分人根本不知道这2个语言。更多的选择只会让程序员在学习中和写代码时做出更多的考虑,方法应该只有一个,让程序员专注在构建编程逻辑上,而不是应该选择使用哪一个方法。而且一旦这些用法删除,那么就不需要在很多地方写非常短的本地函数


在这里插入图片描述
像 reduce(),Guido表示除了 + 和 * 的少数用法,其它时候他自己都需要画图解才能搞清楚他的逻辑,其实我们已经有了sum(),并且他更乐意用product() 替代reduce() ,这样2个方法已经可以处理最常用的两种情况了。
内容延展:对列表获取多个无穷循环器的笛卡尔积 product()

from itertools import product

a = ['a', 'b', 'c']
b = [1, 2, 3]
for i, j in product(a, b):  # 对列表获取多个无穷循环器的笛卡尔积
    print(i, j)
结果:
a 1
a 2
a 3
b 1
b 2
b 3
c 1
c 2
c 3

它跟嵌套的 for 循环等价.即:product(A, B)((x,y) for x in A for y in B)一样.
所以其实最终还是可以用Pythonic的列表推导式来解决问题。


在这里插入图片描述
并且Guido引入了any() 和 all() 2个方法,这样可以有更好的应对更多的情况。

 def any(S):
        for x in S:
            if x:
               return True
        return False

def all(S):
    for x in S:
        if not x:
           return False
    return True

已久是结合非常Pythonic的列表推导式结合使用,您可以编写如下代码:

any(x > 42 for x in S)     # 如果S中任意一个值大于42 则返回true
all(x != 0 for x in S)     # 如果S中所有值都不等于0  则返回true

真的!! 非常的优雅! 看到这里。基本已经结束了。

🌵未来

总而言之,Guido 的所有决定都体现了他对 Python 设计美学。同时对于 lambda 最终还是被保留了下来,这也是对社区声音的权衡。至此,我觉得自己对于 Python 的理解变得更为通透了,大佬之所以爱用匿名函数,是因为大(ma)佬(ling)。看来推导式才是python的重点啊,好学的我赶紧去练习推导式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值