0

我正在阅读计算机程序的结构和解释——在计算机科学领域很有名。

受到函数式编程的鼓舞,我尝试用 Python 而不是 Scheme 进行编码,因为我发现它更易于使用。但随之而来的问题是:我多次需要一个 Lambda 函数,但我不知道如何使用它lambda来编写一个操作复杂的未命名函数。

在这里,我想编写一个带有字符串变量exp作为唯一参数的 lambda 函数并执行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

您不能在lambda正文中使用语句,这就是您收到该错误的原因,lambda只需要表达式。

但是在 Python 3exec中是一个函数,并且在那里可以正常工作:

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

在 Python 2 中,您可以使用compile()with 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语句(不是函数)只能是一行,并且只能由一个表达式组成。表达式可以包含函数调用,例如lambda: my_func()exec但是,它是语句,而不是函数,因此不能用作表达式的一部分。

多行 lambdas 的问题在 python 社区中已经讨论过多次,但结论是,如果需要,显式定义函数通常更好,更不容易出错。

于 2012-11-12T10:59:34.720 回答