Программирование на Python против программирования на Java - PullRequest
31 голосов
/ 15 марта 2010

Я пишу на Java последние пару лет, и теперь я начал писать на python (дополнительно).

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

Какие-нибудь советы о том, как избежать этого паттерна "Написание Java на Python"?

Спасибо!

Ответы [ 13 ]

24 голосов
/ 15 марта 2010

Вы можете подумать о погружении в парадигмы Python. Лучший способ - сначала узнать, что они из себя представляют, а затем изучить лучшие практики, прочитав некоторую литературу и просмотрев некоторые примеры кода. Я рекомендую Learning Python от Mark Lutz; отлично подходит для начинающих и продвинутых пользователей.

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

Как говорил мой учитель французского, «французский - это не просто английский с другими словами».

7 голосов
/ 15 марта 2010

Если вы новичок в Python и пришли из Java (или C #, или другого подобного языка статической типизации OO), эти классические статьи от PJ Eby и Ryan Tomayko необходимо прочитать:

6 голосов
/ 15 марта 2010

Вы можете начать с чтения Zen of Python . Это даст вам некоторое представление о том, как должен быть написан код Python, при условии, что вы достаточно понимаете язык, чтобы понять, о чем он говорит. : -)

5 голосов
/ 15 марта 2010

Вот некоторые основные отличия Python от языков, подобных C / Java:

  1. Список понятий.

  2. Поддержка функционального программирования.

  3. Использование некоторых Pythonic конструкций вместо аналогичных C-подобных конструкций, хотя обе, похоже, работают (понимание списка может быть частью этого, но есть и другие).

Есть и другие, но это основные, которые меня беспокоили, когда я впервые запустил Python (а я пришел с таких лет Java, как ты).

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

Для начала, Python предоставляет некоторые мощные функции, недоступные в C / Java, которые делают ваш код намного понятнее и проще (хотя это субъективно и, возможно, на первый взгляд может не выглядеть лучше для тех, кто пришел из Java). Первые два пункта попадают в эту категорию. Например, поддержка функций в качестве объектов и замыканий первого класса позволяет легко выполнять вещи, для которых потребуются все виды странной акробатики, с внутренними классами в Java.

Но главная причина в том, что Python является интерпретируемым языком, и некоторые конструкции на намного быстрее, чем эквивалентный C / Java-подобный код. Например, понимание списка обычно намного быстрее, чем эквивалентный цикл for, который выполняет итерации по индексам списка и обращается к каждому элементу по индексу. Это очень объективное преимущество, и, по-моему, большая часть «слишком медленного» мышления Python исходит из использования кода в стиле Java, встроенного в Python.

Один из лучших способов узнать код Python - это читать код других людей. Я действительно многому научился, глядя на код Python, размещенный в ответах на вопросы SO. Они часто сопровождаются объяснениями, и, как правило, очевидно, почему он лучше непитонического кода (скорость, четкость и т. Д.).

Edit:

Конечно, есть и другие способы получения чужого кода. Вы также можете скачать и просмотреть код любого хорошего проекта Python с открытым исходным кодом. Книги также являются хорошим источником, я бы рекомендовал O'Reilly Python Cookbook . В нем много полезных примеров кода и очень подробных объяснений.

4 голосов
/ 15 марта 2010

Если вы хотите увидеть какой-то довольно идиоматичный Python, который выполняет нетривиальные вещи, есть Dive Into Python , хотя Dive Into Python 3 новее и может быть лучшим источником советы по стилю Если вы хотите больше узнать о некоторых пунктах, есть код, похожий на Pythonista .

3 голосов
/ 15 марта 2010

Определенно, не панацея, но я думаю, что вы должны попробовать немного кода в Python. Очевидно, что никто не должен писать код IRL «в гольф», но поиск наиболее краткого способа выражения чего-либо действительно заставляет вас использовать встроенную функциональность языка.

3 голосов
/ 15 марта 2010

Вы можете опубликовать свой код на Измените мой код , чтобы увидеть, может ли кто-то показать вам более Pythonic способ сделать это.

2 голосов
/ 16 марта 2010

