Однострочные приёмы в коде
См. также: Функции и выражения · Что такое код · Python — однострочные приёмы
Однострочные приёмы в коде
Что такое однострочный приём?
Однострочный приём, однострочник, или ванлайнер - это кусок кода, который выполняет сложную или многошаговую задачу всего в одну строчку.
Например, это обычный подход в три строки:
temp = a
a = b
b = temp
А однострочный приём выполняется так:
a, b = b, a
Однострочник (one-liner) в повседневной разработке — это не обязательно "вся программа в одной строке". Чаще речь о короткой идиоматичной записи типовой операции — обмен двух переменных, разворот строки, фильтр списка, слияние словарей. Язык высокого уровня позволяет выразить намерение компактно, если вы уже знаете базовые конструкции — переменные, циклы и функции.
Отдельный смысл у однострочных команд в shell (grep, awk, perl -e) — это инструменты ОС и автоматизации, см. терминал, Bash, галерея однострочников и скриптов, справочник RegEx и готовые паттерны для grep. Здесь — приёмы внутри исходного кода на языках общего назначения.
Зачем они нужны
| Ситуация | Польза |
|---|---|
| REPL, ноутбук, скрипт на пять строк | Быстро проверить идею без лишнего шума |
| Обработка данных (логи, CSV, JSON) | Фильтр, flatten, подсчёт частот — одна понятная строка |
| Чтение чужого кода | Идиомы языка "узнаются" сразу, если вы их уже видели |
| Рефакторинг | Иногда длинный цикл сворачивается во включение или цепочку методов |
Классический пример из Python: a, b = b, a меняет значения без временной переменной за счёт распаковки кортежа; разворот строки — s[::-1] через срез с шагом.
Когда лучше развернуть в несколько строк
Однострочник, который коллега не разберёт с первого взгляда, — кандидат в рефакторинг.
В Go намеренно нет тернарного оператора ?:, чтобы не поощрять запутанные выражения.
То же правило для production-кода на любом языке: сначала ясность, потом лаконичность.
Признаки, что строку стоит разбить:
- вложенные включения, тернарные операторы и вызовы в одном выражении;
- побочные эффекты (изменение глобального состояния, I/O) внутри "красивой" строки;
- бизнес-логика, которую тестируют по отдельным шагам.
Методы рефакторинга и запахи кода помогают удержать баланс.
Десять частых задач — Python и аналоги
Полный разбор с примерами и оговорками — в статье Однострочные приёмы Python. Ниже — сводка для сравнения языков (синтаксис может отличаться по версии и стилю команды).
| Задача | Python | JavaScript | Java | C# | Go |
|---|---|---|---|---|---|
Поменять a и b | a, b = b, a | [a, b] = [b, a] | через temp или XOR для чисел | (a, b) = (b, a) | a, b = b, a |
| Развернуть строку | s[::-1] | [...s].reverse().join('') | new StringBuilder(s).reverse() | new string(s.Reverse()) | руны в []rune, цикл |
| Палиндром | s == s[::-1] | s === [...s].reverse().join('') | s.equals(new StringBuilder(s).reverse()) | сравнение с Reverse() | цикл или utf8 |
Факториал n | math.prod(range(1, n+1)) | [...Array(n)].reduce((p,_,i)=>p*(i+1),1) | IntStream.rangeClosed(1,n).reduce(1,(a,b)->a*b) | Enumerable.Range(1,n).Aggregate(1,(a,b)=>a*b) | цикл for |
| Flatten списка списков | [x for sub in lst for x in sub] | lst.flat() | lst.stream().flatMap(Collection::stream) | lst.SelectMany(x => x) | вложенные append |
| Чётные из диапазона | [x for x in range(10) if x%2==0] | [...Array(10).keys()].filter(x=>x%2===0) | IntStream.range(0,10).filter(i->i%2==0) | Enumerable.Range(0,10).Where(i=>i%2==0) | цикл + append |
| Слить два словаря | {**d1, **d2} | {...d1, ...d2} | Map + putAll | LINQ / цикл по ключам | нет встроенного map до Go 1.21+ |
| Подсчёт элементов | Counter(lst) | Map + цикл или reduce | Collectors.groupingBy | GroupBy | map[T]int |
| Уникальные значения | set(lst) | [...new Set(lst)] | stream().distinct() | lst.Distinct() | map как множество |
| Список строк → одна | ' '.join(lst) | lst.join(' ') | String.join(" ", lst) | string.Join(" ", lst) | strings.Join(lst, " ") |
Python — глава про one-liners, типы и коллекции, функции.
JavaScript — строки, справочник методов.
Java — коллекции, Stream API.
C# — раздел C#, LINQ.
Go — явные циклы; краткость через идиомы Go, не через "магические" однострочники.
Связь с другими темами раздела
- Синтаксический сахар — сокращения, которые компилятор или интерпретатор разворачивает в более длинную форму (уровни абстракции).
- Декларативный стиль — вы описыете что нужно (чётные числа, уникальные ключи), платформа выбирает как (SQL, включения, LINQ).
- Идиоматичный код — принятый в сообществе языка способ писать типовые вещи; однострочники — его видимая часть.
После этой главы имеет смысл открыть языки программирования и выбрать один раздел для практики — не смешивая правила set/dict/Stream в одном учебном дне.