2
>>> def itself_and_plusone(x):
...     return x, x+1
... 
>>> itself_and_plusone(1)
(1, 2)

>>> (lambda x: x,x+1)(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

なぜ?ラムダの回避策は?によってではない

>>> (lambda x: (x,x+1))(10)
(10, 11)

タプル(またはリスト..)を返し、タプルを解凍する必要があるためです

4

2 に答える 2

12

括弧がない場合は、次のように解釈されます。

((lambda x: x),x+1)(10)

x2番目はラムダ式の外側にあるため、これは失敗します。また、x定義されていても、タプルを関数であるかのように使用できないため、失敗します。

この単純なバリエーションは、何が起こっているかを示しています。

>>> x=42
>>> (lambda x: x,x+1)
(<function <lambda> at 0x00000000022B2648>, 43)

43は、ラムダ関数ではxなく、外部スコープのが使用されているためであることに注意してください。x

それを書く正しい方法はlambda x: (x,x+1)です。ご指摘のとおり、これは確かにタプルを返しますが、元の関数も同様です。

>>> type(itself_and_plusone(10))
<class 'tuple'>
于 2012-10-07T09:24:53.183 に答える
2

最初の例では、タプルは暗黙的です。pythonは、式にコンマが含まれている場合、括弧を想像します。これは、関数から戻るときだけでなく、任意の式に対して実行されます。

>>> 10, 10
(10, 10)

ただし、ラムダの例では、式全体を新しいタプル(ラムダとx + 1式を含む)と見なすため、明示的にする必要があります。

>>> (lambda x: x, 10)
(<function <lambda> at 0x10f331b90>, 10)
>>> lambda x: x, 10
(<function <lambda> at 0x10f331aa0>, 10)
>>> lambda x: (10, 10)
<function <lambda> at 0x10f314ed8>
于 2012-10-07T09:28:50.350 に答える