> других языков с такими приятными конструкциями и столь не перегруженным синтакисом я не знаюОх... Вот что я навспоминал только навскидку:
"Приятные" конструкции:
* Тернарный оператор, непохожий на свои аналоги в других языках:
x = a if True else b
вместо обычного порядка типа
x = True ? a : b
или
x = if True then a else b
* Оператор if не возвращает значение, в отличие от Ruby и Scala. Собственно, если бы возвращал - не пришлось бы городить вышеоупомянутый экзотический тернарный оператор.
* Вообще нету оператора switch, тем более возвращающего значение.
* Оператор while может иметь ветвь else. Ну, чтоб читающие код не расслаблялись, а пошевелили немного извилиной на предмет "что за фигня?"
* Упор в языке на list/dict comprehension. Для простых выражений - замечательная вещь, но когда нужна вложенность, лучше не использовать, ФП-подход в других языках выглядит гораздо читабельнее.
* Очень слабая поддержка ФП. Cлабые lambda, map, filter и reduce (и назван не fold). Отсутствуют flatMap, Option/Optional/Maybe, Either, pattern matching with deconstruction.
"Неперегруженный" синтаксис:
* Регулярные выражения в стандартной библиотеке, а не в синтаксисе языка, как в Perl и Ruby. В результате надо писать re.search("\\d", s) вместо s =~ /\d/. А если надо сматчить сабгруппы - синтаксис становится ещё тяжелее, никаких тебе $1 после выражения. re.sub() по умолчанию работает как gsub() в других языках. re.gsub() вообще нету. Ну, надо же быть максимально непохожим на другие языки, чтобы программист всё время путался, переходя между языками.
* В куче мест нужно писать self. Особенно напрягает обязательность его как первого аргумента метода класса. Надо писать либо self, либо @staticmethod/@classmethod. Вот уж где "explicit is better than implicit", доведённый до маразма. Ни в одном языке такого нет. И не забудьте этот же self добавлять при вызове методов! Особенно "удобно" коллекцию свободных функций собирать в класс и добавлять "self." в начало их вызова, да ещё без проверки в compile time.
* После условий в if и while, после for, после описания класса или функции, перед переводом строки - надо ставить двоеточие в конце строки, перед телом цикла, функции или класса. Зачем??? Синтаксис языка и так зависит от whitespace и переводов строки! Убрали же необходимость точки с запятой в конце строк!
* Нету неявного return в конце функции, как, например в Ruby, Scala, Lisp, Haskell, etc. Соответственно надо писать
def sum(a, b):
return a + b
вместо
def sum(a, b)
a + b
или
def sum(a, b) = a + b
А если эта функция ещё и член класса - придётся добавить self/@staticmethod/@classmethod.