* Что есть такое *синтаксический сахар* применительно к языкам программирования?
То же что и сахар применительно к чаю: пользы никакой, но чаёвничать куда как приятнее.
=
=
=
* Вообще, учитывая объектную сущность Python, почти весь его синтаксис - это один большой кусок сахара, сахарная голова одним словом.
Так, например, запись
x = 1
на самом деле означает x = int(1)
. А уж если завести разговор о классах, так к чему не прикоснись руки липнут. А что вы хотите, язык стратосферновысокого уровня

>>> class foo(object):
... pass
...
>>> bar1 = foo()
>>> bar1
<__main__.foo object at 0x1710aa0>
>>> bar = foo.__new__(foo, 'bar', (), {})
>>> bar
<__main__.foo object at 0x1710a90>
>>>
О, сахарок-то как сластит!
=
=
=
* Я же сейчас хочу обратить внимание на такую *сладость*, как list comprehensions, списковые включения(встраивания).
Они наглым образом маскируются под старые добрые списки, синтаксисом напоминают цикл for, а всё вместе это утирает нос (за некоторыми исключениями) функции map.
Сначала разберемся почему это *сахар*:
lst = [lst for lst in xrange(30) if lst%2 if lst%3 if lst%4 if lst%5]
lst = [lst for lst in xrange(30) if lst%2 and lst%3 and lst%4 and lst%5]
В Python любой объект имеет логическое значение, и список в том числе. Также любое выражение имеет булево значение. Выражение состоит из объектов и логических операторов. Других операторов, точнее инструкций, выражение содержать не может, ибо инструкции не имеют логического значения. Поэтому по-хорошему инструкция *for* в квадратных скобках выглядит как нонсенс. Также как и *if*. Но нонсенс удобочитаемый и быстрый. Потому это *сахар*.
Он не делает язык вкуснее, мощнее, но делает его слаще и приятнее для использования.
=
А ещё списковые включения это абстракция. А любая абстракции течёт (c) Joel Spolsky (эх, не соврать бы с именем).
В данном случае эту течь я устранил тем, что назначил переменной цикла то же имя, что и имя конструируемого списка *lst*. Точнее сначала эта переменная используется для итерации, а по завершении вычисления в неё помещается ссылка на новорожденный список.
Иначе:
>>> x = [y*y for y in xrange(1, 10)]
>>> x
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> y
9
>>>
И это в глобальном пространстве имен

=
=
=
* На посошок
Кстати в Python есть один синтаксический макрос -> неявная конкатенация строк.
Если сайт в очередной раз вместо кавычек не выдаст кракозябры, то это выглядит так:
>>> anystring = "Im Ulm, " 'um Ulm' "und um Ulm herum" # variant 1
>>> anystring
'Im Ulm, um Ulmund um Ulm herum'
Заметьте, это не равнозначно
>>> anystring = "Im Ulm, " + 'um Ulm' + "und um Ulm herum" # variant 2
, хотя результат будет тот же, иначе бы я не говорил о макросе.
variant 1: сразу создается объединенная строка, ибо парсер научен распознавать такую нотацию, то есть по сути наш псевдомакрос *раскрывается* (как принято это называть) в строку в compile-time.
variant 2: создается три промежуточные объекта-строки, которые затем объединяются в одну. А ведь это всё лишние накладные расходы.
А вообще неявная конкатенация нужна для того, чтобы не пестрить обратными слэшами что в некоторых случаях ухудшает читабельность:
>>> anystring = "'a'b'c'd'e'f'" 'g"h"i"j"k"l' "m'n'o'p'q'r's"
>>> anystring
'\'a\'b\'c\'d\'e\'f\'g"h"i"j"k"lm\'n\'o\'p\'q\'r\'s'