gpt4 book ai didi

python - 解码神秘的 Python 语句

转载 作者:行者123 更新时间:2023-11-28 19:32:37 26 4
gpt4 key购买 nike

我在招聘广告上看到了这个(在 SO 上):

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

所以我的理解是它是一个匿名(未命名)函数,它由两个进一步嵌套的匿名函数组成。最内层的函数采用可变参数列表 (*args)。

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

最佳答案

我取消了 lambda 只是为了让它更容易阅读。下面是使用嵌套函数的代码:

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)

这基本上等同于:

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

现在让我们跟随函数调用。首先,您将使用一些参数调用 f1。然后将发生以下情况:

  1. f2 被 f3 调用
  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()

现在我想出了一种调用 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 是泊松分布的参数,而不是 lambda 运算符):

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 表达式来做一些有用的事情。

关于python - 解码神秘的 Python 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21131742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com