Кто-то предоставил мне этот список того, как "Python - это не Java" , когда я запустил Python после Java, и это было очень полезно.

Кроме того, проверьте этот похожий вопрос , который я недавно опубликовал, когда находился в аналогичной должности.

1 голос
/ 30 августа 2018

1) Python поддерживает многие (но не все) аспекты объектно-ориентированное программирование; но это можно написать программу на Python без используя любые концепции ОО.

1) Java поддерживает только объектно-ориентированные программирование.

2) Python предназначен для интерпретируемого использования. Заявление Python может быть введено на подсказка переводчика

(>>>)

, и будет выполнен немедленно. (Реализации делают некоторые использование автоматической компиляции в байт-коды (.pyc файлы).

2) Программы, написанные на Java, должны быть явно скомпилированы в байт-коды ( .class файлы ), хотя IDE может сделать это автоматически в путь, который является прозрачным для пользователя. Java делает не поддерживает прямое выполнение заявлений - хотя есть такие инструменты, как доктор Ява, которые поддержать это.

3) Python динамически набирается: • Переменная вводится путем присвоения значение для этого. Пример:

someVariable = 42

• Переменной, которой было присвоено значение данному типу позже может быть присвоено значение другого типа. Пример: * 1 023 *

someVariable = 42
someVariable = 'Hello, world'

3) Java - это

статически набранный

: • Переменная должна быть явно объявлена ​​как некоторого типа, прежде чем присваивать ему значение, хотя декларация и присвоение могут быть сделано в то же время. Примеры:

int someVariable;
int someVariable = 42;

• Переменная, объявленная как конкретному типу не может быть присвоено значение другого типа.

4) Python поддерживает следующие встроенные данные типы: Простые целые числа (обычно 32-битные целые числа в диапазон от -2147483648 до 2147483647). • Длинные целые числа (размер ограничен только памятью размер машины на ходу) • Booleans (Ложь и Истина). • Вещественные числа. • Сложные числа. Кроме того, Python поддерживает ряд типы, которые представляют коллекцию значений - включая строки, списки и словари.

4) Java имеет два типа данных: примитив типы и ссылочные типы. Java поддерживает следующие примитивные типы данных: • байт - 8-битные целые числа • короткие - 16-разрядные целые числа • int - 32-разрядные целые числа • long - 64-разрядные целые числа (Java также поддерживает класс java.math.BigInteger для представления целые числа, размер которых ограничен только объем памяти) • float - 32-битные действительные числа. • двойные - 32-битные действительные числа. • логическое - (ложно и верно). • char - один символ Кроме того, Java поддерживает массивы любого типа. в качестве ссылочных типов, а API включает класс String и большое количество классов используется для коллекций значений.

5)

Python ориентирован на строки:

операторы заканчиваются на конец строки, если разрыв строки не является явным сбежал с. Там нет возможности поставить больше чем одно утверждение в одной строке. Примеры: это заявление это еще одно утверждение это длинное утверждение, которое распространяется на более \ чем одна строка

5)

Statements in Java always end with a
semicolon (;)

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

6)

Комментарии Python начинаются с #

и распространяется на конец строки. Пример:

Это комментарий

Новое утверждение начинается здесь

6) У Java есть два вида комментариев. Комментарий начиная с // продлить до конца строка (как комментарии Python). Комментарии могут также начинаются с / * и заканчиваются * /. Эти может простираться на несколько строк или быть встроен в одну строку. Примеры:

// This is a comment
A new statement starts here
/* This is also a comment */
/* And this is also a comment, which is
 long enough to require several lines
 to say it. */

Заявление начинается / * комментарий * / затем продолжается

7) Строки Python могут быть заключены в один или двойные кавычки ('или "") . Персонаж представлен строкой длиной 1. Примеры:

'This is a string'
"This is also a string" # Equivalent
'c' # A string
"c" # An equivalent string

Python использует следующееоператоры для построение составных логических выражений:

and, or and not. Example:
not(x > 0 and y > 0) or z > 0

7) Строки Java должны быть заключены в двойные цитаты (""). Персонаж - это другой тип объект и заключен в одинарные кавычки ('). Примеры:

"This is a String"
'c' // A character, but not a String
Java uses the following operators for
constructing compound boolean expressions:
&&, ||, ! and ^ (meaning exclusive or)
Example:
! (x > 0 && y > 0) || z > 0 ^ w > 0

8) В Python операторы сравнения

