2012-04-04 4 views
6

В Python 3.2, в соответствии с этим: http://docs.python.org/py3k/reference/expressions.html#summaryВ Python 3.2, «лямбда» считается «ключевым словом», «оператором» или обоими?

lambda является оператором с самым низким приоритетом в Python.

И в соответствии с этим: http://docs.python.org/py3k/reference/lexical_analysis.html#keywords

lambda является языком Python ключевым словом.

ОДНАКО, в соответствии с этим: http://docs.python.org/py3k/reference/lexical_analysis.html#other-tokens

Операторы и ключевые слова являются различными объектами.

Я пытаюсь систематически объяснить Python 3.2 кому-то, и я не хочу их путать. Я, сам, в замешательстве, однако, о точных определениях операторов и ключевых слов.

Мое лучшее предположение заключается в том, что термин «оператор» означает нечто немного отличающееся при использовании в контексте парсера Python по сравнению с лексикой Python.

+0

Я уверен, что разумно называть «лямбда» ключевым словом, а не оператором. – alberge

+1

@alberge Каковы ваши рассуждения? – Paragon

+2

Я четко надел пальцы перед мозгом. Несколько ключевых слов python * являются операторами *. Они кажутся перекрывающимися наборами. – alberge

ответ

2

lambda ясно - ключевое слово; это специальное слово, распознанное синтаксическим анализатором, которое в противном случае подпадает под определение identifier.

lambda не семантически Оператор. Оператор - это просто функция, но вызывается с другим синтаксисом. Мы можем представить себе замену оператора + функцией add; все наши программы с добавлением будут более подробными и трудными для чтения, но мы все равно могли бы написать их. С другой стороны, языковая конструкция lambda не может быть заменена функцией; lambda x: x+1 не просто вычисляет результат из значений x и x+1, так как в этом контексте они вообще не являются значениями (x - это имя параметра для определяемой функции, а x+1 - код тела лямбды).

На этой же странице вы связаны мы имеем: http://docs.python.org/py3k/reference/lexical_analysis.html#operators

Следующие токены являются операторы:

+  -  *  ** /  //  % 
<<  >>  &  |  ^  ~ 
<  >  <=  >=  ==  != 

Это все содержимое подраздела на операторов. Из этого я подразумеваю, что в контексте определения жетонов языка «операторы» являются символьными операторами, тогда как в разделе на ключевые слова прямо указывается, что «эти вещи, которые в противном случае были бы идентификаторами, являются ключевыми словами». Вот почему я думаю, что операторы ключевых слов, такие как not, is, in и т. Д., Не указаны. Но, безусловно, есть вещи, которые являются семантическими операторами, которые являются ключевыми словами, независимо от того, считает ли парсер их отдельными классами.

Я не уверен, почему http://docs.python.org/py3k/reference/expressions.html#summary описывает lambda в качестве оператора; Я, конечно, не стал бы. Строго говоря, он явно не говорит: «lambda - это оператор с наименьшим приоритетом», он просто перечисляет lambda в таблице, заголовок столбца которой «Оператор». Возможно, это было просто удобство; описывая lambda как вещь с низким приоритетом, является хорошим способом разъяснить, как Python будет анализировать lambda x: x + 1 (теоретически это может быть либо , либо lambda x: (x + 1)).

+0

Просто потому, что мы не можем заменить конструкцию lambda с другой функцией, она не делает функцию lambda не функцией. Это несколько унарная функция (если вы берете счётчик параметров), которая принимает выражение и возвращает функцию. Это явно оператор, поскольку он принимает выражение и возвращает выражение (функции типа). – poke

+0

@poke Нет, это не функция, именно потому, что ей нужно выражение. Вы не передаете выражения в функции, вы передаете значения. Если вы попытаетесь просмотреть 'lambda', вы не« передадите »его значение, вы передадите ему выражение (которое не может быть« передано »на любую другую функцию). В противном случае было бы правильным привязать выражение к имени и вместо этого передать имя: 'x = fire_ze_missiles(); f = lambda: x' ** очень ** отличается от 'f = ambda: fire_ze_missiles()', тогда как 'x = fire_ze_missiles(); y = x + 1' эквивалентно 'y = fire_ze_missiles() + 1'. – Ben

+0

Я согласен: 'lambda' не« пахнет »как оператор. И поскольку вы отмечаете, что таблицы приоритетов предназначены не только для операторов: это действительно способ для людей справляться с сильными связями при рассмотрении того, что в противном случае было бы двусмысленным анализом.Мы просто привыкли видеть такую ​​двусмысленность, когда имеем дело с выражениями с операторами. – torek

2

Это не говорит, что они взаимно исключают друг друга, так что:

"следующие категории лексем существуют: идентификаторы, ключевые слова, литералы, операторы и ограничители"

Я в категориях человек и американец. Конечно, это может означать, что они являются взаимоисключающими, и в этом случае документы несовместимы.

+0

Это предложение меня беспокоит из-за этого и потому, что он не дал зонтичного термина для INDENT, DEINDENT и NEWLINE. Объясняя понятие токена Python, я не знаю, должен ли я объединить эти три в один тип или оставить их отдельно. Я думаю, это не имеет отношения к этому вопросу, но я очень стараюсь систематизировать основы Python. –

+0

Эти три являются разделителями/маркерами операторов. INDENT и DEINDENT используются для обозначения составных операторов (и функций и классов), в то время как NEWLINE разделяет простые операторы. –

+0

Я изучаю грамматику; Вы знаете официальный термин для него и можете ли вы его привести? Документ, который я пишу, я хочу, если это возможно, использовать только официальный жаргон. –

4

Операторы и ключевые слова являются отдельными лицами.

Нет, они не являются. is, in, and, or, not, и я уверен, что еще есть оба.

+0

Почему этот список не указан в качестве операторов? Это подразумевает (неофициально), что в нем перечислены все токены, которые являются операторами. Это явно токены, но их нет в списке: http://docs.python.org/py3k/reference/lexical_analysis.html#operators –

+0

Просто потому, что они уже находятся в списке зарезервированных ключевых слов. – poke