我在工作广告上看到了这个(在SO上):
lambda f: (lambda a: a(a))(lambda b: f(lambda *args: b(b)(*args)))
Run Code Online (Sandbox Code Playgroud)
所以我理解的是它是一个匿名(未命名)函数,它由两个进一步嵌套的匿名函数组成.最里面的函数采用变量的争论列表(*args).
我无法弄清楚它应该做什么.如果没有看到实际的args列表,这实际上是否有效或无法分辨?
我已经取消了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.然后将发生以下情况:
因此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表达式来做一些有用的事情.
代码在Python中创建Y-combinator.这只是一个练习,而不是现实世界的代码; 不要试图解密它.
要了解Y-combinator本身的作用,你可以参考这个问题:什么是y-组合子?和它的维基百科页面:定点组合.
也许这个广告正在寻找那些了解函数式编程和/或高级计算机科学主题的人,如Lambda演算和组合逻辑,它们是函数式编程背后的主要理论基础.
或许他们的公司是Y Combinator赢家创业公司,他们只是在寻找具有CS背景的Python程序员.
| 归档时间: |
|
| 查看次数: |
628 次 |
| 最近记录: |