如何学习有效地编写Pythonic代码?


46

用谷歌搜索“ pythonic”会发现各种各样的解释。在维基百科页面称:

Python社区中最常见的新词是pythonic,它具有与程序样式相关的广泛含义。说代码是pythonic就是说它很好地使用了Python习惯用法,它是自然的,或者显示出流利的语言。同样,要说它是pythonic的接口或语言功能,就是说它与Python惯用语配合得很好,并且它的使用与语言的其余部分很好地结合在一起。

它还讨论了术语“ unpythonic”:

相反,非Python代码的标志是它试图用Python编写C ++(或Lisp,Perl或Java)代码-也就是说,提供的是粗略的转录,而不是来自另一种语言的惯用形式的翻译。pythonicity的概念与Python的极简主义的可读性哲学紧密相关,并且避免了“有多种方法可以做到这一点”。不可读的代码或无法理解的习惯用法是难以理解的。

术语“ pythonic”是什么意思?如何学习在实践中有效地应用它?


6
我认为您的问题可以扩展到任何编程语言。始终存在一种推荐的编程方法,该方法在许多情况下可能是准确的,并且还可以提高版本,可读性和维护性。我认为挑战这些建议也可以使一种语言发展和进步...
Amine

@Amine如此真实。实际上,我认为应该考虑一个社区Wiki,其中包括从何处学习所有语言的成语。
yati传奇


1
评论者:请停止发表无关的评论;它们已被删除是有原因的。如果您有答案,请保留为答案。如果您想讨论此问题的主题,请使用chat

1
通过练习Python!
动态

Answers:


22

我发现大多数人对“ Pythonic”的真正含义有自己的解释。从维基百科:

Python社区中最常见的新词是pythonic,它具有与程序样式相关的广泛含义。说代码是pythonic就是说它很好地使用了Python习惯用法,它是自然的,或者显示出流利的语言。同样,要说它是pythonic的接口或语言功能,就是说它与Python惯用语很好地配合使用,并且它的使用与语言的其余部分紧密结合。

相反,非Python代码的标志是它试图用Python编写C ++(或Lisp,Perl或Java)代码-也就是说,提供的是粗略的转录,而不是来自另一种语言的惯用形式的翻译。pythonicity的概念与Python的极简主义的可读性哲学紧密相关,并且避免了“有多种方法可以做到这一点”。不可读的代码或无法理解的习惯用法是难以理解的。

我发现,实际上有更多的“ pythonic”示例来自于试图聪明地使用Python惯用语并(实际上,不是没有更多)使他们的代码几乎不可读(不是 Pythonic)的人。

只要您坚持使用Python的习惯用法并避免尝试在Python中使用C ++(或其他语言)样式,那么您就可以成为Pythonic。

正如WorldEngineer指出的那样,PEP8是一个很好的遵循标准(如果您使用VIM,则可以使用PEP8插件的插件)。


确实,尽管到最后,如果您的解决方案有效并且并非绝对难以维护且缓慢,那么谁在乎呢?很多时候,您的工作是完成一项任务,而不是编写最优雅的Python代码。


从另一个方面说明(只是我的意见,随时因为它downvote;)):我也发现Python社区要充满的自我(不是大多数社区都没有,它只是一个小更普遍在C和Python等社区中)。因此,将自我与被误解为“ pythonic”的解释结合起来,往往会产生很多毫无根据的否定性。一粒盐拿走你从别人那里读到的东西。遵循官方标准和文档,一切都会好起来的。


2
+1是一个不错的答案(除了引号,因为我在OP中使用了它)。

Ugh .. Shoulda在发布报价前应重新阅读OP:P
Demian Brecht

3
而是,自我与在线活跃,在任何社区表达意见之间都存在高度相关性。基本上,您不会看到非利己主义者那么多,因为他们一开始就没写那么多。
isarandi 2015年

17

Pythonic是用Python惯用的代码。这意味着从编程的角度来看,也从社区阅读的角度来看,使用对Python都适用的结构和格式。就像很长时间以来,K&R为C编程风格设定标准一样。本指南说明您必须使用Python惯用的代码。该指南中引用了PEP 8,因此可能值得阅读。


1
@MattFenwick但这不是90%的编程内容吗?优秀的程序员花大量时间阅读代码,而在剩下的时间里,编写大量代码。您阅读的Pythonic代码越多,用Python编写的代码越多,您的代码将越多。我认为这里没有捷径可走。
克里斯·哈珀

2
优秀的链接!
伊桑·弗曼

13

编写“ Pythonic”代码IMHO只是有效地使用了该语言提供的(V)HLL功能。举个普遍的例子

x, y = 7, 'fuhrer'

那是非常 Pythonic的。我记得只有几个月的Python之后,我才开始学习C#,

int x, y = 10, z;

不知何故使我感到困惑,但是花了我一分钟时间才回到我的C / C ++根源。

另一种Python方式是使用lambda。

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

实际l将以降序打印。

然后是使用最多但了解很少的“鸭子打字”-如果它像鸭子一样走路和说话,则将其视为鸭子。这与其他OO语言的接口大致无关。

