Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Код в одну строку на Python: когда коротко — это читаемо

💻 Информатика · 9 класс

Условные выражения, lambda и генераторные выражения помогают писать короткий читаемый код. Разбираем их назначение и случаи, когда обычный цикл понятнее.

Программный код на экране
Программный код на экранеMartin Vorel · Wikimedia Commons · CC BY-SA 4.0

Что такое однострочник и когда он уместен

В Python есть конструкции, заменяющие короткий цикл: генераторы списков, условные выражения, lambda-функции, генераторные выражения. Одна аккуратная строка читается лучше, чем четырёхстрочный цикл с append, — но только пока правило преобразования простое. Сжимать любую программу ради краткости не нужно: читаемость важнее числа строк. Официальный учебник (docs.python.org, актуальная ветка Python 3) прямо называет генератор списка более краткой и читаемой записью такого цикла.

Генератор списка как знакомый однострочник

Запись [выражение for элемент in последовательность if условие] сразу строит список. Преобразования и фильтры подробно разобраны в уроке о генераторах списков. Здесь разберём другие короткие конструкции и выбор между ними.

Пример 1. Условное выражение

def grade_label(mark):
    if type(mark) is not int or mark < 0 or mark > 100:
        raise ValueError('оценка должна быть целым числом от 0 до 100')
    return 'сдано' if mark >= 40 else 'не сдано'

Запись 'сдано' if mark >= 40 else 'не сдано' — это условное выражение, а не полноценный if. Оно подходит, когда обе ветки сводятся к одному значению. Сначала проверяются тип и диапазон: при mark равном 101, -1, строке или дроби функция отклоняет значение через ValueError ещё до вычисления метки. Проверено выполнением: grade_label(40) даёт 'сдано', grade_label(39) — 'не сдано'.

Пример 2. lambda и генераторные выражения

def by_length(words):
    return sorted(words, key=lambda w: len(w))

def has_long_word(words, limit=8):
    return any(len(w) > limit for w in words)

lambda w: len(w) — маленькая безымянная функция; здесь она подсказывает sorted, по какому признаку сортировать: by_length(['лира', 'кот', 'я']) вернёт ['я', 'кот', 'лира']. Генераторное выражение any(len(w) > limit for w in words) не строит список в памяти: элементы проверяются по одному, и any останавливается при первом же длинном слове. По пустому списку has_long_word([]) возвращает False — это поведение any. У all([]) другой результат — True: нет ни одного ложного элемента.

Где проходит граница

Однострочник уместен, когда правило читается слева направо без напряжения: «возьми, отфильтруй, преобразуй». Если внутри нужны побочные действия — печать, запись в файл, несколько ветвлений, — обычный цикл честнее и понятнее. Глубоко вложенные генераторы тоже лучше развернуть. eval() вычисляет выражение из строки, exec() выполняет код из строки. Для этих однострочников они не нужны; выполнять через них недоверенные строки опасно.

Проверь себя

  1. Что вернёт [x for x in range(4) if x % 2 == 0]? Ответ: [0, 2] — условие оставляет чётные числа.
  2. Как одной строкой записать список длин слов из words? Ответ: [len(w) for w in words].
  3. Что выведет print('сдано' if 35 >= 40 else 'не сдано')? Ответ: не сдано (без кавычек) — условие ложно, выбирается часть после else.
  4. Что вернёт has_long_word([]) и почему? Ответ: False — any по пустой последовательности не находит ни одного истинного значения.
  5. Чем генераторное выражение отличается от генератора списка? Ответ: список создаётся сразу, а генератор вычисляет элементы по мере запроса и не хранит готовый список.

Кратко о главном

Однострочник — инструмент для простого «преобразуй и отфильтруй», а не способ сделать программу короче любой ценой. Генератор списка читается как [выражение for ... if ...], условное выражение — как значение if условие else значение. lambda задаёт короткую функцию из одного выражения; генераторное выражение вычисляет элементы по мере запроса.

Источники и материалы