Опубликован: 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
.
# этот код тоже работает, но он 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
Комментариев нет.