多个表达式的 Python lambda

2021-12-01 07:44:55 +08:00
 AndyAO

默认情况下只能有单个表达式,这是由于 Python 的语法所限制,如果想要多个,那么就只能用复杂的 def 。

其实还可以使用复合函数,比直接嵌套可读性稍好点。

def compound(f, g):
    return lambda x: g(f(x))
c = compound(lambda x: x + 1, lambda x: x * 2)

assert c(3) == 8

1996 次点击
所在节点    程序员
17 条回复
aijam
2021-12-01 08:12:04 +08:00
AndyAO
2021-12-01 09:06:33 +08:00
@aijam #1 看到作者对这个库是不负责任的,只是个演示品。有没有类似的但是比较严肃的项目?
SmiteChow
2021-12-01 09:40:41 +08:00
取个名字很困难?
AndyAO
2021-12-01 10:00:30 +08:00
@SmiteChow #3 取个名字不困难?匿名函数都是屎?
Accessing
2021-12-01 10:03:25 +08:00
@SmiteChow 取个好名字挺难 不用脑子很容易 [Doge]
hsfzxjy
2021-12-01 10:58:06 +08:00
hrlu2014
2021-12-01 13:16:16 +08:00
PEP8:
Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier
AndyAO
2021-12-01 14:09:48 +08:00
@hsfzxjy #6 好的👌看起来很不错,不过有点复杂,真正大量使用的话,也许值得学习。

其实还没真正用到,只是很好奇,从 pytest 设计来看,py 在可执行对象字面量方面很差劲,这次再遇到就多学了些。
adoal
2021-12-01 16:04:55 +08:00
龟叔说了 Python 不提倡 lambda ,之所以长期留着只是因为以前有 ^o^

不过 Python 的单行 lambda 虽然弱但还是能写出 Y-Combinator 来的。
AndyAO
2021-12-01 17:06:14 +08:00
@adoal #9 为什么他这么设计?有什么特别的用意吗?
他有没有在什么地方详细的谈过这些事情?
感到很好奇,因为 lambda 真的还挺有用的,在很多场景下写代码的效率能提高很多,而且可读性还有提升。
krixaar
2021-12-01 17:28:37 +08:00
@AndyAO #10 https://www.artima.com/weblogs/viewpost.jsp?thread=98196
大概是 lambda 写复杂了可读性太差,写简单的场景不多
c0xt30a
2021-12-01 21:18:57 +08:00
@adoal 不只是 Python ,缩进敏感的语言都不方便写 Lambda
adoal
2021-12-01 22:36:41 +08:00
@c0xt30a 缩进只是表象,Python 写 lambda 的主要问题不是书写不方便而是表达能力的限制。同样是缩进系语言,这跟 Haskell 和 ML 系的就是天壤之别了。
adoal
2021-12-01 22:38:50 +08:00
@AndyAO Python 又不是以函数式范式为主的语言。Lambda 早期出现在 Python 里只是一种尝试而已。
AndyAO
2021-12-02 04:45:45 +08:00
当搞意识形态而不谈实用的时候,说明已经无话可说,python 在这方面的设计是很糟糕的,算是设计败笔。
AndyAO
2021-12-02 04:52:28 +08:00
缩进敏感也是败笔,也许在 199x 年的时候,这种设计能够省事点,但是在此之后就没有任何主流语言,用这种奇葩设计。没有后继者最能说明问题,对 lambda 等可执行对象字面量机制的支持缺失和缩进敏感都是这样。
msg7086
2021-12-02 06:30:21 +08:00
你是想拿着 Ruby 的代码风格去写 Python ?
我觉得你写一个 Explicit 风格的语言就好好地 Explicit 写,不要去玩花样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819178

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX