Разработка на Java Python: какие концепции мне нужны, чтобы обернуть голову?

38

Предыстория: я пробежал несколько уроков и написал несколько небольших проектов. Все идет хорошо, используя Google и StackOverflow .

Несколько раз за последние несколько дней я задавался вопросом: «Что мне не хватает?» - Я чувствую, что все еще думаю о Java, как я пишу на Python.

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

Что я действительно хочу сделать, так это реорганизовать мою голову, чтобы иметь возможность писать Pythonic Python вместо Java, замаскированный под Python, без потери моих навыков Java.

Итак, суть моего вопроса заключается в следующем: какие концепции действительно нужно научить Java-разработчику думать Pythonic? Это включает в себя все, что нужно отучить.

Примечание: я спрашиваю о понятиях языка, а не о синтаксисе языка.

ЖРД
источник
9
Отпустите мысль, что программирование должно быть сложным.
Работа

Ответы:

40

Несколько моментов в дополнение к тому, что уже было сказано:

  • Python динамический. Создание класса является исполняемым оператором , как и импорт модуля; это можно сделать условным. Класс может быть изменен после создания; это позволяет легко метапрограммировать и АОП.

  • Там нет интерфейсов; правила печати утки. Если они вам крайне необходимы, существуют «абстрактные базовые классы (ABC)», но обычно вы не пропускаете интерфейсы, поскольку в любом случае нет статической проверки типов.

  • Хотя все является объектом, функции предшествуют объектам. Наличие только функций (и никаких классов) в модуле прекрасно.

  • Все первоклассное юридическое лицо. Передача функций в качестве параметров, их возврат и присвоение переменным является нормой. То же самое для занятий. Методы - это просто функции; вы можете обрабатывать метод экземпляра, как если бы он был обычной функцией, передавать его и т. д.

  • Используйте встроенные подсказки, наборы, списки и кортежи. Списки и сообщения изменчивы, а кортежи - нет. Все они очень эффективны и синтаксически лаконичны. Привыкайте возвращать несколько значений из функции с помощью кортежа (вам даже не нужны скобки). Привыкайте заменять сложные иерархии очень простых объектов хитроумными конструкциями из простых списков, кортежей и словосочетаний («хеш-таблиц»), это упрощает жизнь.

  • Python имеет достаточную поддержку FP; изучите списки, а затем итераторы и генераторы. Это очень помогает.

  • Любые операторы могут быть перегружены путем определения правильных методов, поэтому сложение или сравнение могут вернуть все, что вы захотите. Помните об этом, работая с такими вещами, как SQLAlchemy.

  • Там нет нуля, только None, полноценный объект. Вы можете напечатать None просто отлично и т. Д. Передача None, когда ожидается другой экземпляр, обычно приводит к ошибке AttributeError, а не NPE, иногда дальше по конвейеру выполнения.

  • Из-за полностью динамической природы Python у вас практически нет статических проверок . Вы можете ссылаться на имя, которое никогда не существует в вашей программе (например, опечатка) или определено только в определенном пути выполнения, и ничто не будет напоминать вам об этом, пока выполнение не достигнет этой ссылки и не произойдет ошибка NameError. Будьте осторожны с областью действия ваших переменных и пишите больше модульных тестов.

  • Из-за полностью динамической природы Python объекты почти всегда податливы. Обычно вы можете добавлять поля и методы даже к экземпляру и, таким образом, непреднамеренно удалять или перезаписывать его состояние или набор методов. Будьте осторожны при назначении атрибутов. Это также дает интересные возможности :)

  • Здесь нет символических констант , только переменные. Убедитесь, что вы случайно не перезаписали «константу». Если вы хотите быть уверены, что не можете перезаписать константу, используйте функцию или свойство (которое является скрытой функцией).

  • Потоки Python хороши для обработки ввода-вывода, но не для процессора. Не пытайтесь ускорить вычислительную задачу, запустив ее в параллельных потоках.

9000
источник
+1 очень хорошие очки. Проницательность: Noneобычно вызывает AttributeError(но не имеет значения, обычно это вам не нужно), и вы можете (и в некоторых случаях должны) писать неизменяемые объекты (например, через namedtuple).
@danlan: спасибо, я исправил текст :) Да, вы можете создавать неизменяемые объекты. Но объекты, которые вы обычно создаете, создавая обычный класс, а затем его экземпляры, очень изменчивы, если не предпринять ряд специальных мер. Тот факт, что назначение неопределенного атрибута экземпляра обычно определяет его молча, а не вызывает ошибку, может удивить программиста на Java.
9000
1
Python (и другие языки FP) заменяет более детальную сборку кода на более простые строительные блоки компактной сборкой кода на более сложные строительные блоки. Подумайте, RISC против CISC процессоров.
Пол
1
Я бы добавил наборы в структуры данных.
Сакиск
2
Прошло чуть более 3 лет с тех пор, как я задал этот вопрос. Я должен сказать, что этот совет выдержал очень хорошо.
LRE
14

Прочитайте эту статью: Python не является Java . (Кроме того, стоит прочитать большинство других статей на боковой панели, хотя и не связанных с Java.) В статье приводятся некоторые полезные советы о том, как Java-программисты могут непреднамеренно неправильно использовать Python (и как этого не делать).

Циклоп
источник
6
«XML - это не ответ». - это выходит далеко за рамки Java v Python ;-)
LRE
3

Я перешел с Java на Python, и одной из самых полезных вещей, которые я нашел, была возможность тестировать код из интерпретатора командной строки. Введите python в командную строку и запускайте свой код оттуда, пока вы не сделаете все правильно.

Фреймворки также были немного менее определены в Python. Есть десятки веб-фреймов, только для начинающих. Django более или менее заменяет Spring и SQL Alchemy для Hibernate.

Bassdread
источник
2

Одна важная вещь должна была бы понять динамическую типизацию; Другое дело, что объекты изменчивы и общедоступны. Менее важным, по крайней мере на начальном этапе, является привязка имен к переменным.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

Здесь myjobtitle и значение job.title указывают на один и тот же объект. Атрибуту класса job.startDate сначала присваивается строка, а затем объект времени. И через все это, экземпляр задания и даже сам класс могут быть изменены динамически.

Arcege
источник
1

Вы также можете посмотреть на Jython . Он может поддерживать только Python 2.5, но мы находим его действительно мощным, чтобы иметь возможность быстро создавать прототипы с помощью Python, а затем переписывать на Java позже, если это необходимо.

Основываясь на моем ответе на Что я должен думать при переходе с Python на Java? поскольку этот вопрос теперь закрыт как дубликат этого!

Марк Бут
источник