我正在玩推動Python(2.7,通過pythonista iOS解釋器)做一些奇怪的功能的東西。具體來說,我試圖使用嵌套的if-else lambdas和map來實現一行fizzbuzz。但我對這種骯髒的詭計很陌生,並且它不太好。Python中返回函數對象而不是值的嵌套if-else lambdas(傳遞變量通過?)
看看下面的代碼:
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]
周圍搜索後,它很可能是在爪的問題是,列表元素不傳遞給內部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']]]
現在我的大腦已經用完了。顯然,重複調用映射是反覆評估整個列表,但如果沒有辦法將變量獲取到嵌套lambdas沒有它,我卡住了嗎?我想可能有一些解決方案涉及變更列表,比如每次lambda返回值時刪除列表項,但這看起來不合理複雜以及完全無效。我非常接近單線功能fizzbuzz!有人在這裏有任何線索嗎?
編輯:謝謝,你們都。爲了您的娛樂集體/回報的,有些完全實現一個在線fizzbuzzes:
https://gist.github.com/paultopia/d360116128c787e22ce8