.join(reversed(val)) vs val[::-1]...哪个更符合Python风格?

15 投票
4 回答
1112 浏览
提问于 2025-04-15 15:46

根据《Python之禅》的说法……“明确比隐含好”……“稀疏比密集好”……“可读性很重要”……但同时“扁平比嵌套好”……那么,什么才算是“Python风格”呢?

val = "which is pythonic?"
print("".join(reversed(val)))

或者

print(val[::-1])

我只是一个学习Python的Java程序员,所以我觉得这些“Python风格”的东西很有意思,因为在我所知道的Java世界里没有类似的东西。

4 个回答

0

首先,如果你是初学者,不用担心什么更符合 Python 风格。这听起来像是语言之间的争论,最终你会形成自己的看法。只要使用你觉得更容易读懂或更简单的方式就好,你会找到适合自己的方法,我相信。

话虽如此,我同意 Alex 的优秀回答(他总是对的),我想再补充一点,为什么你应该更倾向于第二种方法——第一种方法只有在 val 是字符串时才会正确工作。

4

我认为第二个例子更符合Python的风格,因为它更简单、更短、更清晰。

如果你想了解什么是Pythonic,我推荐你看看Python之禅

美丽胜于丑陋。
明确胜于隐含。
简单胜于复杂。
复杂胜于复杂难懂。
扁平胜于嵌套。
稀疏胜于密集。
可读性很重要。
特殊情况不够特殊到可以打破规则。
尽管实用性胜过纯粹。
错误不应该被忽视。
除非明确地被忽视。
面对模糊性时,拒绝猜测的诱惑。
应该有一种——最好只有一种——明显的方法来做这件事。
尽管这种方法一开始可能不明显,除非你是荷兰人。
现在做总比不做好。
尽管有时候不做比“现在”做要好。
如果实现难以解释,那就是个坏主意。
如果实现容易解释,那可能是个好主意。
命名空间是个很棒的主意——我们应该多用这些!

在我看来,你的第二个例子符合这些原则:

美丽胜于丑陋。
简单胜于复杂。
稀疏胜于密集。
可读性很重要。

45

我妻子安娜给 x[::-1] 起了个外号叫“火星微笑”。在判断什么对大多数人来说简单自然时,我通常会听她的,因为她在培训和人类心理学方面有丰富的经验。她真的非常喜欢这个“火星微笑”。“就反着走嘛”——这比“先反转再拼接”这种详细的说法要直接和抽象得多!

另外,python -mtimeit 通常是判断什么是“Pythonic”的好方法:多年来,顶尖的Python开发者们自然会优化他们最常用的东西,所以如果有很大的性能差异,就说明什么是符合这个语言和它的顶尖使用者的习惯。而从这个角度来看,“火星微笑”明显比详细的说明要好得多……:

$ python -mtimeit '"".join(reversed("hello there!"))'
100000 loops, best of 3: 4.06 usec per loop
$ python -mtimeit '"hello there!"[::-1]'
1000000 loops, best of 3: 0.392 usec per loop

性能差异大到让人没有怀疑的余地!-)

撰写回答