Я - программист Java, но теперь ввод "области Python" для некоторого материала, на который Python работает лучше. Я совершенно уверен, что хорошая часть моего кода выглядела бы странной для Python программиста (например, круглая скобка использования на каждом если).
Я знаю, что каждый язык имеет свои собственные конвенции и набор "привычек". Так, с точки зрения удобочитаемости, что такое конвенции и методы, который является "способом пойти" в Java, но не действительно "pythonic путь", чтобы сделать материал?
На этот вопрос нет простого ответа. Требуется время, чтобы ваш код стал "питоническим" . Не пытайтесь воссоздать идиомы Java в Python. Просто потребуется время, чтобы изучить идиомы Python.
Взгляните на Code Like a Pythonista: Idiomatic Python , Руководство по стилю для кода Python и Python для программистов на Java (в архиве) .
Джейкоб Халлен однажды заметил, что лучший стиль Python следует за отказом Туфте украшения (хотя область Туфте - не языки программирования, а визуальное отображение информации): don ' • тратить «чернила» (пиксели) или «бумагу» (пространство) на простое украшение.
Из этого принципа следует многое: без лишних скобок, без точек с запятой, без глупых «блоков ascii» в комментариях и строках документации, без лишнего места для «выравнивания» элементов в разных строках, одинарные кавычки, если вам специально не нужны двойные кавычки, нет \ для продолжения строк, кроме случаев, когда они обязательны, никаких комментариев, которые просто напоминают читателю о правилах языка (если читатель все равно не знает язык, у вас проблемы ;-) и т. д.
Я должен отметить, что некоторые из этих последствий «духа Tufte Python» более спорны, чем другие, в сообществе Python. Но язык очень хорошо уважает "Дух Туфте" ...
Переход к «более спорным» (но санкционированным Дзеном Python - импортируйте это
в подсказке интерпретатора): «плоский лучше, чем вложенный», поэтому «уходите, как только станет разумным» а не вложение. Позвольте мне объяснить:
if foo:
return bar
else:
baz = fie(fum)
return baz + blab
это не ужасно, но и не оптимально: поскольку «return» «выходит», вы можете сохранить вложенность:
if foo:
return bar
baz = fie(fum)
return baz + blab
Более точный пример:
for item in container:
if interesting(item):
dothis(item)
dothat(item)
theother(item)
что большой блок является двойная вложенность - это не изящно ... рассмотрите более плоский стиль:
for item in container:
if not interesting(item):
continue
dothis(item)
dothat(item)
theother(item)
BTW, а также отступление, которое не является специфическим для Python - одна из моих любимых мозолей (на любом языке, но в Python Tufte's Spirit меня поддерживает; -):
if not something:
this()
that()
theother()
else:
blih()
bluh()
blah()
"if not ... else" искажено ! Поменяйте местами две половинки и потеряйте не
:
if something:
blih()
bluh()
blah()
else:
this()
that()
theother()
Кроме того, некоторые предыдущие вопросы о stackoverflow:
Лучше всего начать с PEP-8, который является официальным руководством по стилю Python. Оно охватывает многие основы того, что считается стандартным.
«Все является классом» - это идиома Java, которая не является идиомой Python. (Почти) все может быть классом в Python, и если вам так удобнее, сделайте это, но Python этого не требует. Python не является чисто объектно-ориентированным языком, и по моему (ограниченному) опыту хорошо принять это близко к сердцу.
Синтаксис - это только верхушка айсберга. Существует ряд различных языковых конструкций, о которых Java-программисты должны знать, например Python не нужно использовать интерфейс
Создание интерфейса и заменяемых реализаций в Python - Stack Overflow
Другая действительно полезная идиома - все, что можно преобразовать в логическое значение с интуитивно понятным значением в Python. Например, чтобы проверить наличие пустого массива, вы просто выполняете
if not my_array:
return
...process my_array...
Первое условие эквивалентно
if ((my_array == null) || (my_array.length == 0)) {
return
}
в Java. Это находка для Python. Он не только более краток, но и позволяет избежать ловушки Java, когда многие люди не проверяют оба условия последовательно. В результате предотвращается бесчисленное количество исключений NullPointerException.