在Python中调用匿名函数而不将其赋值给变量

3
如何在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
第一个案例不是匿名的。它们都没有任何意义上的“自调用”。我编辑了标题。 - Lennart Regebro
@Opsa:“只是想知道”并不能让一个不好的问题变得神奇好。请解释一下使用案例是什么。 - S.Lott
@S.Lott 我想这可能会使将JavaScript库移植到Python变得更容易,因为许多JavaScript库使用此模式。 - Anderson Green
在2017年,我主要使用它来预绑定/冻结数据结构(如dict)的值,该数据结构旨在从另一个模块内导入,而无需分配/定义实际函数或明确地进行封存:STATIC_CONST_D = (lambda S: {x: transform(x) for x in S})(set(1,2,3)) from module import STATIC_CONST_D - cowbert
5个回答

7

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

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

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

更直白地说:
(lambda a: alert(a) if a == 1 else alert(0))(1)

5

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

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

我知道 lambda 的用法。但是,我也对函数内部使用 statements 感兴趣。 - Opsa
1
@Opsa:Python没有完整的匿名函数,这在很大程度上是因为除了混淆之外没有它们的用例。 - Lennart Regebro

2

可以(使用Python 3或者Python 2并加上from __future__ import print_function):

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

但是使用lambda函数,您只能编写一行代码。


4
准确地说,你只能使用lambda将表达式转换为函数。普通的 def 函数允许使用若干行代码,这些在Python语法中被称为suite。这就是为什么需要使用print 函数,因为它可以作为表达式的一部分,而print 语句则不能以这种方式使用。 - SingleNegationElimination
你可以使用表达式而不是语句。如果你想要在多个表达式中进行hack,你可以这样做,例如,使lambda函数生成一个元组,其中每个项都是一个表达式。例如:lambda a: (thing1(), thing2(), thing3()) - jsbueno

2
您可以使用一个命名函数,并在使用后解除其名称绑定,例如:
def hello(there):
    print there
hello("france")
del hello

1

您可以随时滥用exec,将您的代码作为字符串传递:

def anon(code):
    execdict = {}
    exec('def f():{}'.format(code), execdict)
    return execdict['f']

anon("print('hello'); print('hello again')")()

这在Python 3中有效,我认为exec在早期版本中的行为非常不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接