“”。join(reverse(val))vs val [:: - 1] ...这是pythonic?

时间:2009-11-08 04:42:35

标签: python

所以根据Python的 Zen ... 显式优于隐式 ... 稀疏优于密集 ... 可读性计算 ...但是再次 Flat比嵌套更好......那么 pythonic 是什么?

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

print(val[::-1])

我只是一个学习Python的Java程序员,所以我发现这个 pythonic 的东西很有趣,因为Java世界AFAIK中没有模拟。

4 个答案:

答案 0 :(得分:45)

我的妻子安娜绰号x[::-1]“火星笑脸” - 我主要向她求助(以及她在训练和心理学方面的长期经验,以及在人类心理学方面的研究)判断大多数人的轻松自然,她绝对喜欢的武侠笑脸。 “只是向后走吧” - 比“逆转然后再加入”的详细规范更直接,更抽象!“

此外,python -mtimeit通常可以很好地判断Pythonic是什么:多年来,顶级Pythonistas当然倾向于优化他们最常需要和使用的东西,因此非常实质的性能差异会告诉你什么“与“语言及其顶级实践者”相关。通过这个分数,火星的笑脸击败了详细的规格......:

$ 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

数量级的性能差异只是没有留下那么多怀疑的空间! - )

答案 1 :(得分:4)

第二个(在我看来)更像Pythonic,因为它更简单,更短,更清晰。

有关什么是 Pythonic 的更多信息,我建议The Zen of Python

  

美丽胜过丑陋       明确比隐含更好       简单比复杂更好       复杂比复杂更好       扁平比嵌套好。
      稀疏比密集更好       可读性很重要       特殊情况不足以打破规则       虽然实用性超过了纯度       错误绝不应该默默无闻       除非明确沉默。
      面对模棱两可,拒绝猜测的诱惑       应该有一个 - 最好只有一个 - 明显的方式   做到这一点       虽然这种方式起初可能并不明显,除非你是荷兰人       现在总比没有好。
      虽然现在永远不会比正确更好       如果实施很难解释,那是个坏主意       如果实施很容易解释,那可能是个好主意       命名空间是一个很棒的主意 - 让我们做更多的事情吧!

在我看来,你的第二个例子满足了这些原则:

  

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

答案 2 :(得分:0)

使用字符串,就像你一样,我会选择第一个选项,因为它清楚地表明你想要的结果是一个字符串。对于列表或其他可迭代/可切片,我会选择第二个。

第一种形式的另一个好处是,如果val实际上不是一个字符串,而是一些其他可迭代的字符(例如某种类型的生成器),它将起作用。在某些情况下,这会产生很大的不同。

答案 3 :(得分:0)

首先,如果你是初学者,不要担心什么是pythonic或不是pythonic。这种气味语言战争,无论如何你最终会找到自己的意见。只是使用你认为对你更可读/更简单的方式,我想你会找到它。

那就是说,我同意Alex的优秀答案(因为他总是对的)我会添加一个额外的评论,为什么你更喜欢第二种方法 - 第一种方法只有在val是一个字符串时才能正常工作。