我可以在多行的python中编写lambda函数,并调用其他函数吗?

时间:2012-11-12 10:51:39

标签: python

我正在阅读Structure and Interpretation of Computer Programs - 在计算机科学领域很有名。

受到函数式编程的鼓舞,我尝试用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。这是否意味着python中的lambda函数只是设计为语法糖?

2 个答案:

答案 0 :(得分:7)

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

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

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

在Python 2中,您可以将compile()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.

答案 1 :(得分:0)

lambda语句(不是函数)只能是一行,并且只能由表达式组成。表达式可以包含函数调用,例如lambda: my_func()。但是,exec是一个陈述,而不是一个函数,因此不能用作表达式的一部分。

多线lambdas的问题已经在python社区中多次争论过,但结论是,如果需要的话,它通常更好,更容易出错,明确定义一个函数。