web-dev-qa-db-ja.com

ラムダで動作しないのはなぜですか?

なぜこれが機能しないのですか?

lambda: print "x"

これは単一の文ではありませんか、それとも別のものですか?ドキュメントは、ラムダで許可されているものについて少しまばらに見える...

150
Anycorn

lambdaの本体は単一式でなければなりません。 Python 2.xでは、printはステートメントです。ただし、Python 3では、print関数です(関数アプリケーションは式なので、ラムダで動作します)。最新のPython 2.xを使用している場合、バックポート印刷機能を使用できます(また、上位互換性のために使用する必要があります)。

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI

私がこれを単純なスタブアウトに使用している場合、私はこれを使用します:

fn = lambda x: sys.stdout.write(str(x) + "\n")

完璧に機能します。

24
Danny Staple

あなたが書いたものは同等です

def anon():
    return print "x"

また、SyntaxErrorが発生します。pythonでは、2.xxで印刷する値を割り当てられません。 python3では、あなたは言うことができます

lambda: print('hi')

また、printをステートメントではなく関数に変更したため、機能します。

24
dagoof

ラムダの本体は、値を返す式でなければなりません。 printはステートメントであり、Noneでさえも何も返しません。同様に、printの結果を変数に割り当てることはできません。

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax

割り当てはステートメントであるため、ラムダに変数の割り当てを配置することもできません。

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax
11

このようなことができます。

printステートメントを関数に変換する関数を作成します:

def printf(text):
   print text

そして印刷:

lambda: printf("Testing")
11

Python 3.xを使用すると、ラムダのセマンティクスを変更せずに、印刷がラムダで動作します。

これは、デバッグに非常に便利な特別な方法で使用されます。この「遅い回答」を投稿します。これは、私がよく使用する実用的なトリックだからです。

「計装されていない」ラムダが次のとおりであると仮定します。

lambda: 4

次に、「計装された」ラムダは次のとおりです。

lambda: (print (3), 4) [1]
3

ラムダの本体は、単一のでなければなりません。 printはステートメントであるため、残念ながら公開されていません。

3
tzaman

ここ 、質問に対する回答が表示されます。 printはPythonの式ではない、と言います。

2
vpit3833