Это вопрос подсказки для игры в гольф на Python.
В гольфе Python представление является функцией, определяемой как лямбда. Например,
f=lambda x:0**x or x*f(x-1)
У лямбда-формата есть два больших преимущества :
- Образец
f=lambda x:...
илиlambda x:...
корочеdef f(x):...return...
илиx=input()...print...
- Рекурсивный вызов может использоваться для цикла с небольшим объемом байтов.
Однако лямбды имеют большой недостаток - разрешать только одно выражение, без операторов. В частности, это означает отсутствие назначений, как c=chr(x+65)
. Это проблематично, когда есть длинное выражение, на значение которого нужно ссылаться дважды (или больше).
Подобные назначения E=enumerate
возможны вне функции или в качестве необязательного аргумента, но только если они не зависят от входных данных функции. Необязательные аргументы, такие как f=lambda n,k=min(n,0):...
fail, потому что ввод n
не был определен, когда k
оценивается во время определения.
В результате вы иногда повторяете длинное выражение в лямбде, потому что альтернатива - длинная не лямбда.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Точка безубыточности составляет около 11 символов ( детали ), после которой вы переключаетесь на a def
или program
. Сравните это с обычной точкой безубыточности длины 5 для повторного выражения:
range(a)+range(b)
r=range;r(a)+r(b)
print s[1:],s[1:]*2
r=s[1:];print r,r*2
Другие языки имеют обходные пути, например , Octave . Существуют известные приемы для Python, но они длинные, неуклюжие и / или ограниченного использования. Короткий, универсальный метод для имитации назначения в лямбде произвел бы революцию в гольфе Python.
Как игроку в Python можно преодолеть или обойти это ограничение? Какие потенциальные идеи им следует иметь в виду, когда они видят длинное выражение, повторяемое дважды в лямбде?
Моя цель с этим вопросом советов состоит в том, чтобы погрузиться в эту проблему и:
- Каталогизируйте и анализируйте обходные решения в гольф для фальшивых заданий внутри лямбды
- Исследуйте новые ссылки для лучших методов
Каждый ответ должен объяснить обходной путь или потенциальное преимущество.
lambda s:(s+s[::-1]).lower()
. Конечно, это не отвечает на реальный вопрос.
strip
.