Java-розробник, що вивчає Python: які поняття мені потрібно обернути головою?


38

Передумови: Я пройшов кілька навчальних посібників і написав кілька невеликих проектів. Все працює досить добре за допомогою Google та StackOverflow .

Кілька разів за останні кілька днів я замислювався над питанням: "чого я пропускаю?" - Я відчуваю, що все ще думаю на Java, коли пишу в Python.

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

Те, що я дійсно хочу зробити, - це рефактор моєї голови, щоб я міг написати Pythonic Python замість Java, замаскованої як Python, не втрачаючи також своїх навичок Java.

Отже, суть мого питання полягає в тому: які поняття справді потрібно розробнику Java, щоб навчитися мислити пітонічно? Сюди входить все, що потрібно навчитись.

Примітка: я запитую про мовні поняття, а не про синтаксис мови.


9
Відпустіть думку про те, що програмування повинно бути важким.
Робота

Відповіді:


40

Крім того, що вже було сказано:

  • Пітон динамічний. Створення класу - це виконуваний оператор , як і імпорт модуля; це можна зробити умовним. Клас можна змінити після створення; це дозволяє легко метапрограмування та AOP.

  • Там немає ні одного інтерфейсу; правила набору качки. Якщо вони вам відчайдушно потрібні, є "абстрактні базові класи (ABC)", але інтерфейси, як правило, не пропускаєте, оскільки статичного типу перевірка все одно не проходить.

  • Хоча все є об'єктом, функції стають перед об'єктами. Маючи в модулі просто функції (а не класи), це прекрасно.

  • Все - це першокласна сутність. Передача функцій як параметрів, повернення їх і присвоєння змінним є нормою. Дітто для занять. Методи - це лише функції; ви можете обробити метод екземпляра так, ніби це була звичайна функція, передайте її навколо і т.д.

  • Використовуйте вбудовані дикти, набори, списки та кортежі. Списки та дикти змінюються, кортежі - ні. Усі вони дуже ефективні та синтаксично стислі. Звикайте повертати кілька значень з функції за допомогою кортежу (вам навіть не потрібні дужки). Звикнути до заміни складних ієрархій дуже простих об'єктів на вилучення з простих списків, кортежів і диктів ("хештелів"), це спрощує життя.

  • Python має неабияку підтримку FP; вивчити розуміння списку, а потім ітератори та генератори. Вони дуже допомагають.

  • Будь-які оператори можуть бути перевантажені шляхом визначення правильних методів, тому додавання або порівняння може повернути все, що завгодно. Запам’ятайте це, працюючи з такими речами, як SQLAlchemy.

  • Немає нуля, лише None, повноцінний об’єкт. Ви можете надрукувати None просто чудово і т. Д. Передача None, коли очікується, що інший примірник призводить зазвичай до AttributeError, а не NPE, іноді далі вниз по конвеєру виконання.

  • Через повністю динамічний характер Python у вас майже немає статичних перевірок . Ви можете посилатися на ім'я, яке ніколи не існує у вашій програмі (наприклад, помилка друку), або лише визначається в певному шляху виконання, і нічого не буде нагадувати вам про це, поки виконання фактично не потрапить на цю посилання і не буде піднято NameError. Будьте обережні з обсягом змінних і пишіть більше одиничних тестів.

  • Завдяки повністю динамічному природі Python, об'єкти майже завжди є ковкими. Зазвичай ви можете додати поля та методи навіть до екземпляра і таким чином ненавмисно видалити або перезаписати його стан або набір методів. Будьте уважні при призначенні атрибутів. Це дозволяє і цікаві можливості :)

  • Там немає жодного символьних констант , тільки змінних. Переконайтеся, що ви ненавмисно не перезаписали "константу". Якщо ви хочете бути впевнені, що ви не можете перезаписати константу, використовуйте функцію або властивість (що є функцією в маскуванні).

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


+1 дуже хороші бали. Нітпікінг: Noneзазвичай викликає AttributeError(але це не має значення, зазвичай це вам взагалі не потрібно), і ви можете (а в деяких випадках повинні) писати незмінні об'єкти (наприклад, наскрізь namedtuple).

@danlan: спасибі, я виправив текст :) Так, ви можете створювати незмінні об’єкти. Але об'єкти, які ви зазвичай створюєте, створюючи звичайний клас, а потім його екземпляри, є дуже змінними, якщо не вживати низки спеціальних заходів. Той факт, що присвоєння невизначеному атрибуту екземпляра зазвичай мовчки визначає його, а не викликає помилку, може стати несподіванкою для програміста Java.
9000

1
Python (та інші мови FP) замінює більш багатослівну побудову коду з більш простих будівельних блоків на компактну побудову коду на більш складні будівельні блоки. Подумайте про процесори RISC проти CISC.
Павло

1
Я б додав набори до структур даних.
sakisk

2
Трохи більше 3 років, як я задав це питання. Треба сказати, що ця порада витримала дуже добре.
LRE

14

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


6
"XML - це не відповідь." - це виходить за рамки Java v Python ;-)
LRE

3

Я перейшов з Java на Python, і одна з найкорисніших речей, яку я знайшла, - це тестування коду з інтерпретатора командного рядка. Введіть python в командний рядок і запустіть свій код звідти, поки ви не знайдете його правильно.

Рамки також були трохи менш визначені в Python. Існує 10-ти веб-кадрів, які працюють лише для початку. Django більш-менш замінює Spring та SQL Alchemy для сплячого режиму.


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

Тут міоббіт і значення job.title вказують на один і той же об'єкт. Атрибуту class job.startDate спочатку було призначено рядок, потім об'єкт часу. І через все це, екземпляр завдання та навіть сам клас можна було б змінити динамічно.


1

Ви також можете поглянути на Jython . Він може підтримувати лише Python 2.5, але ми вважаємо, що це дуже потужно, щоб можна було швидше прототипувати з Python, а потім, якщо потрібно, перезаписувати на Java.

Виходячи з моєї відповіді на те, про що я повинен думати при переході з Python на Java? оскільки це питання закрито як дублікат цього!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.