【问题标题】:Calling anonymous functions in Python without assigning them to a variable在 Python 中调用匿名函数而不将它们分配给变量
【发布时间】:2012-02-18 15:47:58
【问题描述】:

如何在 Python 中制作自调用匿名函数?

以 JavaScript 为例:

标准方式:

function fn (a) {
   if (a == 1) {
      alert(a);
   }
   else {
     alert(0);
   }
  /...
}

fn(1);

自调用匿名调用:

!function(a) {
   if (a == 1) {
      alert(a);
   }
   else {
     alert(0);
   }
   /...
}(1);

Python 中有类似的吗?

【问题讨论】:

  • @Marcin,只是想知道)
  • 第一个案例不是匿名的。从任何意义上说,它们都不是“自我调用”。我编辑了标题。
  • @Opsa:“只是想知道”不会让一个糟糕的问题变得神奇般地好。请解释一下用例是什么。
  • @S.Lott 我想这可能会让 JavaScript 库更容易移植到 Python,因为许多 JavaScript 库都使用这种模式。
  • 在 2017 年,我使用它的主要用例是预绑定/冻结数据结构(如 dict)的值,该数据结构旨在从另一个模块内部导入而无需分配/定义一个实际的函数或显式腌制:STATIC_CONST_D = (lambda S: {x: transform(x) for x in S})(set(1,2,3))from module import STATIC_CONST_D

标签: javascript python python-3.x


【解决方案1】:

鉴于您对 lambda 答案的 cmets,我认为这是不可能的。 lambda 运算符是 Python 支持匿名函数的唯一方式。如果您需要支持语句,那么您需要使用def,它必须始终命名。

但请记住,lambda 可以支持有限的 if-then 逻辑。下面两个是lambda表达式,实现了上面给出的if-then逻辑:

(lambda a: alert(1 if a == 1 else 0))(1)

从字面上看:

(lambda a: alert(a) if a == 1 else alert(0))(1)

【讨论】:

    【解决方案2】:

    如果您的函数很简单并且只有表达式(没有语句),那么您可以使用lambda 创建匿名函数并内联调用它们。

    >>> (lambda x, y: x*y)(3, 5)
    15
    

    【讨论】:

    • 我知道lambda's。但是,我也对在函数中使用 statements 很感兴趣
    • @Opsa:Python 没有完整的匿名函数,很大程度上是因为它们在混淆之外没有用例。
    【解决方案3】:

    是(Python 3 或 Python 2 使用 from __future__ import print_function):

    (lambda x: print(x))('foo')
    

    但是使用lambda你只能写一行代码。

    【讨论】:

    • 准确地说,你只能使用 lambda 将一个 表达式 变成一个函数。正常的defed 函数允许使用“行”代码,在 python 语法中称为套件。这就是为什么必须使用 print function 的原因,因为它可以用作表达式的一部分,而 print statement 不能那样使用。
    • @TokenMacGuy 感谢您的澄清。 :)
    • 您可以使用表达式 - 而不是语句。如果你想破解多个表达式,你可以这样做,例如,让 lambda 函数生成一个元组,其中每个项都是一个表达式。例如:lambda a: (thing1(), thing2(), thing3())
    【解决方案4】:

    您可以使用命名函数并在使用后取消绑定它的名称,如下所示:

    def hello(there):
        print there
    hello("france")
    del hello
    

    【讨论】:

      【解决方案5】:

      你总是可以滥用exec,将你的代码作为字符串传递:

      def anon(code):
          execdict = {}
          exec('def f():{}'.format(code), execdict)
          return execdict['f']
      
      anon("print('hello'); print('hello again')")()
      

      (这适用于 python 3,我认为 exec 在早期版本中的行为非常不同)

      【讨论】:

        猜你喜欢
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 2018-05-11
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多