tags:

views:

985

answers:

5
+14  Q: 

Java -> Python?

Besides the dynamic nature of Python (and the syntax), what are some of the major features of the Python language that Java doesn't have, and vice versa?

+12  A: 

I think this pair of articles by Philip J. Eby does a great job discussing the differences between the two languages (mostly about philosophy/mentality rather than specific language features).

dF
+4  A: 

One key difference in Python is significant whitespace. This puts a lot of people off - me too for a long time - but once you get going it seems natural and makes much more sense than ;s everywhere.

From a personal perspective, Python has the following benefits over Java:

  • No Checked Exceptions
  • Optional Arguments
  • Much less boilerplate and less verbose generally

Other than those, this page on the Python Wiki is a good place to look with lots of links to interesting articles.

Dave Webb
"No Checked Exceptions" is definitely not an improvement. I want to know what things can go wrong, rather than have to guess a few cases and hope that's all.
rjmunro
Yeah, I left checked exceptions out of my answer because of this argument. However, I'd say that Java has some bad decisions about what's checked and what's unchecked in the standard library. This doesn't discredit them as a language feature, but it can make Java programming a lot more annoying.
Eli Courtwright
Well, C# came after Java and they left expections unchecked. There was an interview with A. Heisenberg (?) with the rationale behind it. But I think he basically said that checked exceptions looked good on paper, and were a pain in practice
Mario
True, but James Gosling responded to the interview with Anders Hejlsberg and presented a decent counterargument. I still prefer unchecked exceptions, but I do think Gosling makes a pretty good case.
Eli Courtwright
+2  A: 

With Jython you can have both. It's only at Phython 2.2, but still very useful if you need an embedded interpreter that has access to the Java runtime.

Bob Nadler
+23  A: 
  1. List comprehensions. I often find myself filtering/mapping lists, and being able to say [line.replace("spam","eggs") for line in open("somefile.txt") if line.startswith("nee")] is really nice.

  2. Functions are first class objects. They can be passed as parameters to other functions, defined inside other function, and have lexical scope. This makes it really easy to say things like people.sort(key=lambda p: p.age) and thus sort a bunch of people on their age without having to define a custom comparator class or something equally verbose.

  3. Everything is an object. Java has basic types which aren't objects, which is why many classes in the standard library define 9 different versions of functions (for boolean, byte, char, double, float, int, long, Object, short). Array.sort is a good example. Autoboxing helps, although it makes things awkward when something turns out to be null.

  4. Properties. Python lets you create classes with read-only fields, lazily-generated fields, as well as fields which are checked upon assignment to make sure they're never 0 or null or whatever you want to guard against, etc.'

  5. Default and keyword arguments. In Java if you want a constructor that can take up to 5 optional arguments, you must define 6 different versions of that constructor. And there's no way at all to say Student(name="Eli", age=25)

  6. Functions can only return 1 thing. In Python you have tuple assignment, so you can say spam, eggs = nee() but in Java you'd need to either resort to mutable out parameters or have a custom class with 2 fields and then have two additional lines of code to extract those fields.

  7. Built-in syntax for lists and dictionaries.

  8. Operator Overloading.

  9. Generally better designed libraries. For example, to parse an XML document in Java, you say
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("test.xml");
    and in Python you say
    doc = parse("test.xml")

Anyway, I could go on and on with further examples, but Python is just overall a much more flexible and expressive language. It's also dynamically typed, which I really like, but which comes with some disadvantages.

Java has much better performance than Python and has way better tool support. Sometimes those things matter a lot and Java is the better language than Python for a task; I continue to use Java for some new projects despite liking Python a lot more. But as a language I think Python is superior for most things I find myself needing to accomplish.

Eli Courtwright
Don't forget about generators/coroutines, which makes writing iterators (and simulations) a whole lot easier.
cdleary
+2  A: 

Apart from what Eli Courtwright said:

  • I find iterators in Python more concise. You can use for i in something, and it works with pretty much everything. Yeah, Java has gotten better since 1.5, but for example you can iterate through a string in python with this same construct.
  • Introspection: In python you can get at runtime information about an object or a module about its symbols, methods, or even its docstrings. You can also instantiate them dynamically. Java has some of this, but usually in Java it takes half a page of code to get an instance of a class, whereas in Python it is about 3 lines. And as far as I know the docstrings thing is not available in Java
Mario
Java also has introspection, but it's extraordinarily verbose. However, you can take a Java class and discover what methods it has or what annotations exist for its functions, etc. Just be prepared to write 20-30 lines of code to do what Python could do in 1-5 lines of code.
Eli Courtwright