Java → Python?

Помимо динамической природы Python (и синтаксиса), каковы некоторые из основных особенностей языка Python, которые Java не имеет, и наоборот?

Ответ 1

  • Сопоставление списков. Я часто нахожу себя фильтрацией/отображением списков, и возможность сказать [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 - хороший пример. Автобоксинг помогает, хотя это делает вещи неудобными, когда что-то оказывается нулевым.

  • Свойства. Python позволяет создавать классы с полями только для чтения, лениво генерируемыми полями, а также поля, которые проверяются при назначении, чтобы убедиться, что они никогда не равны 0 или null или что вы хотите защитить от и т.д. '

  • По умолчанию и аргументы ключевого слова. В Java, если вы хотите, чтобы конструктор мог принимать до 5 необязательных аргументов, вы должны определить 6 разных версий этого конструктора. И нет никакого способа сказать Student(name="Eli", age=25)

  • Функции могут возвращать только 1 вещь. В Python у вас есть назначение кортежа, поэтому вы можете сказать spam, eggs = nee(), но в Java вам нужно либо прибегнуть к изменяемым параметрам, либо иметь собственный класс с двумя полями, а затем вывести две дополнительные строки кода для извлечения этих полей.

  • Встроенный синтаксис для списков и словарей.

  • Перегрузка оператора.

  • Как правило, лучше разработаны библиотеки. Например, для анализа XML-документа на Java, вы говорите, что Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("test.xml");
    и в Python вы говорите
    doc = parse("test.xml")

В любом случае, я мог бы продолжать и продолжать с другими примерами, но Python - это всего лишь более гибкий и выразительный язык. Это также динамически типизировано, что мне действительно нравится, но которое имеет некоторые недостатки.

Java имеет гораздо лучшую производительность, чем Python, и имеет лучшую поддержку инструмента. Иногда эти вещи имеют большое значение, а Java - лучший язык, чем Python для задачи; Я продолжаю использовать Java для некоторых новых проектов, несмотря на то, что мне нравится Python намного больше. Но, как я думаю, Python превосходит большинство вещей, которые мне нужно выполнить.

Ответ 2

Я думаю, что эта пара статей Филиппа Дж. Эби отлично справляется с обсуждением различий между двумя языками (в основном о философии/менталитете, а не о конкретных языковых возможностях).

Ответ 3

Одним из ключевых различий в Python является значимый пробел. Это откладывает много людей - я тоже надолго - но как только вы начинаете, это кажется естественным и имеет гораздо больше смысла, чем ; везде.

В личной перспективе Python обладает следующими преимуществами по сравнению с Java:

Кроме того, эта страница в Python Wiki - это хорошее место для поиска с большим количеством ссылок на интересные статьи.

Ответ 4

С Jython вы можете иметь оба. Это только на Python 2.2, но все же очень полезно, если вам нужен встроенный интерпретатор, имеющий доступ к среде выполнения Java.

Ответ 5

Кроме того, что сказал Эли Кортэйт:

  • Я считаю, что итераторы в Python более сжатые. Вы можете использовать для меня что-то, и оно работает почти во всем. Да, Java улучшился с 1,5, но, к примеру, вы можете перебирать строку в python с этой же конструкцией.
  • Introspection: в python вы можете получить информацию о времени выполнения объекта или модуля о его символах, методах или даже своих докстронгах. Вы также можете создавать их динамически. В Java есть часть этого, но обычно в Java требуется половина страницы кода, чтобы получить экземпляр класса, тогда как в Python это около 3 строк. И насколько я знаю, докстопы не доступны в Java