我正在尝试插入 Python(2.7,通过 pythonista iOS 解释器)来做一些奇怪的功能性事情。具体来说,我正在尝试使用嵌套的 if-else lambdas 和 map 来实现一行 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]
在四处搜索之后,爪中的问题似乎很可能是列表元素没有传递到内部 lambdas(根据这个 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 的重复调用正在一遍又一遍地评估整个列表,但是如果没有它就无法将变量获取到嵌套的 lambdas 中,我是否被卡住了?我想可能有一些涉及改变列表的解决方案,比如每次 lambda 返回一个值时删除列表项,但这似乎不合理地复杂并且完全没有功能。我非常接近单行功能的嘶嘶声!有人在这里有任何线索吗?
编辑 :谢谢,你们。为了您的集体娱乐/奖励,一些完全实现的单行嘶嘶声:
https://gist.github.com/paultopia/d360116128c787e22ce8
最佳答案
问题是你没有调用内部的 lambdas。如果条件为假,像 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']
但是,您甚至不需要做所有这些只是为了获得单行的嘶嘶声。您可以将
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']
而且你根本不需要任何 lambdas,你可以只是一个列表理解:
>>> 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 lambdas返回函数对象而不是值(传递变量?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31897624/