解码Cryptic Python语句

ard*_*igh 2 python

我在工作广告上看到了这个(在SO上):

lambda f: (lambda a: a(a))(lambda b: f(lambda *args: b(b)(*args)))
Run Code Online (Sandbox Code Playgroud)

所以我理解的是它是一个匿名(未命名)函数,它由两个进一步嵌套的匿名函数组成.最里面的函数采用变量的争论列表(*args).

我无法弄清楚它应该做什么.如果没有看到实际的args列表,这实际上是否有效或无法分辨?

Cra*_*sta 7

我已经取消了lambdas只是为了让它更容易阅读.这是使用嵌套函数的代码:

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)
Run Code Online (Sandbox Code Playgroud)

这基本上相当于:

f1 = lambda f: (lambda a: a(a))(lambda b: f(lambda *args: b(b)(*args)))
Run Code Online (Sandbox Code Playgroud)

现在让我们按照函数调用.首先,你要用一些参数调用f1.然后将发生以下情况:

  1. 用f3调用f2
  2. f2返回f3调用自身作为参数
  3. 现在我们在f3里面,b为f3
  4. f3以f4为参数返回f(你调用f1的参数)
  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()
Run Code Online (Sandbox Code Playgroud)

现在我想出了一种方法来调用不以无限递归结束的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,)"
Run Code Online (Sandbox Code Playgroud)

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

这是另一个运行泊松分布试验的例子,其中lambda(lambda是Poisson分布的参数,而不是lambda算子)为10:

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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我相信每个人都可以猜到这个函数是什么,但非常有趣的是你可以真正得到这个奇怪的lambda表达式来做一些有用的事情.


ham*_*ene 6

代码在Python中创建Y-combinator.这只是一个练习,而不是现实世界的代码; 不要试图解密它.

要了解Y-combinator本身的作用,你可以参考这个问题:什么是y-组合子?和它的维基百科页面:定点组合.

也许这个广告正在寻找那些了解函数式编程和/或高级计算机科学主题的人,如Lambda演算组合逻辑,它们是函数式编程背后的主要理论基础.

或许他们的公司是Y Combinator赢家创业公司,他们只是在寻找具有CS背景的Python程序员.