artanis, това с отместването не е tricky, това е тест... ти явно си се издънил. Щом ти е трудно и непривично да го правиш значи явно не си свикнал да си подреждаш кода. Хубавото на този синтаксис е че правилния стил на програмиране е заложен в езика. Ако не пишеш красиви програми - те просто няма да тръгнат. И един страничен ефект от това - всички програми на Python изглеждат по един и същи начин и се четат еднакво лесно.
Това, на което викаш "адрес на функция" не е адрес на функция. Това е "референция към обект от тип Функция". И това си е напълно пълноценен обект, както всеки друг. Има си полета и методи
Метод на функция
Също като в Lisp (ако си спомняш). И въобще, бая неща в Python са взети директно от Lisp (като например slice notation а и lambda функциите). А ако ти кажа, че има и "обект от тип Клас", и че на нещото, което го създава му се вика "Метаклас", сигурно съвсем ще обелиш очите...
А за какво можеш да го използваш ли? Factory говори ли ти нещо? Полиморфизъм? Функционално програмиране? Бла бла...
Можеш ли някъде другаде да правиш това?
x, y, z = 1, 2, 3
Това е еквивалентно на:
x, y, z = range(1, 4)
Един вид може ли една функция да върне много резултати едновременно? Не съм учил Perl... може и да ги има тези неща, не знам, обаче много се съмнявам.
Виж сега какво можеш да правиш само със slice изразите:
да кажем, че имащ списък s = [1, 2, 3, 4, 5, 6]
s[1] = 1
s[0:4] = [1, 2, 3, 4]
s[0:4:2] = [1, 3] (взема от 0 до 4, без 4 през 2)
s[:2] = [1, 2] (взема от началото до индекс 2, без 2)
s[2:] = [3, 4, 5, 6] (взима от индекс 2 до края)
s[2:-1] = [3, 4, 5] (взима от 2 до предпоследното)
s[:] = [1, 2, 3, 4, 5, 6] (прави копие на списъка)
s[::-1] = [6, 5, 4, 3, 2, 1] (прави копие в обратен ред)
Аналог на car е s[0], а на cdr е s[1:] (глава и опашка).
Виж сега какво можеш да правиш със списъчни обобщения:
[x * 2 for x in s] = [2, 4, 6, 8, 10, 12] (нов списък от умножените по 2 елементи на стария)
[x * 2 for x in s if x % 2 == 0] = [4, 8, 12] (нов списък от умножените по 2 четни елементи на стария)
p = [1, 2, 3, 4, 5]
[(x, y) for x in s for y in p if (x * y) % 2 != 0] (нов списък от наредени двойки (a, b), такива, че a принадлежи на s, b принадлежи на p и a * b е нечетно)
[blah(x) for x in s] (ей ти типичното приложение на функционалните обекти - blah може да е която си искаш функция и всеки път, когато я сменяш, горния ред ще дава различен резултат (полиморфен код))
И освен всичко това Python поддържа и речници (можеш да си наследиш списък или речник без проблеми), итератори, генератори, множествено наследяване, едноредови (lambda) функции, пакетна йерархия, подобна на тази в Java, мултитрединг, persistent обекти чрез сериализация, интроспекция на всичко и каквото още се сетиш. Освен това мога да кажа, че този език пристига с една от най-богатите стандартни библиотеки, които съм виждал.
Абе... за да оцениш езика трябва да имаш необходимост от тези неща. Ако всичко, което ти трябва е a++ и RegExp ове - давай с Perl, обаче поне по мое мнение, тва си е чисто губене на време... Пък и я ми обясни, ти дето се занимаваш с лингвистика за какво са всичките $ на PHP и Perl? Как може всички други езици да се оправят без тях? Мен ако питаш на създателите им просто им е било по-лесно да напишат парсера така. Компромисче един вид. После сигурно са се оправдавали с нещо от сорта на "С $ се парсва по-бързо..."...
RegExp функциите са в модула 're'. Perl съвместими са.