用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),任何发明或技术都是人体的延伸或自我截除,所以可能是有风险的,但不会是反人类的
三则是,不要成为因循守旧故步自封的人,不能突破历史局限,最好也能站在先看见日出的山顶
评论区