python nums_分享一行 Python 代码 `reduce(add, zip(nums[:n], nums[n:]))` - 来自解决 Leetcode #1470. Shuffle the...

总结

“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 ) 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值