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

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

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

См. также: Функции и выражения · Что такое код · Python — однострочные приёмы


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

Однострочник (one-liner) в повседневной разработке — это не обязательно «вся программа в одной строке». Чаще речь о короткой идиоматичной записи типовой операции: обмен двух переменных, разворот строки, фильтр списка, слияние словарей. Язык высокого уровня позволяет выразить намерение компактно, если вы уже знаете базовые конструкции — переменные, циклы и функции.

Отдельный смысл у однострочных команд в shell (grep, awk, perl -e) — это инструменты ОС и автоматизации, см. терминал, Bash и справочник RegEx. Здесь — приёмы внутри исходного кода на языках общего назначения.


Зачем они нужны

СитуацияПольза
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 в одном учебном дне.

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").