破译一个神秘的Python政治家

2024-05-23 14:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一则招聘广告上看到了这一点:

lambda f: (lambda a: a(a))(lambda b: f(lambda *args: b(b)(*args)))

所以我所理解的是它是一个匿名(未命名)函数,它由另外两个嵌套的匿名函数组成。最里面的函数接受参数的变量列表(*args)。在

我不知道它应该做什么。这是实际可行的方法还是在没有看到实际参数列表的情况下无法判断?在


Tags: 方法lambda函数列表参数情况args未命名
3条回答

代码正在创建Y-combinator in Python。这只是一个练习,不是真实世界的代码;不要试图解密它。在

为了理解Y-combinator本身的功能,您可以参考这个SO问题:What is a y-combinator?和它的wikipedia页面:Fixed-point combinator。在

也许这个广告是寻找那些知道函数编程和/或高级计算机科学话题的人,比如Lambda calculusCombinatory logic,这是函数编程背后的主要理论基础。在

或者他们的公司是Y Combinator winner startup,他们只是在寻找有CS背景的Python程序员。在

不仅仅是*args,如果不知道abf*args是什么,就很难判断它是什么。在

当b作为参数传递给函数b时,兔子洞会变得特别深,结果是args被传递到的函数。在

我把兰姆达斯解开只是为了让它更容易阅读。下面是使用嵌套函数的代码:

def f1(f):
    def f2(a):
        return a(a)

    def f3(b):
        def f4(*args):
            return b(b)(*args)

        return f(f4)

    return f2(f3)

这基本上相当于:

^{pr2}$

现在让我们按照函数调用进行操作。首先你要用一些参数来调用f1。接下来会发生以下情况:

  1. 用f3调用f2
  2. f2返回以自身作为参数调用的f3
  3. 现在我们在f3里面,b是f3
  4. f3返回f(调用f1的参数),f4作为参数
  5. f是一个以函数作为唯一参数调用的回调函数
  6. 如果f调用这个函数,那么它的调用将应用于用b调用的b的结果。b是f3,所以f实际上是在调用f3的结果(f3),这也是f要返回的结果

因此,f1可以简化为:

def f1(f):
    def f3():
        def f4(*args):
            return f3()(*args)
        return f(f4)

    return f3()

现在我想出了一种方法来调用f1,它不会以无限递归结束:

called = False

def g1(func):
    def g2(*args):
        print args
        return None

    global called

    if not called:
        called = True
        func(5)
    else:
        return g2

f1(g1) # prints "(5,)"

如您所见,它使用全局来停止递归。在

下面是另一个例子,它使用lambda(lambda是Poisson分布的参数,而不是lambda运算符)对Poisson分布进行试验:

import random

def g3(func):
    def g4(a):
        def g5(b):
            print a
            return a+b
        return g5

    if random.random() < 0.1:
        return g4(1)
    else:
        return g4(func(1))

f1(g3)

最后一点是确定性的,不依赖于全局,实际上有点有趣:

def g6(func):
    def g7(n):
        if n > 0:
            return n*func(n-1)
        else:
            return 1

    return g7

print f1(g6)(5) # 120
print f1(g6)(6) # 720

我相信每个人都能猜出这个函数是什么,但有趣的是,你可以用这个奇怪的lambda表达式来做一些有用的事情。在

相关问题 更多 >