首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套在python中返回函数对象而不是值(传递变量通过?)

嵌套在python中返回函数对象而不是值(传递变量通过?)
EN

Stack Overflow用户
提问于 2015-08-08 19:17:49
回答 4查看 248关注 0票数 2

我在玩推动Python (2.7,通过pythonista解释器)来做一些奇怪的功能。具体来说,我试图使用嵌套的if-else lambdas和map实现一行fizzbuzz。但我对这种肮脏的把戏并不熟悉,而且进展不太顺利。

请使用以下代码:

代码语言:javascript
复制
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

此代码产生以下输出:

代码语言:javascript
复制
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中的问题似乎是列表元素没有传递到内部lambdas (按下面的意思是:Scope of python lambda functions and their parameters )。好吧,那么我也试着把地图嵌套进去:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-08 19:33:50

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

代码语言:javascript
复制
>>> 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。您只需在单个lambda中直接嵌套彼此内部的if/else表达式:

代码语言:javascript
复制
>>> 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']

你根本不需要任何兰巴达,你只需要一个清单理解:

代码语言:javascript
复制
>>> 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']
票数 3
EN

Stack Overflow用户

发布于 2015-08-08 19:46:06

如果我能提出一个稍微不同的方法,我会考虑更多的琵琶。列表理解也表示功能操作,但在python中则不那么详细。尝试以下几点:

代码语言:javascript
复制
claw = ['Fizzbuzz' if x % 15 == 0
        else 'Fizz' if x % 3 == 0
        else 'Buzz' if x % 5 == 0
        else x for x in alist]

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

票数 2
EN

Stack Overflow用户

发布于 2015-08-08 19:35:34

我相信你想要的是:

代码语言:javascript
复制
claw = map(lambda x: 'fizzbuz' if x%15==0 else 'fizz' if x%3==0 else 'buzz' if x%5==0 else x, alist)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31897624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档