Один хороший человек на днях скинул мне страшнющий однострочник на Python, а затем сотворил вот это руководство.
Пользуйтесь и наслаждайтесь… Если сможете :)
@denizsincar29, спасибо тебе!
Руководство по созданию чудовищных, но эффектных однострочников
Цель: уместить максимальное количество логики и операций в одну строку кода, жертвуя читаемостью, поддерживаемостью и безопасностью.
Наша цель - создать код, который никто не сможет понять, кроме самого гения-автора. Да и то не факт.
Основные принципы
Забудьте про обработку исключений: ошибки - это весело! Пусть программа взрывается. Обработать исключения в однострочнике невозможно, поэтому мы не будем даже пытаться.
Комбинируйте всё воедино (максимально): вложенные тернарные операторы, цепочки методов, скобки внутри скобок - чем больше операций в одном выражении, тем лучше.
a if cond1 else (b if cond2 else c)Ваш лучший друг.
a or b and cТоже полезно для создания неочевидной логики.
Лист-компрехеншены - наше многофункциональное оружие: превратите любой цикл и фильтрацию данных в однострочный ад. Используйте вложенные лист-компрехеншены для максимальной сложности. Да и цикл в одну строку вы не напишете.
Мгновенная индексация - для краткости и скорости: создайте список/словарь на лету и сразу же получите к нему доступ по индексу/ключу.
[...][i]и
{...}[key]позволяют избежать временных переменных и сделать код более лаконичным. Убедитесь, что
iиkeyвычисляются в других сложных выражениях, чтобы увеличить уровень абстракции.Импортируйте не как все (для obfuscation):
__import__("module").submodule.function()Это не только красиво, но и затрудняет анализ зависимостей.
Циклы через itertools (для бесконечной мощи): забудьте про обычные
for.__import__("itertools").count()и
map()с лямбдами позволяют создавать бесконечные циклы, которые могут привести к зависанию программы, если их не остановить.Больше тернарных операторов (для нелинейной логики): выведите тернарные операторы на новый уровень, вложив их друг в друга несколько раз. Используйте их даже там, где они не нужны, чтобы добавить немного загадочности.
Главное - уместить как можно больше: каждая строка должна быть наполнена операциями до предела. Используйте все доступные приемы, чтобы уменьшить количество символов и увеличить плотность логики.
Пример
Пример, стремящийся к абсолютной нечитаемости:
monthdays = lambda year, month: [31, (29 if (((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0)) else 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][(["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"].index(month.strip().lower()))] # Возвращает количество дней в месяце для заданного года (или взрывается с ошибкой). Не пытайтесь понять, как это работает.Полезные применения и предостережения
- Конкурсы на самый нечитаемый код, где побеждает тот, кто умудрится сделать больше всего в одной строке.
- Демонстрация мнимого мастерства владения языком. Если кто-то действительно впечатлится, вам повезло.
- Запутывание врагов. Только если вы уверены, что они не смогут использовать ваш код против вас.
Важное предупреждение
Этот код предназначен только для развлечений и экспериментов!
Вы можете конечно использовать такой код на работе, если ваша цель - отомстить вашему работодателю перед увольнением.