Логические выражения if ... else в Pythonic стиле

Опубликован: 06.12.2023 102

Среди Python - сообщества существует такое понятие как Pythonic, которое означает стиль кода: короткий, чистый, простой для понимания, соответствующий рекомендациям по написанию кода PEP8.

При этом, Pythonic - это стиль программирования, использующий максимально все возможности языка по написанию простого и быстро исполняемого кода, такие как: множественное присваивание, Comprehension, Context manager, генераторы, передача в функцию нескольких аргументов и др.

Согласно PEP8 - в логических конструкциях if ... else лучше использовать тот факт, что пустая последовательность (строка, список, кортеж, словарь, множество и т.п.) есть False.

Это означает, что не нужно проверять длину последовательности, чтобы убедиться в наличии в ней элементов, достаточно проверить объект как логическое выражение.

Объекты, которые приравниваются к False.

В Python по умолчанию все не пустые объекты имеют истинное значение True. Это позволяет сделать код лаконичным и интуитивно понятным.

И наоборот, все пустые объекты и нули приравниваются к False:

  • __ пустые__ последовательности и коллекции: список [], кортеж (), словарь {}, множество set(), строка "", диапазон range(0);

  • нули любых числовых типов: int 0, float 0.0, complex 0j;

  • константы: None и False.

Примеры логических конструкций в Pythonic стиле.

# этот код тоже работает, но он unPythonic
if len(list_a) > 0: 
    print(f"Список: {list_a} не пустой")

if string != '':
    print(f"Строка: {string} не пуста")

# --------------------------------------------------
# А вот пример конструкции if в стиле Pythonic

if list_a:    # пустой список соответствует False
    print(f"Список: {list_a} не пустой")

if string:    # пустая строка преобразуется в False
    print(f"Строка: {string} не пустая")

Другим не менее элегантным лайфхаком при написании логических выражений является использование в конструкции if ... else оператора in, который позволяет проверить наличие какого-либо элемента в последовательности (списке, кортеже и т.п.), вместо выстраивания длинных логических цепочек сравнения отдельных значений.

# Вместо длинных логических выражений (unPythonic)
if x == "country_1" or x == "country_2" or x == "country_3":
    do_some_thinks()

# Лучше использовать в конструкции if  оператор in (Pythonic)
if x in ["country_1", "country_2", "country_3"]:
    do_some_thinks()

# Такой код тоже работает, но он плохо понимается (unPythonic)
if string.find(substring) != -1:
    print(f"Подстрока {substring} найдена в строке {string}")

# Лучше тоже самое записать в стиле Pythonic
if substring in string:     # поиск подстроки в строке
    print(f"Подстрока {substring} найдена в строке {string}")

В конструкциях if ... else, в соответствии с Pythonic стилем, также можно использовать "моржовый" оператор ( := ), который позволяет присваивать значение переменной и тут же его возвращать.

Такой способ делает код более лаконичным, а присвоенное оператором ( := ) значение можно сразу же использовать в блоке кода, следующем после конструкции if ... else.

# Использование моржового оператора в конструкции if (Pythonic style)
if (x := "Abcdef") != "":
    print(f"Строка {x} повторяется {(n := 3)} раза {x * n}")

Строка Abcdef повторяется 3 раза AbcdefAbcdefAbcdef

Похожие посты

Оценка основных статистических метрик набора данных в Python

Область эффективного использования lambda функции в Python

Способы удаления лишних пробелов в строке

Использование аннотации типов в Python

Комментариев нет.