为什么这段代码打印 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、2
- 如果这不是 3 的倍数(始终为 True),则过滤之前的输出
- 取上一个输出的最后一项
总之,如果输入的最后一个数字是奇数,则输出 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
中的 mia
与 mia
函数无关)
有趣的是,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)
为什么这段代码打印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、2
- 如果这不是 3 的倍数(始终为 True),则过滤之前的输出
- 取上一个输出的最后一项
总之,如果输入的最后一个数字是奇数,则输出 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
中的 mia
与 mia
函数无关)
有趣的是,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)