Вся причина lambda
в том, что это выражение. 1 Если вам нужно что-то вроде lambda
, но это утверждение, это просто def
.
Выражения Python не могут содержать операторов. Это, на самом деле, основополагающий для языка, и Python получает много пользы от этого решения. Это причина того, что отступ для управления потоком работает, а не неуклюж, как во многих других попытках (например, CoffeeScript). Это причина, по которой вы можете считывать изменения состояния, просматривая первый объект в каждой строке. Это даже одна из причин, по которой язык легко разбирается как для компилятора, так и для читателей. 2
Изменение в Python каким-либо способом «избежать» разрыва выражения-выражения, за исключением, может быть, очень осторожного и ограниченного способа, превратит его в совершенно другой язык, который больше не имел многих преимуществ, которые вызывают люди выбирают Python в первую очередь.
Изменение Python для создания большинства выражений операторов (например, Ruby) снова превратит его в совершенно другой язык без текущих преимуществ Python.
И если Python сделал внесет любое из этих изменений, то больше не было бы причины для lambda
, во-первых; 2,3 , вы могли бы просто использовать def
операторы внутри выражения.
А как насчет изменения Python вместо выражения выражений? Ну, должно быть очевидно, что это сломало бы: «Вы можете считывать изменения состояния, просматривая первый объект в каждой строке». Хотя обычно Гвидо фокусируется на том факте, что if spam=eggs
является ошибкой чаще, чем полезной вещью.
Тот факт, что Python дает вам возможность обойти это при необходимости, например, setattr
или даже явный вызов __setitem__
на globals()
, не означает, что он должен иметь прямую синтаксическую поддержку. То, что очень редко требуется, не заслуживает синтаксического сахара - и даже более того, для чего-то достаточно необычного, что оно должно поднимать брови и / или красные флаги, когда это действительно делается.
1. Я понятия не имею, было ли это пониманием Гвидо, когда он первоначально добавил lambda
в Python 1.0. Но это определенно причина, по которой lambda
не был удален в Python 3.0.
2. На самом деле, Гвидо неоднократно высказывал предположение, что разрешение синтаксического анализатора LL (1), который люди могут запускать в своих головах, является достаточной причиной для того, чтобы язык основывался на утверждениях, до такой степени, что другие преимущества даже не нужно обсуждать , Я писал об этом несколько лет назад , если кому-то интересно.
3. Если вам интересно, почему так много языков do имеют выражение lambda
несмотря на то, что уже имеют def
: во многих языках, от C ++ до Ruby, функции не являются первоклассными объектами, которые могут быть обошлось, поэтому им пришлось изобрести вторую вещь, которая является первоклассной, но работает как функция. В других, от Smalltalk до Java, функции даже не существуют , только методы, поэтому им снова пришлось изобрести вторую вещь, которая не является методом, а работает как один. У Python нет ни одной из этих проблем.
4. Некоторые языки, такие как C # и JavaScript, фактически имели прекрасно работающие определения встроенных функций, но добавили некоторый синтаксис lambda
в качестве чистого синтаксического сахара, чтобы сделать его более кратким и менее наглядным. Это может на самом деле стоить делать в Python (хотя каждая попытка хорошего синтаксиса до сих пор терпела неудачу), но это не будет текущий синтаксис lambda
, который почти столь же многословен, как def
.