总结
“append”是希望还在学 python 的朋友不要被部分人的节奏带偏了。
本帖初衷是分享一个 python 的 build-in function,functools、operator 标准库,函数式编程方面的东西,因为在 leetcode 的 comment 区解释了一下这一行代码的运行过程,对于对 python 这方面写法还不甚了解的朋友我认为是值得分享的。
本帖原话也没有说这行代码性能 OK,本帖潜意思也没有说这行代码性能 OK,因为敲下键盘之前就知道这么写速度是较慢的;
(再强调一下,针对这道题来说,(各种语言)通用的一般写法写成最优不是很显而易见的吗?这道题就那么写完,有增加什么知识吗?)做到这道题刚好拿来练手 python 的高阶函数和了解函数式编程;是用来 know 和 practice to master 的。
但是另一方面, time complexity 是比 higher order function 更重要的;所以评论区跑代码,改代码指出原贴的一行代码的性能问题是十分有价值的,所以这一行代码也可以作为"在产品中滥用" one-liner 的反例。
附:
虽然说该行代码在产品中是反例。
不过在产品中,遇到这么简单的问题,个人认为应该这么写:
def solution(nums, n):
for i in range(n):
yield nums[i]
yield nums[n+i]
使用:
for i in solution(the_nums, the_n): ...
or
reformat_nums = list(solution(the_nums, the_n))
如果是按原题意,可能的实际问题是成对取结果,可以直接这么写:
return zip(nums[:n], nums[n:])
python 还有 itertools 库可以提供类似这样问题的实用 function。
leetcode 本来就是用来做练习、掌握知识点用的;总不能说所有 leetcode 题上的“最优解”用在生产环境也是“最优的”吧?
不要被情绪化的、主观偏见的评论带偏了。
总结这么多,是想说,这个贴初衷是分享 python 语言支持部分函数式编程范式的一种类型的写法,以及还有很多实用的 python 标准库。但是有杠精乱喷,所以我强调下不要被杠精带偏节奏,本帖没有说这行解法最好,本帖的初衷也不是杠精口中的那类。
然后有人在评论区指出本帖这行代码的性能问题,这一点我知道会慢,但是确实没有仔细分析;所以对于性能方面讲到重点的地方确实没有错。
你应该看到 reduce(add, zip(nums[:n], nums[n:])) 这样写法的“好懂”之处在哪里;
同时经过本帖的讨论,知道 reduce(add, ) 的性能问题在哪里(reduce(add, ) 即没有这个性能问题)。另一方面我后面也说了,这个问题本质上不是“一行”的问题,不是代码写成一行性能就会变差,在产品代码中,遇到本帖这类问题,有更好的实现方法(上面“附”以及写出来了)。
而不是因为你(预设立场)反对“python 语言可以一行解决一些问题”觉得不爽,然后过来贬低“一行”代码的写法。
指明代码缺陷在哪里没有问题,我认同这个问题,可以往细节分析。但是预设立场为喷而喷,这种杠精我或不客气回复,或懒得回复。
======
结束语
引用牛人的话作为进一步阐明这个分享帖的出发点,和结束语
“要不这样吧, 如果编程语言里有个地方你弄不明白, 而正好又有个人用了这个功能, 那就开枪把他打死。 这比学习新特性要容易些,然后过不了多久, 那些活下来的程序员就会开始用 0.9.6 版的 Python, 而且他们只需要使用这个版本中易于理解的那一小部分就好了(眨眼) 。”[^1] —— Tim Peters
[^1]: 给 comp.lang.python Usenet 小组的留言,2002 年 12 月 23 日, “Acrimony in c.l.p”( https://mail.python.org/pipermail/python-list/2002-December/147293.html ) 。