Це питання щодо порад щодо гольфу в Python.
У Python golfing звичайним є те, що подання - це функція, визначена лямбда. Наприклад,
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):...
помилка, тому що введення n
не було визначено, коли k
оцінюється під час визначення.
Результат полягає в тому, що іноді ви всмоктуєте повторення тривалого вираження в лямбда, тому що альтернативою є тривалий не лямбда.
lambda s:s.strip()+s.strip()[::-1]
def f(s):t=s.strip();print t+t[::-1]
Точка беззбитковості становить приблизно 11 символів ( деталі ), повз яких ви переходите на 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
Інші мови мають обхідні шляхи, наприклад , Октава . Відомі трюки для Python, але вони тривалі, незграбні та / або обмежені. Короткий, загальноприйнятий метод для імітації завдання в лямбда може революціонізувати гольф на Python.
Які способи подолати гравця Python або подолати це обмеження? Які потенційні ідеї вони повинні мати на увазі, коли вони бачать довгий вираз, повторений двічі в лямбді?
Моя мета з питанням цих порад - зануритися в цю проблему і:
- Каталогізуйте та проаналізуйте обхідні шляхи з гольфу, щоб підробити завдання в лямбда
- Вивчіть нові результати для кращих методів
Кожна відповідь повинна пояснювати рішення чи потенційний потенціал.
lambda s:(s+s[::-1]).lower()
. Звичайно, це не дає відповіді на власне питання.
strip
.