Однострочный код на Python: лаконичные решения для повседневных задач
Основные подходы к однострочному коду
Python позволяет писать компактные решения в одну строку. Это удобно для быстрых преобразований данных, но требует осторожности для сохранения читаемости.
List comprehension (списковое включение) - основной инструмент однострочной обработки списков.
Пример:
squares = [x**2 for x in range(10)]One line python (однострочный код python)
создаёт список квадратов чисел от 0 до 9. Каждый элемент вычисляется на лету.Этот подход перебирает элементы, применяет выражение и возвращает новый список. Он работает быстрее цикла for с append благодаря внутренней оптимизации.
Как преобразовать список чисел в строки?
str_numbers = list(map(str, numbers))
или str_numbers = [str(x) for x in numbers]
Оба варианта однострочные. map применяет функцию str к каждому элементу, результат оборачивается в список. List comprehension делает то же самое, но часто считается более Pythonic.
Как отфильтровать список по условию?
evens = [x for x in range(20) if x % 2 == 0]
или evens = list(filter(lambda x: x % 2 == 0, range(20)))
Фильтрация через условие после for в comprehension. filter принимает функцию-предикат и итерируемый объект, возвращает итератор.
Как применить функцию ко всем элементам без создания списка?
map(print, ['a', 'b', 'c'])
Если результат не нужен, map можно использовать для побочных эффектов (но лучше цикл for). В Python 3 map ленивый, вывод не будет напечатан без list() или цикла.
Как выполнить условное присваивание в одной строке?
result = x if condition else y
Тернарный оператор возвращает x, если condition истинно, иначе y. Часто используется внутри comprehensions.
Как проверить, что все элементы удовлетворяют условию?
all(x > 0 for x in numbers)
any(x < 0 for x in numbers)
all возвращает True, если все элементы истинны (непустые и не равны нулю). any возвращает True, если хотя бы один элемент истинен.
Как объединить два списка в словарь?
dict(zip(keys, values))
zip объединяет элементы двух списков в пары, dict создаёт словарь. Количество ключей и значений должно совпадать.
Как получить уникальные элементы списка, сохраняя порядок?
list(dict.fromkeys(lst))
dict.fromkeys создаёт словарь с ключами из списка, сохраняя порядок в Python 3.7+. Значения игнорируются, потом преобразуем в список.
Типичные ошибки и проблемы:
- Перегрузка памяти: однострочные генераторы списков создают полный список в памяти. Для больших данных лучше использовать генераторные выражения (круглые скобки вместо квадратных).
- Читаемость: цепочки из нескольких comprehensions или вложенные выражения трудно отлаживать. Рекомендуется разделять на несколько строк.
- Побочные эффекты: использование list comprehension для вывода или изменения внешних переменных - плохая практика.
- Производительность: filter+lambda может быть медленнее comprehension из-за вызова функции на каждой итерации.
- Путаница с операторами: например, not in вместо !=. Синтаксис следует проверять.
Расширенные примеры однострочного кода
Ниже приведены более сложные и нестандартные применения однострочных конструкций в Python.
FizzBuzz в одну строку
print(*['FizzBuzz' if i%15==0 else 'Fizz' if i%3==0 else 'Buzz' if i%5==0 else i for i in range(1,31)], sep='\n')
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz
Поиск палиндромов в списке
words = ['radar', 'hello', 'level', 'world', 'deified']
palindromes = [w for w in words if w == w[::-1]]
print(palindromes)
['radar', 'level', 'deified']
Слияние словарей (Python 3.9+)
d1 = {'a':1, 'b':2}; d2 = {'c':3, 'd':4}
merged = d1 | d2
print(merged)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
Транспонирование матрицы
matrix = [[1,2,3],[4,5,6]]
transposed = list(zip(*matrix))
print(transposed)
[(1, 4), (2, 5), (3, 6)]
Фильтрация строк файла
lines = [line.strip() for line in open('data.txt') if line.strip()]
print(lines[:5])
['строка1', 'строка2', ...] (зависит от файла)
Произведение элементов списка через reduce
from functools import reduce
lst = [1,2,3,4,5]
product = reduce(lambda x,y: x*y, lst, 1)
print(product)
120
Проверка всех элементов на положительность
nums = [1,2,3,0,5]
result = all(x > 0 for x in nums)
print(result)
False
Поиск первого положительного числа
data = [-1, -2, 3, -4]
first_pos = next((x for x in data if x > 0), None)
print(first_pos)
3
Сортировка по длине строки
fruits = ['banana', 'apple', 'cherry', 'date']
sorted_fruits = sorted(fruits, key=len)
print(sorted_fruits)
['date', 'apple', 'banana', 'cherry']
Генератор квадратов чётных чисел
squares = [x*x for x in range(10) if x%2==0]
print(squares)
[0, 4, 16, 36, 64]
Разворот строки
s = 'Python'
rev = s[::-1]
print(rev)
nohtyP