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

2024-10-03 13:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩推Python(2.7,通过pythonistaios解释器)来做一些奇怪的功能性事情。具体来说,我尝试使用嵌套的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

此代码生成以下输出:

^{pr2}$

在四处搜索之后,似乎claw中的问题可能是列表元素没有传递到内部lambda(根据这个SO:Scope of python lambda functions and their parameters)。好吧,然后我也试着把地图嵌套起来:

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

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

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


Tags: lambdamap列表ifelseprintfizzbuzz功能性
3条回答

问题是你没有调用内部的lambdas。如果条件为false,像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中彼此内部:

^{pr2}$

你根本不需要任何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']

我相信你想要的是:

claw = map(lambda x: 'fizzbuz' if x%15==0 else 'fizz' if x%3==0 else 'buzz' if x%5==0 else x, alist)

如果我能提出一个稍微不同的方法,我会考虑更多的Python。列表理解也表示函数操作,但在python中不太详细。尝试以下操作:

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

在我看来,这让事情变得更清楚了。在

相关问题 更多 >