所以根据Python的 Zen ... 显式优于隐式 ... 稀疏优于密集 ... 可读性计算 ...但是再次 Flat比嵌套更好......那么 pythonic 是什么?
val = "which is pythonic?"
print("".join(reversed(val)))
或
print(val[::-1])
我只是一个学习Python的Java程序员,所以我发现这个 pythonic 的东西很有趣,因为Java世界AFAIK中没有模拟。
答案 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
是一个字符串时才能正常工作。