简洁优雅 pythonic 的代码风格和更容易阅读的代码风格你更倾向哪一种?

2020-09-27 18:07:10 +08:00
 loliordie

这个起因非常神奇, 是我跟另一位 dalao 刷 LC 一道 EASY 题时产生的讨论.

题目 LC. 234 的 O(1)空间复杂度解法, 由于是三刷我们的思路完全一致, 都是利用回文对称性寻找中间点的同时将前半部分指向关系翻转后进行比较, 但代码风格的不同却造成了别人阅读代码的不同反应.

这是大佬的解答部分代码, 非常 pythonic, 可以看出使用了好几个骚操作来压缩代码.

fast, slow, pre = head, head, None
while fast and fast.next:
    fast = fast.next.next
    pre, slow.next, slow = slow, pre, slow.next
slow = slow.next if fast else slow
while slow and slow.val == pre.val:
    pre, slow = pre.next, slow.next
return not pre

这是我的烂代码

fast = head
slow = head
pre = None

while fast and fast.next:
    fast = fast.next.next
    temp = slow
    slow = slow.next
    temp.next = pre
    pre = temp

if fast:
    slow = slow.next

while slow and slow.val == pre.val:
    pre = pre.next
    slow = slow.next

if not pre:
    return True
else:
    return False

核心逻辑完全一致, 但是在给一起刷题的一个大三实习生看时, 对方表示 dalao 的代码比较难懂, 反而觉得我的烂代码比较适合在工作中使用, 因为一眼就能看明白不会浪费时间.

感觉有点迷茫在工作中应该使用什么样的代码风格了...

3344 次点击
所在节点    Python
30 条回复
cmdOptionKana
2020-09-28 00:15:49 +08:00
明显第一种更好,你不给人家加空行不厚道啊。
lxilu
2020-09-28 00:55:47 +08:00
这倒看不出 pythonic……
NoobX
2020-09-28 02:26:35 +08:00
原始代码并不属于故意缩短代码行数的类别,见过有代码为了炫技,在一行内用很多的 for 和 if-else 嵌套,个人不太推荐这么干,十分影响可读性。
总体来说在不影响可读性的前提下,越精炼越好。相比之下,我认为你给出的原始代码更易读
goinghugh
2020-09-28 08:31:28 +08:00
我觉得第一种好,一眼就看出要做什么了; 换个问题,写 Java 时,用 stream 还是写 for-each 比较好写易读?
InkStone
2020-09-28 10:09:58 +08:00
对于懂 Python 的人来说,第一种既更 pythonic,也更易读。

另外赞同上面的看法,
if not pre:
return True
else:
return False
这种写法不管在哪里都要被打死的
cassyang
2020-09-28 10:57:16 +08:00
第一个哪里不好读了。。
component
2020-09-28 11:02:16 +08:00
@mcfog @InkStone 不懂就问,这样写有什么问题吗?是不是要用三元运算符来写?区别很大么?
aguesuka
2020-09-28 12:44:11 +08:00
@component return not pre 。你的 ide 没有警告吗?
laike9m
2020-10-02 17:37:56 +08:00
第一个,因为它用的都是最常用的写法,没有任何花哨的地方。你觉得骚只是因为你不熟悉语法而已。
cominghome
2020-10-09 19:27:23 +08:00
pythonic 骚东西很多,这一块我了解得不多,但是第一个例子里显然都是很实用的技巧,我投第一个

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX