V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AndyAO
V2EX  ›  程序员

多个表达式的 Python lambda

  •  3
     
  •   AndyAO · 2021-12-01 07:44:55 +08:00 · 1972 次点击
    这是一个创建于 1093 天前的主题,其中的信息可能已经有所发展或是发生改变。

    默认情况下只能有单个表达式,这是由于 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
    
    
    第 1 条附言  ·  2021-12-01 10:02:29 +08:00

    用 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

    第 2 条附言  ·  2021-12-01 14:35:54 +08:00
    eval 也只能执行单个表达式,python 好像系统性的限制灵活的代码执行方式
    第 3 条附言  ·  2021-12-01 17:02:53 +08:00
    抽空进行了下实战,发现 syntax_sugar 问题真的还挺大的,感觉这玩意儿基本上不能实用,或许还是 hy 这个解决方案比较好,大概了解了下好像是可以将 lisp 转换为 python 的 AST ,从而直接嵌入 python 中使用。频繁想使用这类语法的时候也许可以直接用 hy 写,然后和 python 交互。有空的时候准备试试看。
    17 条回复    2021-12-02 06:30:21 +08:00
    AndyAO
        2
    AndyAO  
    OP
       2021-12-01 09:06:33 +08:00
    @aijam #1 看到作者对这个库是不负责任的,只是个演示品。有没有类似的但是比较严肃的项目?
    SmiteChow
        3
    SmiteChow  
       2021-12-01 09:40:41 +08:00
    取个名字很困难?
    AndyAO
        4
    AndyAO  
    OP
       2021-12-01 10:00:30 +08:00
    @SmiteChow #3 取个名字不困难?匿名函数都是屎?
    Accessing
        5
    Accessing  
       2021-12-01 10:03:25 +08:00
    @SmiteChow 取个好名字挺难 不用脑子很容易 [Doge]
    hsfzxjy
        6
    hsfzxjy  
       2021-12-01 10:58:06 +08:00 via Android
    hrlu2014
        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
    AndyAO
        8
    AndyAO  
    OP
       2021-12-01 14:09:48 +08:00
    @hsfzxjy #6 好的👌看起来很不错,不过有点复杂,真正大量使用的话,也许值得学习。

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

    不过 Python 的单行 lambda 虽然弱但还是能写出 Y-Combinator 来的。
    AndyAO
        10
    AndyAO  
    OP
       2021-12-01 17:06:14 +08:00
    @adoal #9 为什么他这么设计?有什么特别的用意吗?
    他有没有在什么地方详细的谈过这些事情?
    感到很好奇,因为 lambda 真的还挺有用的,在很多场景下写代码的效率能提高很多,而且可读性还有提升。
    krixaar
        11
    krixaar  
       2021-12-01 17:28:37 +08:00
    @AndyAO #10 https://www.artima.com/weblogs/viewpost.jsp?thread=98196
    大概是 lambda 写复杂了可读性太差,写简单的场景不多
    c0xt30a
        12
    c0xt30a  
       2021-12-01 21:18:57 +08:00
    @adoal 不只是 Python ,缩进敏感的语言都不方便写 Lambda
    adoal
        13
    adoal  
       2021-12-01 22:36:41 +08:00
    @c0xt30a 缩进只是表象,Python 写 lambda 的主要问题不是书写不方便而是表达能力的限制。同样是缩进系语言,这跟 Haskell 和 ML 系的就是天壤之别了。
    adoal
        14
    adoal  
       2021-12-01 22:38:50 +08:00
    @AndyAO Python 又不是以函数式范式为主的语言。Lambda 早期出现在 Python 里只是一种尝试而已。
    AndyAO
        15
    AndyAO  
    OP
       2021-12-02 04:45:45 +08:00
    当搞意识形态而不谈实用的时候,说明已经无话可说,python 在这方面的设计是很糟糕的,算是设计败笔。
    AndyAO
        16
    AndyAO  
    OP
       2021-12-02 04:52:28 +08:00
    缩进敏感也是败笔,也许在 199x 年的时候,这种设计能够省事点,但是在此之后就没有任何主流语言,用这种奇葩设计。没有后继者最能说明问题,对 lambda 等可执行对象字面量机制的支持缺失和缩进敏感都是这样。
    msg7086
        17
    msg7086  
       2021-12-02 06:30:21 +08:00
    你是想拿着 Ruby 的代码风格去写 Python ?
    我觉得你写一个 Explicit 风格的语言就好好地 Explicit 写,不要去玩花样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1131 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 653ms · UTC 22:43 · PVG 06:43 · LAX 14:43 · JFK 17:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.