Java程序员的Python可读性提示

9

我是一名Java程序员,但现在因为某些工作需要,进入了“Python领域”。我相信我的很多代码对于Python程序员来说看起来很奇怪(例如,在每个if语句中都使用括号)。

我知道每种语言都有自己的惯例和一套“习惯”。那么,从可读性的角度来看,哪些是Java中应该采用的惯例和做法,但在Python中并不是真正的“Pythonic方式”?


我也正好有同样的问题在脑海中 :) - Snehal
保持开放的心态...Python 本质上应该是易读的...通过理解一些概念,如切片、lambda、装饰器等,就会变得清晰明了。 - Perpetualcoder
6个回答

8

4
我同意“像 Python 程序员一样编码”。 - Brandon Coffman

5
Jacob Hallén曾经观察到,最好的Python风格遵循Tufte对装饰的拒绝(尽管Tufte的领域不是编程语言,而是信息的视觉展示):不要浪费“墨水”(像素)或“纸张”(空间)来进行纯粹的装饰。
许多原则都遵循这个原则:没有冗余的括号、没有分号、没有愚蠢的注释和文档字符串中的"ascii框"、没有浪费的空间来“对齐”不同行上的东西、除非特别需要双引号,否则使用单引号、除非强制要求,否则不使用\来延续行、没有仅仅提醒读者语言规则的注释(如果读者不知道你在用哪种语言,你就有麻烦了;-),等等。
我应该指出,“Python的Tufte精神”的一些结果在Python社区内部比其他结果更具争议。但是这门语言确实非常尊重“Tufte的精神”...
移动到“更具争议的”(但被Python之禅所认可--在解释器提示符下输入import this):“扁平比嵌套好”,所以“尽快退出”而不是嵌套。让我解释一下:
if foo:
  return bar
else:
  baz = fie(fum)
  return baz + blab

这并不糟糕,但也不是最佳方案:因为“return”会“退出”,所以您可以节省嵌套:

if foo:
  return bar
baz = fie(fum)
return baz + blab

一个更精确的例子:

for item in container:
  if interesting(item):
    dothis(item)
    dothat(item)
    theother(item)

那个双重嵌套的大块不够简洁...考虑使用更扁平的样式:

for item in container:
  if not interesting(item):
    continue
  dothis(item)
  dothat(item)
  theother(item)

顺便提一下,这不只是Python代码风格的问题--在任何语言中都会有我厌恶的事情,但是在Python中,Tufte的理念支持我:-

if not something:
  this()
  that()
  theother()
else:
  blih()
  bluh()
  blah()

"

如果不是...那么就是"很令人费解!交换两部分并去除not

"
if something:
  blih()
  bluh()
  blah()
else:
  this()
  that()
  theother()

4
在函数执行过程中是返回一个值还是使用else语句,这常常让我犹豫不决... - detly

3

最好的起点可能是PEP-8,这是官方的Python风格指南。它涵盖了很多被认为是标准的基础知识。


是我个人感觉还是最近这几天PEP-8被提到的频率比之前要高呢? - dash-tom-bang
据我所见,这个问题已经被频繁地提及了一段时间。 - Amber


0
“一切皆为类”是Java中的习语,但它并不适用于Python。在Python中,几乎所有东西都可以是一个类,如果这对你更舒适的话,那就使用它吧,但Python并不要求这样做。Python不是纯面向对象的语言,在我的(有限)经验中,我们应该认真对待这一点。

0

语法只是冰山一角。Java程序员应该了解许多不同的语言结构,例如Python不需要使用接口。

在Python中创建接口和可交换实现 - Stack Overflow

另一个非常有用的习惯用法是在Python中可以将所有东西转换为具有直观含义的布尔值。例如,要检查一个空数组,你只需执行

if not my_array:
  return
...process my_array...

第一个条件等同于Java的

if ((my_array == null) || (my_array.length == 0)) {
  return
}

这在Python中是一个天赐之物。它不仅更加简洁,而且避免了Java的一个陷阱,即许多人不一致地检查两个条件。由此避免了无数的NullPointerException。


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