.join(reversed(val)) vs val[::-1]...哪个更符合Python风格?
根据《Python之禅》的说法……“明确比隐含好”……“稀疏比密集好”……“可读性很重要”……但同时“扁平比嵌套好”……那么,什么才算是“Python风格”呢?
val = "which is pythonic?"
print("".join(reversed(val)))
或者
print(val[::-1])
我只是一个学习Python的Java程序员,所以我觉得这些“Python风格”的东西很有意思,因为在我所知道的Java世界里没有类似的东西。
4 个回答
首先,如果你是初学者,不用担心什么更符合 Python 风格。这听起来像是语言之间的争论,最终你会形成自己的看法。只要使用你觉得更容易读懂或更简单的方式就好,你会找到适合自己的方法,我相信。
话虽如此,我同意 Alex 的优秀回答(他总是对的),我想再补充一点,为什么你应该更倾向于第二种方法——第一种方法只有在 val
是字符串时才会正确工作。
我认为第二个例子更符合Python的风格,因为它更简单、更短、更清晰。
如果你想了解什么是Pythonic,我推荐你看看Python之禅:
美丽胜于丑陋。
明确胜于隐含。
简单胜于复杂。
复杂胜于复杂难懂。
扁平胜于嵌套。
稀疏胜于密集。
可读性很重要。
特殊情况不够特殊到可以打破规则。
尽管实用性胜过纯粹。
错误不应该被忽视。
除非明确地被忽视。
面对模糊性时,拒绝猜测的诱惑。
应该有一种——最好只有一种——明显的方法来做这件事。
尽管这种方法一开始可能不明显,除非你是荷兰人。
现在做总比不做好。
尽管有时候不做比“现在”做要好。
如果实现难以解释,那就是个坏主意。
如果实现容易解释,那可能是个好主意。
命名空间是个很棒的主意——我们应该多用这些!
在我看来,你的第二个例子符合这些原则:
美丽胜于丑陋。
简单胜于复杂。
稀疏胜于密集。
可读性很重要。
我妻子安娜给 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
性能差异大到让人没有怀疑的余地!-)