(>, <,> =, <=, == и! =) Могут применяться к числам </p>

, строки и другие типы объектов), и сравнить значения некоторым подходящим способом (например, числовой порядок, лексический порядок), где это возможно.

8) В Java большинство операторов сравнения (>, <,> = и <=) могут применяться только к примитивные типы. Два (== и! =) Могут быть применяется к любому объекту, но применительно к ссылочные типы, которые они проверяют на одинаковые (разные) объект, а не одно и то же (другое) значение. </strong>

9) Не существует общепринятого Python соглашение для именования классов, переменных, функции и т. д.

9) По соглашению большинство имен в Java используют смешанные дело. Имена классов начинаются с заглавной буквы письмо; имена переменных и функций начинаются с строчная буква. Константы класса названы используя все заглавные буквы с подчеркиванием. Примеры: AClassName aVariableName aFunctionName () A_CLASS_CONSTANT

10) Python-операторы с определенным циклом имеют Форма для переменной в выражении: Пример:

for p in pixels:
 something

10) У Java есть два вида определенных циклов заявления. Один имеет форму

for (variable in collection) Example:
for (p in pixels)
 something;

11) Python использует встроенную функцию range () с для цикла по целому ряду. Примеры:

for i in range(1, 10)
 something
(i takes on values 1, 2, 3, 4, 5, 6, 7, 8, 9)
for i in range(1, 10, 2)
 something
(i takes on values 1, 3, 5, 7, 9)

11) Java использует другую форму цикла for по целому ряду целых чисел. Примеры:

for (int i = 1; i < 10; i ++)
 something;
(i takes on values 1, 2, 3, 4, 5, 6, 7, 8, 9)
for (int i = 1; i < 10; i += 2)
 something;
(i takes on values 1, 3, 5, 7, 9)

12) Условные операторы Python имеют вид если условие: а необязательная часть else имеет Форма еще: Форма elif условие: есть разрешено в качестве альтернативы другому: сразу же после, если. Примеры:

if x < 0:
 something
if x < 0:
 something
else:
 something different
if x < 0:
 something
elif x > 0:
 something different
else:
 yet another thing

12) Условные операторы Java имеют вид if (условие) и необязательная часть else имеет форма еще (без двоеточия) нет элиф форма - иначе, если используется напрямую. Примеры:

if (x < 0)
 something;
if (x < 0)
 something;
else
 something different;
if (x < 0)
 something;
else if (x > 0)
 something different;
else
 yet another thing;

13) Объем Python условный или циклический Заявление обозначается отступом. (Если несколько строк должны быть включены, забота должна быть имел обыкновение быть уверенным, что каждая строка имеет отступ одинаково). Примеры:

if x < 0:
 do something
do another thing regardless of the value of x
if x < 0:
 do something
 do something else
 do yet a third thing
do another thing regardless of the value of x

13) Область Java условного или зацикливания Утверждение обычно просто следующее утверждение. Отступ игнорируется компилятором (хотя стилистически это все еще очень желательно для блага читателя). Если несколько строк должны быть включены, объем должен быть ограничен фигурными скобками ({,}). (При желании их можно использовать, даже если область видимости - одна строка.) Примеры:

if (x < 0)
 do something;
do another thing regardless of the value of x;
if (x < 0)
do something; // Bad style-don't do this!
do another thing regardless of the value of x;
if (x < 0)
{
 do something;
 do something else;
 do yet a third thing;
}
do another thing regardless of the value of x;
if (x < 0)
{
 do something;
}
do another thing regardless of the value of x;
1 голос
/ 22 марта 2010

Попробуйте найти алгоритмы, которые вы хорошо понимаете, и посмотрите, как они реализованы в стандартных библиотеках python.

Упорство. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...