学习Python - 关于成语,需要注意什么!

4
我已经是 Python 语言的狂热学习者有一段时间了。拥有超过 6 年的 Java [专业] 经验,再加上一些 C++ [兴趣] 经验 - 可以说我的视角深深植根于这些静态类型、强绑定语言所带来的惯用语。简而言之,我可以说老派的思考方式对我的编程风格产生了重大影响。
我选择学习 Python 而不是 Ruby 的原因主要是巧合,因为我找到了一份可以使用 Python 帮助的兼职工作。现在已经过去了两个星期,事情发生了彻底的变化!凭借 IDLE 和 Python Essential Reference,一个又一个的启示接踵而至。就像一个古典物理学家如果重力消失了会感觉一样!
无论如何,我知道要有效地使用 Python,需要进行真正的实践。我认为比起语法,更重要的是我的思维方式。然而,尽管我做好了充分的准备,仍然有一件事情让我相当困扰 - Python 提供了太多的惯用语来执行同样的任务。例如,列表推导式和 filter(...)、apply(...) 和 eval(...) 等。虽然这些惯用语并非完全可替代,但我发现它们的主要目的在很大程度上重叠。
我知道它们使用起来一定有潜在的性能优势。然而,作为一个初学者,什么是最好的方法来进行教育,并抑制解决同一问题的“n”种方法所带来的干扰呢?

1
第0课:不要在生产代码中使用eval :)。 - MAK
7个回答

4
“列表推导和filter(...), apply(...) 和 eval(...), 等等。虽然这些习语不完全可以互换,但我发现它们的主要目的在很大程度上是相同的。”
“Pythonic的方式是:使用简单的for循环或列表推导。 filter和map是旧版本语言的遗留物。Guido原本想将它们删除,但事实证明有一些有效的用例和足够的人希望它们留下来(也参见this thread)。 不要使用eval。”
“除非出现问题,否则不必担心性能问题(如果出现问题,则尝试使用标准库中高度优化的函数是大多数情况下最好的方法)。”
“我认为总体而言,Python真正直观,力求提供一种(显而易见的)方法来完成任务,尽管在某些主题上会出现不同意见。”
浏览本网站并特别关注Python问题中得到高赞的答案(大多数情况下,对于如何做事情有某种共识),可以轻松掌握Python习惯用语。

3

鉴于您有Java背景,我建议阅读Python不是Java,以及侧边栏中的其他大多数文章。该文章提供了一些关于Java程序员如何无意中误用Python(以及如何避免)的好建议。


不错的文章。这些建议也都适用于Java。这些技巧仍然有效,只是在Java中实施需要更多的计划,但它们都是可行的,而且都会改善你的代码(除了将数据放入代码中 - 我认为以允许语言编译它们的方式实现DSL会导致可怕和愚蠢的语法,只需创建一个真正的dsl并自己解析它,该死的。数据应该完全从代码中提取出来,而不仅仅是给出一个愚蠢的语法!)。 - Bill K
谢谢这篇文章。它真正为我们设定了预期,更重要的是,告诉我们如何在实际使用中消化这些内容。 - anirvan

2

类型

import this

进入IDLE



2

1

抱歉,如果我的回答没有你的问题那么长,但是无论如何,我还是会回答:

首先关于listcomps/filter/apply/eval。如果你要使用filter或apply,最好使用列表推导式(或生成器表达式)或for循环,- filter、map、reduce和apply在我所知道的范围内基本上都是过时的,可以安全地忽略。Eval与这些都没有任何关系,它只是将字符串作为Python代码进行评估。除非你有极好的理由这样做(提示:你没有),否则最好不要使用它。

关于惯用语:在Python中,对于一个给定的问题,大多数情况下都有一种最优的“解决方法”,应该在99%的类似情况下使用。例如:需要解析/转换/生成XML?使用lxml。需要进行网络/几乎任何其他类型的I/O操作?使用twisted。等等。当然,还有其他选择,但大多数情况下确实有一种最佳的做事方式。如果您只是使用标准库工作,这更加相关,因为它提供了许多常见问题的最佳解决方案(尽管它确实包含一些相当无用的东西)。


0
有趣的是你这么说:“一个又一个的启示,就像经典物理学家感受到重力不存在一样!”:http://xkcd.com/353/

是的 - 但确实是巧合!:] - anirvan
我觉得有趣的是那个漫画中的“hello-world”不再是有效的Python代码,但仍然是有效的Ruby代码。 - Ken
不是吗?据我所知,这似乎也适用于Py。 - anirvan
@Ken 的意思是在 Python 3.x 中它不再有效。但在 2.x 版本中仍然正确。 - Ned Batchelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接