Три месяца назад я сменил работу и переключился с Java на Python. Вот различия, которые выделялись для меня с момента переключения.
Ранее я немного работал в Ruby, но у меня не было опыта работы с Python. Я подготовился, читая книгу Quick Python . Однако, если вы читаете книгу или пробуете ее, написав какой-то код, это не то же самое, что работать в ней каждый день. Кодовая база, с которой вы работаете, намного больше, чем некоторые небольшие примеры, которые вы делаете сами, и большая часть кода, с которым вы сталкиваетесь, написана кем-то другим. Только когда вы погружаетесь в новый язык и кодовую базу, вы изучаете «по-настоящему», каково это работать на этом языке. Вот вещи, хорошие и плохие, которые я заметил больше всего.
Хороший
Кортежи. Кортеж — это просто группа элементов, которые могут быть одного или разных типов (например, структура в C). Например, 3-элементный кортеж, описывающий книгу, может быть (title, author, number_of_pages) . Они соответствуют тому, как я естественно думаю о данных, и я нахожу их полезными все время.
Возврат нескольких значений. В Python функция или метод могут возвращать несколько значений, легко возвращая кортеж. Комбинируя это с распаковкой кортежей, вы можете написать такой код:
max, min, avg = summarize(source)
Это тоже очень естественно и полезно. В Java я иногда создавал простые классы результатов (просто контейнеры для разных переменных) и возвращал их, когда мне нужно было вернуть несколько значений. Но это потребовало некоторых усилий, а это означало, что я не использовал его так, как мне бы хотелось. В Python, где это очень просто, я обнаружил, что много возвращаю несколько значений.
Функции в качестве аргументов. В Python функции и методы являются объектами первого класса. Это означает, например, что они могут быть переданы в качестве аргументов другим функциям и методам. На мой взгляд, это намного чище и проще, чем способ Java с интерфейсами (часто в сочетании с безобразными анонимными реализациями). Быть первоклассными объектами означает, что они также могут быть возвращены как результат функций, но до сих пор я не использовал это.
Автономные функции. В Python вы можете определять функции, которые стоят сами по себе, в отличие от Java, где они всегда должны принадлежать классу. В Java я часто использовал статические методы для «функциональных» задач (функций, которые не требуют какого-либо состояния, но вместо этого зависели только от переданных аргументов). В Python удобнее создавать их как свободные функции, не подключая их к классу.
Компактный код. Код, который я пишу на Python, выглядит более компактным (меньше строк), чем соответствующий код на Java. Отчасти это связано с тем, что существует множество операций, которые естественным образом выражаются в виде создания и преобразования списков (которые Python имеет большую поддержку), отчасти потому, что в Python почти нет стандартного кода, а отчасти это связано с использованием отступа вместо фигурных скобок для разграничения блоков.
Шансы и конец . Есть несколько других особенностей, которые были приятными сюрпризами, например, именованные аргументы и аргументы по умолчанию, встроенная функция перечисления , гибкое цитирование строки (двойная кавычка или одинарная кавычка, что позволяет очень легко написать строку, содержащую кавычки — просто окружите строку другими кавычками другого типа). Я также узнал, что вы можете использовать оператор import внутри функции, чтобы сделать зависимость локальной для функции.
Плохой
Нет статических типов (1). Самый большой недостаток для меня — отсутствие информации о типе при чтении кода. В Java, когда я увидел новую функцию и попытался понять, что она делает, я почти всегда смотрел на типы аргументов и возвращаемое значение, чтобы понять, что она делает. В Python это намного сложнее. Требуется намного больше копания, чтобы выяснить, что функция делает в Python. На ум приходит цитата Линуса Торвальдса о важности структур данных . Дело не в том, что структур данных нет, просто в том, что их сложнее увидеть в Python, чем в Java.
Нет статических типов (2). Другим следствием динамической типизации в Python является то, что функция «найти использование» в IDE не так полезна. Я использую PyCharm для Python и использовал IntelliJ IDEA для Java. В Java я много использовал «найти использование», чтобы выяснить, откуда вызывается метод, где используется класс и т. Д. В PyCharm точность (естественно) хуже — часто есть много ложных срабатываний для использования, кроме имени функции уникальны. Таким образом, это в основном возвращается к grep: основанию кода для данной строки (как в мои дни C ++).
решение суда
Так что лучше? Для меня это не важный вопрос. Я не Java-программист или Python-программист. Я программист, точка. Есть различия, но Python и Java имеют больше общего, чем то, что отличает их. По сути, программирование заключается в том, чтобы решить проблему, а затем использовать элементарные операции, условия и итерации для ее решения. Механика может отличаться, но ядро то же самое.
Это интересно изучать и использовать новый язык. Интересно сравнить его с другими языками. Тогда вы можете использовать его сильные стороны и обойти его слабые стороны. В конце концов, программирование — это программирование, независимо от языка. Я был счастлив программировать на Java, и я счастлив программировать на Python. Но в основном я просто счастлив программировать .