0

コンピューター サイエンスの分野で有名な「コンピューター プログラムの構造と解釈」を読んでいます。

関数型プログラミングに励まされて、Scheme の代わりに Python でコーディングしてみました。Python の方が使いやすいからです。しかし、疑問が生じます: Lambda 関数が何度も必要になりましたがlambda、名前のない関数を複雑な操作で記述する方法がわかりません。

expここでは、文字列変数を唯一の引数としてラムダ関数を記述し、 exec(exp). しかし、私はエラーが発生します:

>>> t = lambda exp : exec(exp)
File "<stdin>", line 1
t = lambda exp : exec(exp)
                    ^
SyntaxError: invalid syntax

それはどのように起こりますか?それに対処する方法は?

Python ガイドブックを読み、必要な答えが見つからないまま Google を検索しました。lambdaPython の関数はシンタックス シュガーとしてのみ設計されているということですか?

4

2 に答える 2

7

body内でステートメントを使用することはできません。lambdaそのため、そのエラーが発生し、lambda式のみが必要です。

しかし、Python 3execでは関数であり、そこで正常に動作します。

>>> t = lambda x: exec(x)
>>> t("print('hello')")
hello

compile()Python 2 では、次のように使用できますeval()

>>> t = lambda x: eval(compile(x, 'None','single'))
>>> strs = "print 'hello'"
>>> t(strs)
hello

ヘルプcompile():

compile(...)
    compile(source, filename, mode[, flags[, dont_inherit]]) -> code object

    Compile the source string (a Python module, statement or expression)
    into a code object that can be executed by the exec statement or eval().
    The filename will be used for run-time error messages.
    The mode must be 'exec' to compile a module, 'single' to compile a
    single (interactive) statement, or 'eval' to compile an expression.
    The flags argument, if present, controls which future statements influence
    the compilation of the code.
    The dont_inherit argument, if non-zero, stops the compilation inheriting
    the effects of any future statements in effect in the code calling
    compile; if absent or zero these statements do influence the compilation,
    in addition to any features explicitly specified.
于 2012-11-12T10:55:48.957 に答える
0

lambdaステートメント (関数ではない) は 1 行のみで、式のみで構成できます。式には、関数呼び出しを含めることができますlambda: my_func()execただし、関数ではなくステートメントであるため、式の一部として使用することはできません。

複数行のラムダの問題は、Python コミュニティ内で何度か議論されてきましたが、結論としては、関数を明示的に定義する必要がある場合は、通常は関数を明示的に定義する方が適切であり、エラーが発生しにくいということです。

于 2012-11-12T10:59:34.720 に答える