从Java转到Python?
除了Python的动态特性和语法之外,Python还有哪些Java没有的主要特点,反之亦然?
5 个回答
Python 有一个很重要的特点,就是它的 显著空白。这个特性让很多人觉得不习惯——我自己也曾经觉得很困惑——但一旦你开始使用,就会觉得很自然,而且比到处都是 ;
符号要更有逻辑。
从个人的角度来看,Python 相比 Java 有以下几个好处:
- 没有 检查异常
- 可选参数
- 代码冗余少,整体上更简洁
除此之外,这个 Python 维基页面 是一个很好的资源,上面有很多有趣文章的链接。
我觉得Philip J. Eby写的这两篇文章很好地讨论了这两种编程语言之间的区别(主要是关于它们的理念和思维方式,而不是具体的语言特性)。
列表推导式。 我经常需要对列表进行筛选或映射,能够用
[line.replace("spam","eggs") for line in open("somefile.txt") if line.startswith("nee")]
这样的写法,真是太方便了。函数是头等公民。 函数可以作为参数传递给其他函数,也可以在其他函数内部定义,还可以有自己的作用域。这让我们可以很轻松地写出
people.sort(key=lambda p: p.age)
这样的代码,直接按年龄对一群人进行排序,而不需要定义一个复杂的比较器类。一切都是对象。 Java 有一些基本类型不是对象,这就是为什么标准库里有很多类定义了 9 种不同版本的函数(比如 boolean、byte、char、double、float、int、long、Object、short)。比如
Array.sort
就是一个例子。虽然自动装箱有帮助,但当某个值是 null 时就会变得很尴尬。属性。 Python 允许你创建具有只读字段、懒加载字段,以及在赋值时进行检查的字段,确保它们永远不会是 0 或 null,或者其他你想要防止的值。
默认参数和关键字参数。在 Java 中,如果你想要一个构造函数可以接受最多 5 个可选参数,你必须定义 6 个不同版本的构造函数。而且根本不能像这样写
Student(name="Eli", age=25)
。函数只能返回一个东西。在 Python 中,你可以使用元组赋值,比如
spam, eggs = nee()
,但在 Java 中,你要么得用可变的输出参数,要么得定义一个包含两个字段的自定义类,然后再写两行代码来提取这些字段。内置的列表和字典语法。
运算符重载。
总体上设计得更好的库。例如,在 Java 中解析一个 XML 文档,你需要写
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("test.xml");
而在 Python 中,你只需写
doc = parse("test.xml")
总之,我可以继续举更多例子,但 Python 总体上是一个更灵活、更具表现力的语言。我也很喜欢它的动态类型,但这也带来了一些缺点。
Java 的性能比 Python 好得多,工具支持也更强。有时候这些因素非常重要,Java 在某些任务上确实比 Python 更合适;尽管我更喜欢 Python,但我仍然会在一些新项目中使用 Java。不过就我需要完成的大多数事情来说,我认为 Python 更优秀。