Я играю с нажатием Python (2.7, через интерпретатор iOS pythonista), чтобы сделать некоторые странные функциональные вещи. В частности, я пытаюсь реализовать однострочный fizzbuzz, используя вложенные if-else lambdas и map. Но я новичок в этом грязном трюке, и все идет не так хорошо.Вложенные if-else lambdas в python, возвращающем функциональный объект, а не значение (передавая переменную через?)
Возьмем следующий код:
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]
После поиска вокруг, вполне вероятно, что проблема в коготь является то, что элементы списка не являются прошли через внутренние лямбды (на это СО: 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']]]
А теперь мой мозг исчерпал , Очевидно, что повторные вызовы на карту постоянно проверяют весь список, но если нет возможности получить переменные для вложенных лямбда без него, я застрял? Я предполагаю, что может быть какое-то решение, связанное с изменением списка, например удаление элемента списка каждый раз, когда лямбда возвращает значение, но это кажется необоснованно сложным, а также полностью нефункциональным. Я так близок к однострочному функциональному fizzbuzz! У кого-нибудь есть какие-то подсказки?
EDIT: Спасибо, y'all. Для вашего коллективного развлечений/награды, некоторые полностью реализована одна линия fizzbuzzes:
https://gist.github.com/paultopia/d360116128c787e22ce8