为什么这段代码打印 2?它有什么作用?

Why does this code print 2? What does it do?

为什么这段代码打印2? 我很难理解调用的顺序以及代码运行时会发生什么。我想知道这里发生了什么,谢谢!

代码:

mia = lambda dan: lambda john: list(john)[dan]
john = lambda mia: lambda dan: filter(dan, map(lambda x: x % 2 + 1, mia))

ta = mia(-1)(john([3, 6, 9, 12, 15])(lambda f: f % 3))
print(ta)

这是执行简单任务的某种混淆方式:

  1. 检查列表中的数字是奇数还是偶数,并相应地映射 1、2
  2. 如果这不是 3 的倍数(始终为 True),则过滤之前的输出
  3. 取上一个输出的最后一项

总之,如果输入的最后一个数字是奇数,则输出 2,否则输出 1。

这可以简化为:

list(map(lambda x: x % 2 + 1, [3, 6, 9, 12, 15]))[-1]

或者,保留无用的过滤器:

list(filter(lambda f: f % 3, map(lambda x: x % 2 + 1, [3, 6, 9, 12, 15])))[-1]

这是使用函数式方法,其中函数 return 起作用而不是值。此外,局部变量的名称设计得令人困惑(john 中的 miamia 函数无关)

有趣的是,mia 等价于 operator.itemgetter

它做的比看起来要少很多。

为了简化,将 lambda 表达式转换为 def 语句。

def mia(dan):
    def inner(john):
        lst = list(john)
        return lst[dan]
    return inner

def john(mia):
    def inner(dan):
        mp = map(lambda x: x % 2 + 1, mia)
        return filter(dan, mp)
    return inner

为了进一步简化,将函数调用分开。

# just return the inner function
john_inner_func = john([3, 6, 9, 12, 15])
# first map element % 2 + 1 to each element of the given array
# this results in [2, 1, 2, 1, 2]
# next it filters all truthy (non-zero) values of the result of element % 3. 
# Since all are positive and less than 3 the result is the same
# [2, 1, 2, 1, 2]
john_filter_result = john_inner_func(lambda f: f % 3)
# just return the inner function
mia_inner_func = mia(-1)
# return the -1 index of the filter result as a list
# this gives the last element, or 2
ta = mia_inner_func(john_filter_result)
print(ta)