29

除了 Python 的动态特性(和语法)之外,还有哪些 Python 语言没有 Java 的主要特性,反之亦然?

4

5 回答 5

47
  1. 列出理解。我经常发现自己过滤/映射列表,并且能够说[line.replace("spam","eggs") for line in open("somefile.txt") if line.startswith("nee")]真的很好。

  2. 函数是第一类对象。它们可以作为参数传递给其他函数,在其他函数中定义,并具有词法范围。这使得说诸如此类的事情变得非常容易people.sort(key=lambda p: p.age),从而对一群人的年龄进行排序,而无需定义自定义比较器类或同样冗长的东西。

  3. 一切都是对象。Java 具有不是对象的基本类型,这就是为什么标准库中的许多类都定义了 9 种不同版本的函数(对于 boolean、byte、char、double、float、int、long、Object、short)。 Array.sort是一个很好的例子。自动装箱会有所帮助,尽管当某些东西被证明为空时​​会让事情变得很尴尬。

  4. 特性。Python 允许您创建具有只读字段、延迟生成的字段以及在分配时检查的字段以确保它们永远不会为 0 或 null 或任何您想要防范的字段等的类。

  5. 默认和关键字参数。在 Java 中,如果您想要一个最多可以接受 5 个可选参数的构造函数,则必须定义该构造函数的 6 个不同版本。而且根本没有办法说Student(name="Eli", age=25)

  6. 函数只能返回一件事。在 Python 中,你有元组赋值,所以你可以说spam, eggs = nee(),但在 Java 中,你需要使用可变的输出参数,或者有一个带有 2 个字段的自定义类,然后有两行额外的代码来提取这些字段。

  7. 列表和字典的内置语法。

  8. 运算符重载。

  9. 通常设计更好的库。例如,要在 Java 中解析 XML 文档,您会说
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("test.xml");
    ,而在 Python 中,您会说
    doc = parse("test.xml")

无论如何,我可以继续举出更多的例子,但 Python 总体上是一种更加灵活和富有表现力的语言。它也是动态类型的,我真的很喜欢,但也有一些缺点。

Java 的性能比 Python 好得多,并且具有更好的工具支持。有时这些事情很重要,对于一项任务,Java 是比 Python 更好的语言;尽管我更喜欢 Python,但我继续在一些新项目中使用 Java。但作为一门语言,我认为 Python 在我发现自己需要完成的大多数事情上都更胜一筹。

于 2008-09-08T15:35:32.867 回答
16

我认为 Philip J. Eby 的这对文章很好地讨论了两种语言之间的差异(主要是关于哲学/心态,而不是特定的语言特征)。

于 2008-09-08T14:40:36.400 回答
5

Python 的一个关键区别是显着的空白。这让很多人望而却步——我也是很长一段时间——但一旦你开始,它看起来很自然,而且比任何地方都更有意义;

从个人角度来看,Python 相对于 Java 有以下优势:

  • 没有检查的异常
  • 可选参数
  • 样板文件少得多,一般也不那么冗长

除此之外,Python Wiki 上的这个页面是一个很好的地方,有很多有趣的文章的链接。

于 2008-09-08T14:43:09.467 回答
3

使用Jython,您可以两者兼得。它仅适用于 Python 2.2,但如果您需要一个可以访问 Java 运行时的嵌入式解释器,它仍然非常有用。

于 2008-09-08T15:13:58.020 回答
2

除了伊莱·考特赖特所说的:

  • 我发现 Python 中的迭代器更简洁。你可以在某些东西中使用 for i,它几乎适用于所有东西。是的,Java 自 1.5 以来已经变得更好,但是例如,您可以使用相同的构造在 python 中迭代字符串。
  • Introspection:在 python 中,您可以在运行时获取有关对象或模块的符号、方法甚至其文档字符串的信息。您还可以动态地实例化它们。Java 有一些这样的功能,但通常在 Java 中需要半页代码来获取一个类的实例,而在 Python 中大约需要 3 行。据我所知,文档字符串在 Java 中不可用
于 2008-09-09T10:11:54.070 回答