Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中嵌套的if-else lambda返回函数对象而不是值(传递变量?)_Python_Lambda - Fatal编程技术网

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

python中嵌套的if-else lambda返回函数对象而不是值(传递变量?),python,lambda,Python,Lambda,我正在尝试推动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 lambd

我正在尝试推动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]
这至少产生了价值,但显然不是我想要实现的:

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返回一个值时删除列表项,但这似乎不合理地复杂,而且完全不起作用。我是如此接近于一行功能性的汽水!这里有人有什么线索吗

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


问题在于您没有调用内部lambda。类似于
a if b else lambda:…
的表达式仅在条件为false时返回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']
您根本不需要任何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']

我相信你想要的是:

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

您的问题是运算符优先级。如果将第一个后面的所有lambda替换为字符串,并添加括号以澄清,则可以更清楚地看到这一点:

>>> alist = [1, 2, 3, 15, 5]
>>> claw = map(lambda x: ('Fizzbuzz' if (x % 15 == 0) else "LAMBDA_FIZZ" if (x % 3 == 0) else "LAMBDA_BUZZ" if (x % 5 == 0) else x), alist)
>>> claw
[1, 2, 'LAMBDA_FIZZ', 'Fizzbuzz', 'LAMBDA_BUZZ']
BrenBarn已经发布了一个答案,显示了一种使用多个lambda的方法,但是在仍然使用map和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 = ['FizzBuzz' if (x % 15 == 0) else 'Fizz' if (x % 3 == 0) else 'Buzz' if (x % 5 == 0) else x for x in alist]
我实际上是这样做的:

def fizzbuzz(x):
    if x % 15 == 0:
        return 'FizzBuzz'
    elif x % 3 == 0:
        return 'Fizz'
    elif x % 5 == 0:
        return 'Buzz'
    else:
        return x

claw = [fizzbuzz(x) for x in alist]

如果我可以提出一种稍微不同的方法,我会考虑更多的蟒蛇。列表理解也表示函数操作,但在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]
在我看来,这让事情变得更清楚了

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