python - python 中的嵌套 if-else lambda 返回函数对象而不是值(传递变量?)

标签 python lambda

我正在尝试插入 Python(2.7,通过 pythonista iOS 解释器)做一些奇怪的功能性事情。具体来说,我正在尝试使用嵌套的 if-else lambda 和映射来实现单行 fizzbuzz。但是我对这种卑鄙的把戏还很陌生,而且进展得并不顺利。

采用以下代码:

alist = [1, 2, 3, 15, 5]
claw = map(lambda x: 'Fizzbuzz' if x % 15 == 0 else lambda x: 'Fizz' if x % 3 == 0 else lambda x: 'Buzz' if x % 5 == 0 else x, alist)
print "claw"
print claw
print
claw2 = map(lambda x: 'scratch' if x == 1 else 2, alist)
print "claw2"
print claw2

此代码产生以下输出:

claw
[<function <lambda> at 0x3f19fb4>, <function <lambda> at 0x36ba534>, <function <lambda> at 0x3ffa3e4>, 'Fizzbuzz', <function <lambda> at 0x3ffaa74>]

claw2
['scratch', 2, 2, 2, 2]

四处搜索后,claw 中的问题似乎是列表元素未传递到内部 lambda(根据此 SO:Scope of python lambda functions and their parameters)。好的,那么我也尝试嵌套 map :

claw3 = map(lambda x: 'Fizzbuzz' if x % 15 == 0 else map(lambda x: 'Fizz' if x % 3 == 0 else map(lambda x: 'Buzz' if x % 5 == 0 else x, alist), alist), alist)
print "claw3"
print claw3

这至少产生了值(value),但显然不是我想要达到的目标:

claw3
[[[1, 2, 3, 'Buzz', 'Buzz'], [1, 2, 3, 'Buzz', 'Buzz'], 'Fizz', 'Fizz', [1, 2, 3, 'Buzz', 'Buzz']], [[1, 2, 3, 'Buzz', 'Buzz'], [1, 2, 3, 'Buzz', 'Buzz'], 'Fizz', 'Fizz', [1, 2, 3, 'Buzz', 'Buzz']], [[1, 2, 3, 'Buzz', 'Buzz'], [1, 2, 3, 'Buzz', 'Buzz'], 'Fizz', 'Fizz', [1, 2, 3, 'Buzz', 'Buzz']], 'Fizzbuzz', [[1, 2, 3, 'Buzz', 'Buzz'], [1, 2, 3, 'Buzz', 'Buzz'], 'Fizz', 'Fizz', [1, 2, 3, 'Buzz', 'Buzz']]]

现在我的脑子已经用完了。显然,对 map 的重复调用正在一遍又一遍地评估整个列表,但是如果没有它就无法将变量获取到嵌套的 lambda 表达式,我是不是被卡住了?我想可能有一些涉及改变列表的解决方案,比如每次 lambda 返回值时删除列表项,但这似乎过于复杂而且完全没有功能。我非常接近单行功能 fizzbuzz!有人在这里有任何线索吗?

编辑:谢谢大家。为了您的集体娱乐/奖励,一些完全实现的单行嘶嘶声:

https://gist.github.com/paultopia/d360116128c787e22ce8

最佳答案

问题是您没有调用内部 lambda。如果条件为假,像 a if b else lambda: ... 这样的表达式只会返回 lambda 本身(即函数对象)。您可以通过以下方式获得结果:

>>> claw = map(lambda x: 'Fizzbuzz' if x % 15 == 0 else (lambda x: 'Fizz' if x % 3 == 0 else (lambda x: 'Buzz' if x % 5 == 0 else x)(x))(x), alist)
>>> claw
[1, 2, 'Fizz', 'Fizzbuzz', 'Buzz']

但是,您甚至不需要做所有这些来获得单行的 fizzbuzz。您可以直接将 if/else 表达式嵌套在单个 lambda 中:

>>> claw = map(lambda x: 'Fizzbuzz' if x % 15 == 0 else 'Fizz' if x % 3 == 0 else 'Buzz' if x % 5 == 0 else x, alist)
>>> claw
[1, 2, 'Fizz', 'Fizzbuzz', 'Buzz']

而且你根本不需要任何 lambda,你可以只需要一个列表推导式:

>>> claw = ['Fizzbuzz' if x % 15 == 0 else 'Fizz' if x % 3 == 0 else 'Buzz' if x % 5 == 0 else x for x in alist]
>>> claw
[1, 2, 'Fizz', 'Fizzbuzz', 'Buzz']

关于python - python 中的嵌套 if-else lambda 返回函数对象而不是值(传递变量?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897624/

相关文章:

python - 基本的 Python 2D 图形?

python - 残差图与主图不对齐

c# - Linq lambda 表达式中的 bool 短路评估

java - 在 Lambda 表达式中组合谓词

c++ - 我可以运行一个存储的 lambda,其捕获的值不再在范围内吗?

python - pylint 说 "Unnecessary parens after %r keyword"

python - 属性错误 : 'PosixPath' object has no attribute 'path'

python - Pandas :2个数据帧之间的数据差异(增量)

java - Lambda - ClassNotFoundException 异常

c# - 如何使用给定表达式访问属性