2012-04-04 5 views
6

Python 3.2では、これに従って:http://docs.python.org/py3k/reference/expressions.html#summaryPython 3.2では、 "lambda"は "キーワード"、 "演算子"、またはその両方と見なされますか?

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の言語構成は、関数に置き換えることができませんでした。 は定義されている関数のパラメータの名前であり、は、ラムダボディのコードです。xx+1の結果を計算するだけではありません。同じページで

あなたは私たちにリンクしていますhttp://docs.python.org/py3k/reference/lexical_analysis.html#operators

次のトークンは演算子です:

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

演算子のサブセクションの全体の内容です。これからは、言語のトークンを定義するコンテキストでは、演算子はシンボリック演算子であることを意味します。キーワードのセクションは、「そうでなければ識別子となるものはキーワードです」というスペルを明示しています。そのため、notisinなどのキーワードの演算子は表示されません。しかし、パーサーがそれらを別のクラスと見なすかどうかにかかわらず、キーワードである意味的に演算子であるものは確かにあります。

理由はわかりませんhttp://docs.python.org/py3k/reference/expressions.html#summarylambdaを演算子として説明しています。私は確かにしませんでした。厳密に言えば、「lambdaが最も低い優先順位の演算子です」と明示的には言わず、列見出しが「演算子」のテーブルにlambdaをリストするだけです。たぶん便利なのかもしれません。優先度の低いものとしてlambdaを記述することは、Pythonがどのようにしてlambda x: x + 1を解析するかを明確にする良い方法です(理論的には(lambda x: x) + 1またはlambda x: (x + 1)のいずれかです)。

+0

'lambda'を別の関数で置き換えることはできないので、' lambda'は関数ではありません。式を取り、関数を返すのは、やや単調な関数です(パラメータマッチャーを出した場合)。それは表現を取り、式(関数型)を返すので、明らかに演算子です。 – poke

+0

@pokeいいえ、それは関数式ではないからです。あなたは関数に式を渡さず、値を渡します。 'lambda'を表示しようとすると、値を渡すことはできません。他の種類の関数に渡すことはできません。それ以外の場合は、式に名前をバインドして、その名前を渡すことが有効です。 'x = fire_ze_missiles(); f = lambda:x'は 'f = lambda:fire_ze_missiles()'とは非常に異なりますが、 'x = fire_ze_missiles(); y = x + 1'は 'y = fire_ze_missiles()+ 1'と等価です。 – Ben

+0

私は同意します: 'lambda'は演算子のような"匂い "ではありません。また、優先順位表は演算子だけではなく、あくまでもあいまいな構文解析が必要な場合に、人間が束縛の強さに対処する方法です。オペレータによる表現を扱う際に、あいまいさを感じるだけです。 – torek

2

、ちょうどその:

"トークンの次のカテゴリが存在する:識別子、キーワード、 リテラル、演算子、区切り文字"

私はカテゴリpersonとアメリカ人です。それは、それらが相互に排他的であることを暗示することを意味するかもしれません。その場合、ドキュメントは矛盾しています。

+0

その文章は、その理由のために、また、インデント、DEINDENT、NEWLINEの傘の言葉を与えなかったので、私には気になります。 Pythonトークンの概念を説明するとき、私はこれらの3つを1つのタイプに組み合わせるか、別々にするかはわかりません。私はこの質問には関係ないと思うが、私はPythonの基本を体系化することを本当に頑張っている。 –

+0

これら3つはすべてステートメントセパレータ/マーカーです。インデントとディシジョンは複合ステートメント(および関数とクラス本体)をマークするために使用され、NEWLINEは簡単なステートメントを区切ります。 –

+0

私は文法を勉強してきました。あなたはそれの公用語を知っていますか?あなたはそれを引用できますか?私が書いている文書 - できるだけ公用語を使用したいと思っています。 –

4

演算子とキーワードは別個のエンティティです。

いいえ、そうではありません。 isinandornotなどです。

+0

なぜこれらはこれらを演算子としてリストしていませんか?演算子であるすべてのトークンがリストされていることを(非形式的に)示しています。それらは明らかにトークンですが、リストには含まれていません:http://docs.python.org/py3k/reference/lexical_analysis.html#operators –

+0

単に予約済みのキーワードのリストにあるからです。 – poke

関連する問題