ラムダで印刷できないのはなぜですか?


163

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

lambda: print "x"

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


1
docs.python.org/reference/expressions.html#lambda。それは「表現」を意味し、これはすべての可能な表現の完全な定義へのリンクです。この「まばら」はどうですか?間違っていたり不完全だったものは何ですか?
S.Lott

3
@ロット私は表現/文が何であり、印刷物がどこに属しているかについて誤解していました。今では理にかなっている
Anycorn

回答:


187

A 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

5
今、私はそれを機能させるのがなぜそんなに大事だったのかを理解しています。デフォルトのクワーグとして印刷を使用したかったので、これを修正しました。ありがとう。
Thomas Dignan

1
なぜfrom __future__ import print_functionコードの先頭にある必要があるのでしょうか?thx
ベン

ここで私たちが書いたものの版画はどこにありますか?
Sk。イルファン2018年

ベンのコメントに同意します。このインポートは取得できません。Python(2または3)にはprint()、組み込みメソッドがあります。
ivanleoncz 2018年

27

これを単純なスタブに使用している場合、これを使用します。

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

完璧に動作します。


3
追加のメモとして-上記の「未来」を使用します。これが利用できない場合にのみ、これを使用してください。これは、現在、非常に古いバージョンです。
ダニーステープル2015

24

あなたが書いたものは

def anon():
    return print "x"

構文エラーも発生しますが、Pythonでは2.xxで出力する値を割り当てることができません。python3ではあなたは言うことができます

lambda: print('hi')

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


3
from __future__ import print_functionpy2.xでこれを有効にするもある
tzaman

5
または、lambda: sys.stdout.write('hi')
fmark

@fmark:2.xではそれほど単純ではないことを除いて、sys.stdout.softspaceを処理し、(少なくとも)後で改行を書く必要があります。
Fred Nurk、2011年

11

ラムダの本体は、値を返す式でなければなりません。 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")

より柔軟に:def printf(fmt, *args): print(fmt % args)
IvyMike

4

Python 3.xでは、ラムダのセマンティクスを変更せずに、ラムダでprintが機能します。

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

「計装されていない」ラムダが次のとおりだとします。

lambda: 4

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

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

3

ラムダの本体は単一の式でなければなりません。print声明なので、残念ながらそれは出ていない。


ありがとう、私は表現とステートメントの定義について確信が持てませんでしたが、今では理にかなっています
Anycorn

2

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


1
不完全な回答ですが、良いリンクです。
Stephen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.