Предыстория: я пробежал несколько уроков и написал несколько небольших проектов. Все идет хорошо, используя Google и StackOverflow .
Несколько раз за последние несколько дней я задавался вопросом: «Что мне не хватает?» - Я чувствую, что все еще думаю о Java, как я пишу на Python.
Этот вопрос в StackOverflow полон советов о том, какие ресурсы нужно прочитать для изучения Python, но я все еще чувствую, что я являюсь разработчиком Java со словарем (без каламбура) для перевода на Python.
Что я действительно хочу сделать, так это реорганизовать мою голову, чтобы иметь возможность писать Pythonic Python вместо Java, замаскированный под Python, без потери моих навыков Java.
Итак, суть моего вопроса заключается в следующем: какие концепции действительно нужно научить Java-разработчику думать Pythonic? Это включает в себя все, что нужно отучить.
Примечание: я спрашиваю о понятиях языка, а не о синтаксисе языка.
Ответы:
Несколько моментов в дополнение к тому, что уже было сказано:
Python динамический. Создание класса является исполняемым оператором , как и импорт модуля; это можно сделать условным. Класс может быть изменен после создания; это позволяет легко метапрограммировать и АОП.
Там нет интерфейсов; правила печати утки. Если они вам крайне необходимы, существуют «абстрактные базовые классы (ABC)», но обычно вы не пропускаете интерфейсы, поскольку в любом случае нет статической проверки типов.
Хотя все является объектом, функции предшествуют объектам. Наличие только функций (и никаких классов) в модуле прекрасно.
Все первоклассное юридическое лицо. Передача функций в качестве параметров, их возврат и присвоение переменным является нормой. То же самое для занятий. Методы - это просто функции; вы можете обрабатывать метод экземпляра, как если бы он был обычной функцией, передавать его и т. д.
Используйте встроенные подсказки, наборы, списки и кортежи. Списки и сообщения изменчивы, а кортежи - нет. Все они очень эффективны и синтаксически лаконичны. Привыкайте возвращать несколько значений из функции с помощью кортежа (вам даже не нужны скобки). Привыкайте заменять сложные иерархии очень простых объектов хитроумными конструкциями из простых списков, кортежей и словосочетаний («хеш-таблиц»), это упрощает жизнь.
Python имеет достаточную поддержку FP; изучите списки, а затем итераторы и генераторы. Это очень помогает.
Любые операторы могут быть перегружены путем определения правильных методов, поэтому сложение или сравнение могут вернуть все, что вы захотите. Помните об этом, работая с такими вещами, как SQLAlchemy.
Там нет нуля, только None, полноценный объект. Вы можете напечатать None просто отлично и т. Д. Передача None, когда ожидается другой экземпляр, обычно приводит к ошибке AttributeError, а не NPE, иногда дальше по конвейеру выполнения.
Из-за полностью динамической природы Python у вас практически нет статических проверок . Вы можете ссылаться на имя, которое никогда не существует в вашей программе (например, опечатка) или определено только в определенном пути выполнения, и ничто не будет напоминать вам об этом, пока выполнение не достигнет этой ссылки и не произойдет ошибка NameError. Будьте осторожны с областью действия ваших переменных и пишите больше модульных тестов.
Из-за полностью динамической природы Python объекты почти всегда податливы. Обычно вы можете добавлять поля и методы даже к экземпляру и, таким образом, непреднамеренно удалять или перезаписывать его состояние или набор методов. Будьте осторожны при назначении атрибутов. Это также дает интересные возможности :)
Здесь нет символических констант , только переменные. Убедитесь, что вы случайно не перезаписали «константу». Если вы хотите быть уверены, что не можете перезаписать константу, используйте функцию или свойство (которое является скрытой функцией).
Потоки Python хороши для обработки ввода-вывода, но не для процессора. Не пытайтесь ускорить вычислительную задачу, запустив ее в параллельных потоках.
источник
None
обычно вызываетAttributeError
(но не имеет значения, обычно это вам не нужно), и вы можете (и в некоторых случаях должны) писать неизменяемые объекты (например, черезnamedtuple
).Прочитайте эту статью: Python не является Java . (Кроме того, стоит прочитать большинство других статей на боковой панели, хотя и не связанных с Java.) В статье приводятся некоторые полезные советы о том, как Java-программисты могут непреднамеренно неправильно использовать Python (и как этого не делать).
источник
Я перешел с Java на Python, и одной из самых полезных вещей, которые я нашел, была возможность тестировать код из интерпретатора командной строки. Введите python в командную строку и запускайте свой код оттуда, пока вы не сделаете все правильно.
Фреймворки также были немного менее определены в Python. Есть десятки веб-фреймов, только для начинающих. Django более или менее заменяет Spring и SQL Alchemy для Hibernate.
источник
Одна важная вещь должна была бы понять динамическую типизацию; Другое дело, что объекты изменчивы и общедоступны. Менее важным, по крайней мере на начальном этапе, является привязка имен к переменным.
Здесь myjobtitle и значение job.title указывают на один и тот же объект. Атрибуту класса job.startDate сначала присваивается строка, а затем объект времени. И через все это, экземпляр задания и даже сам класс могут быть изменены динамически.
источник
Вы также можете посмотреть на Jython . Он может поддерживать только Python 2.5, но мы находим его действительно мощным, чтобы иметь возможность быстро создавать прототипы с помощью Python, а затем переписывать на Java позже, если это необходимо.
Основываясь на моем ответе на Что я должен думать при переходе с Python на Java? поскольку этот вопрос теперь закрыт как дубликат этого!
источник