Перейти к основному содержимому

Однострочные приёмы в коде

Разработчику

См. также: Функции и выражения · Что такое код · 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. Ниже — сводка для сравнения языков (синтаксис может отличаться по версии и стилю команды).

ЗадачаPythonJavaScriptJavaC#Go
Поменять a и ba, 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
Факториал nmath.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 + putAllLINQ / цикл по ключамнет встроенного map до Go 1.21+
Подсчёт элементовCounter(lst)Map + цикл или reduceCollectors.groupingByGroupBymap[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 в одном учебном дне.