在适用的情况下也使用函数式编程方法,例如使用map和reduce都被认为是pythonic。

我在键入时看到了一个答案,其中包含一个不错的链接。PS:并不是说您对Python的了解有限。我敢打赌,Python不是您的母语,因此(像我们大多数pythonistas一样),您将必须学习让蛇“习惯”!干杯!


我没有输入链接,因为它是我键入时已经发布的-WorldEngineer的答案:)只是考虑“利用”您和他人的语言功能,您将获得Pythonic,请务必关注该链接
yati sagade 2011年

4
事实上,许多纠纷mapreducelambda和如成语本身。列表推导和生成器表达式是一种替代方法,并且在合理可能的情况下,很多人更喜欢它们(特别是,无论如何,当您需要使用lambda时,它们的噪音都较小)。它们肯定有其用途,而函数式编程则以其他习语(例如装饰器)显示。

@delnan同意-在Python 3中更是如此。结论是,应该在需要的地方准确使用这些功能。而且(只有一种显而易见的方法)是惯用的:)
yati sagade 2011年

就我个人而言,我从未理解过您对第一个示例的偏好。这在思想上解析起来要容易得多(这 Python的Zen,读取代码的频率比编写代码的频率高):(x, y) = (7, 'fuhrer')-但是我几乎总是被“纠正”,没有括号是编写代码的最佳方法!
Izkata 2012年

2
我认为您的特定排序示例不是pythonic。如果可以的话,为什么print(sorted(l, reverse=True))还要用lambda重新引入重新排序,它还可以清楚地告诉读者发生了什么。我也会发现您的第一个示例也有争议。这是将两个作业压缩成一个作业。没关系,但我不会称之为Pythonic。与做两次作业相比,读者必须花更多的时间看它的工作。
菲涅耳2014年

7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Pythonic代码是:

  • 可读的
  • 简单(越简单越好,但没有更简单)
  • 仔细思考过的

1
+1。Python的Zen对于编写pythonic代码比遵循一系列习语更为重要。后者并不能涵盖所有情况。
2014年

6

每当我尝试学习一种新语言时,我都会发现,由那些像手背一样了解该语言的人阅读代码,查找/询问任何看起来很奇怪的事物,然后尝试模仿自己的风格,最好的事情。例子:

在Python中,由于涉及到这一主题,因此我发现Dive Into Python中的示例对于入门非常有用。他们不仅会教授Python的基础知识,而且还会真正强调惯用的 Python。

在学习D时,由于当时的语言不够先进,导致当时的文档不够好,因此我通过阅读标准库中的代码(特别是Andrei Alexandrescu的一些杰作)来学习

在学习C ++时,我从一个相当不错的C ++程序员那里继承了一个代码库,并从他坚持通过引用传递STL容器等方面学到了很多有关惯用C ++编程的知识。

在所有语言中,我发现浏览有关该语言的StackOverflow问题并查看人们通常会完成基本工作的内容会有所帮助。


+1一旦您了解了某种语言的基础知识,阅读代码将比读书更有帮助。
Pace

3

Python不是Java可能会给您一些有用的建议。在不知道您遇到什么问题的情况下不能说更多,但是对于来自另一种语言(在本例中为Java)背景的程序员来说,这是非常具体的建议,说明如何进行不同的python处理。


2

有人说,要学习Pythonic,只需猛击一些代码即可。我不同意这一点。如果您喜欢编写高度密集的代码,那并不会使其变得更加Pythonic。

一种可以帮助您定义什么是Pythonic的方法是,问自己“为什么我(意味着您)会使用Python语言?” 对此有什么吸引力?

对我来说,这是可读性,缺乏编译和开源(几乎全部)。与许多其他语言相比,我可以减轻许多图书馆的负担并阅读源代码,而对许可的压力不大。

对我来说,Python在视觉上很漂亮。Guido(Python的创建者)也通过他在PEPS和讨论中的回答不断向我证明,他对语言的选择优于我对应如何创建语言的想法。

对我来说,一个优秀的程序员是具有非常明智的决策技巧的人,他们会在编码时选择哪种方式。对我来说,Python有助于快速做出这些选择。

通过允许鸭子输入而不是显式类型转换来简化源代码语法,并且期望编码人员检查您的代码“应该是行为良好的编码人员”,这导致我也称之为“ Pythonic”

因此,Pythonic有两个方面。一种是句法,另一种是实践。如何解释“ Pythonic”的更深层次。

在Python中,执行此操作没什么大不了的:alist = ['one','two','three \ n'] alist.append((1234,'Atuple'))

并且元组将添加到列表中,而无需考虑对象类型。Python的部分不是您可以执行此操作,而是您的代码应该执行此操作并且可以正常工作/适应。

无论在-alist-对象上执行任何操作,都应以可以引入其他一些编码器并将非字符串添加到列表的想法来编写,并且新编码器对源代码进行改编应该很容易。毕竟这就是鸭子的好处。


-2

购买推荐的书。阅读。它应该为您提供使用该语言的良好基础,并以一种符合社区风格的机制

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.