侧边栏壁纸
博主头像
小萌小筑博主等级

叹一句当时只道是寻常

  • 累计撰写 10 篇文章
  • 累计创建 6 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

三元运算符的结果缓存

超级小萌哥
2024-05-08 / 0 评论 / 2 点赞 / 20 阅读 / 4599 字

用python写CURD业务代码时,经常能够碰到使用列表表达式不太好用的地方,如下

[
    {
        child:db.query(item.child).one() if db.query(item.child).one() else 'default'
    }
    for item in items
]

因为列表表达式中无法新建变量存储结果,所以像数据库查询这种耗时相对较长的部分,使用如上的三元运算符肯定完全不合理。因为相当于运行了两次,无奈只能使用for循环来缓存结果,功能实现倒没问题,但确实建立了一个只需要使用一次的变量(自己总结时想到这,突然想通了一切┭┮﹏┭┮),太不优雅了。

JS

我在GPT-4提出了这个问题(3.5直接懵逼,甚至认为最终的解决方案是错误的),他向我介绍了IIFE( Immediately Invoked Function Expression)的极值,语法很简单

(() => {
   // 函数体
})();

就是写了一个函数然后立即执行,乍一看可能还是很懵,但一加参数豁然开朗

((result) => {
   // 函数体
})(a);

函数能够接收到下面的a参数,并且能够作为实参传递到形参result,细想这确实是符合js语法的,因此,可以暂定这萦绕我脑中一二年之久的问题的解决方案了

((result) =>  result?result:default )(a);

Python

没想到问GPT问不出来,不过使用python实现倒也不难

a = partial(lambda r: r if r else 10, complicate_calc())()

complicate_calc只需要执行一次,结果也会通过partial传递到内部lambda函数,r则对结果进行了缓存

思想

  • 首先变量的作用域,匿名函数(js:()=>,py:lambda)都使用形参建立了一个短暂的、只需要使用一次大的作用域(这不呼应上了!)

  • IFFE,或partial给了我们一个把结果传递到这个小作用域的机会,杨意不逢,抚凌云而自惜;钟期既遇,奏流水以何惭?,两个看似不应该碰到一起的人,却也曲高和寡,能奏出高山流水。

感慨

  • 对于这种萦绕心头,甚至语言都难以描述的问题的解决,GPT属实是一种不错的解决方案

  • 其实3.5回答不出来时,我甚至感觉蛮开心的,4则泼我一盆冷水,但关于AI焦虑的问题我已然基本解决,甚至一部分意见来及GPT-4(用魔法打败魔法!)。

    • 一是,不要试图突破自己的历史局限性,感慨于过去的人受齐所困也不能让自己脱身其中,这是必然的规律

    • 二是,一切技术都是人类智慧的延伸,人类基于爱好、好奇心、需求创造出技术,这本身就不会是反人类的

      《理解媒介:论人的延伸》(Understanding Media:The Extensions of Man),任何发明或技术都是人体的延伸或自我截除,所以可能是有风险的,但不会是反人类的

    • 三则是,不要成为因循守旧故步自封的人,不能突破历史局限,最好也能站在先看见日出的山顶

2

评论区