В
предыдущем посте я несколько напутал - поздно было, устал после рабочего дня.
Нету в питоне currying (и pattern matching тоже). Есть разные функции getitem и itemgetter.
Поэтому мое совершенно искреннее удивление "как же может считать естественным currying человек, который не понимает lambda" оказалось несколько не к месту.
Последняя "Return a callable object that fetches item from its operand.". Т.е. возвращает ту же самую лямбду. Потому что lambda это конструктор анонимных callable object-ов.
Таким образом, мы имеем разницу между написанием некоторого простенького выражения явным образом и использования стандартной функции, возвращающей результат вычисления этого простенького выражения.
Помнится, в языке pascal была функция sqr(x), возводившая x в квадрат. Меня все время раздражало, что в basic, которым приходилось пользоваться параллельно так называется строго обратная функция. Казалось бы - вот нафига стандартая функция которая делает то же самое, что
x*x.
В Python весь модуль operator вообще-то делает ровно это - предоставляет функциональный интерфейс к операторам. Чтобы можно было взять и передать этот оператор куда-нибудь, где ждут сallable object. Удобный syntax sugar, позволяющий отказаться от лишних lambda.
Но вот itemgetter в этом модуле - наособицу. Только от и attrgetter рассчитаны на то, что в функцию будут передавать не сам callable объект из модуля operator, а результат его вычисления.
То есть мы имеем специализированный генератор лямбд. Причем такой, что его вызов занимает чуть ли не больше символов в тексте, чем универсальный конструктор для той же лямбды.
1234567890123
lambda x:x[1]
itemgetter(1)
Следите за руками - и там, и там - 13 символов. Только в одном случае - универсальная конструкция, известная в computer science более полувека, и понятная по идее любому программисту, знающему хотя бы один нормальный язык, и слышавшему фамилию Черча,
а во втором - специфическая фича стандартной библиотеки данного языка, за описанием которой надо лезть в документацию.
Собственно, предыдущий пост был про то, что для достаточно широкого класса пользователей компьютеров специфическое решение естественнее общего. Человек предпочитает потратить хренову кучу времени на поиск в гугле программы, которая решает в точности стоящую перед ним задачу (посредством долгого и нудного кликанья в диалог с десятью закладками для выбора нужного режима) вместо того чтобы подумать пять минут и понять, что эта задача раскладывается в три шага, решаемых с помощью давно и хорошо известных ему средств. А посредством четвертого средства, которое вообще идет в поставке операционной систем, эти три средства склеиваются вместе и решение автоматизируется.
Общество потребления, блин. Уже и в программирование проникло. Причем не только проникло, но и поощряется авторами языка. Я понимаю, когда так ведут себя авторы Visual Basic, приучая по каждому чиху скачивать бесплатный active x с сайта microsoft - привыкнут, рано или поздно начнут брать платные. Но тут-то open source!
P.S. А вот map() в python есть. А я зачем-то [... for...] пользовался.