默认情况下只能有单个表达式,这是由于 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
用 syntax_sugar 的确更方便,因为比较成熟,而且支持多参数
from syntax_sugar import compose
f = lambda x: x * 2
g = lambda x: x * 3
h = lambda x: x + 1
fn = compose(f, g, h)
def test_fn():
n = 2
assert fn(n) == (n + 1) * 3 * 2
相当于 f ∘ g ∘ h
1
aijam 2021-12-01 08:12:04 +08:00
|
3
SmiteChow 2021-12-01 09:40:41 +08:00
取个名字很困难?
|
6
hsfzxjy 2021-12-01 10:58:06 +08:00 via Android
|
7
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 |
8
AndyAO OP @hsfzxjy #6 好的👌看起来很不错,不过有点复杂,真正大量使用的话,也许值得学习。
其实还没真正用到,只是很好奇,从 pytest 设计来看,py 在可执行对象字面量方面很差劲,这次再遇到就多学了些。 |
9
adoal 2021-12-01 16:04:55 +08:00
龟叔说了 Python 不提倡 lambda ,之所以长期留着只是因为以前有 ^o^
不过 Python 的单行 lambda 虽然弱但还是能写出 Y-Combinator 来的。 |
10
AndyAO OP @adoal #9 为什么他这么设计?有什么特别的用意吗?
他有没有在什么地方详细的谈过这些事情? 感到很好奇,因为 lambda 真的还挺有用的,在很多场景下写代码的效率能提高很多,而且可读性还有提升。 |
11
krixaar 2021-12-01 17:28:37 +08:00
|
13
adoal 2021-12-01 22:36:41 +08:00
@c0xt30a 缩进只是表象,Python 写 lambda 的主要问题不是书写不方便而是表达能力的限制。同样是缩进系语言,这跟 Haskell 和 ML 系的就是天壤之别了。
|
15
AndyAO OP 当搞意识形态而不谈实用的时候,说明已经无话可说,python 在这方面的设计是很糟糕的,算是设计败笔。
|
16
AndyAO OP 缩进敏感也是败笔,也许在 199x 年的时候,这种设计能够省事点,但是在此之后就没有任何主流语言,用这种奇葩设计。没有后继者最能说明问题,对 lambda 等可执行对象字面量机制的支持缺失和缩进敏感都是这样。
|
17
msg7086 2021-12-02 06:30:21 +08:00
你是想拿着 Ruby 的代码风格去写 Python ?
我觉得你写一个 Explicit 风格的语言就好好地 Explicit 写,不要去玩花样。 |