Стиль програмування

Останнє оновлення 2026-07-01 | Редагувати цю сторінку

Огляд

Питання

  • Як я можу зробити свої програми більш читабельними?
  • Як більшість програмістів форматують свій код?
  • Яким чином програми можуть самостійно перевіряти, що вони працюють правильно?

Цілі

  • Дотримуйтесь основних правил стилю кодування.
  • Виконуйте рефакторинг односторінкових програм, щоб зробити їх більш читабельними та обґрунтувати зміни.
  • Дотримуйтесь стандартів кодування, прийнятих у спільноті користувачів Python (PEP-8).

Стиль кодування


Дотримання послідовного стилю кодування сприяє кращому розумінню коду іншими особами (зокрема нами самими в майбутньому). Код читається набагато частіше, ніж пишеться, і, як стверджує Дзен Python, “читабельність має значення”. Стандартний стиль для Python було запропоновано в одному з перших документів PEP (Python Enhancement Proposal), PEP8.

Варто відзначити такі моменти:

  • документуйте ваш код, чітко зазначаючи припущення, внутрішні алгоритми, очікувані вхідні та вихідні дані тощо
  • використовуйте зрозумілі, змістовні назви змінних
  • для відступів використовуйте пробіли, а не табуляцію (табуляція може призводити до проблем у різних текстових редакторах, операційних системах і системах контролю версій)

Дотримуйтеся стандартного стилю Python у своєму коді.


  • PEP8: рекомендації зі стилю Python, що описують такі аспекти, як назви змінних, відступи в коді, структуру операторів import тощо. Дотримання стандарту PEP8 сприяє кращому розумінню коду іншими розробниками Python, а також розумінню того, яким має бути формат їхнього внеску.
  • Щоб перевірити свій код на відповідність PEP8, можна використовувати [застосунок pycodestyle](https://pypi.org/project/pycodestyle/, який повідомляє про порушення стилю. Такі інструменти, як black code formatter, можуть автоматично виправити форматування коду відповідно до PEP8 (для Jupyter notebook існує nb_black).
  • Деякі групи та організації застосовують інші стандарти стилю, відмінні від PEP8. Наприклад, настанови Google зі стилю Python містять дещо інші рекомендації. Google створила застосунок під назвою yapf, який може допомогти вам форматувати код відповідно до стилю Google або PEP8.
  • Щодо стилю кодування, ключовим фактором є послідовність. Оберіть стиль для свого проєкту (PEP8, стиль Google або інший) і подбайте про те, щоб ви та інші учасники команди дотримувалися його. Послідовність у проєкті зазвичай впливає сильніше, ніж вибір конкретного стилю. Послідовний стиль полегшує читання та розуміння коду іншими розробниками, а також вами самими в майбутньому.

Застосовуйте твердження для виявлення внутрішніх помилок.


Твердження (assertions) — простий, але дієвий спосіб переконатися, що контекст виконання коду відповідає вашим очікуванням.

PYTHON

def calc_bulk_density(mass, volume):
    '''Повертає щільність сухої речовини = маса / об'єм.'''
    assert volume > 0
    return mass / volume

Якщо твердження має значення False, інтерпретатор Python викличе виняток AssertionError під час виконання програми. Вихідний код виразу, що спричинив помилку, виводиться як частина повідомлення про помилку. Щоб ігнорувати твердження у вашому коді, запустіть інтерпретатор з опцією ‘-O’ (оптимізація). Твердження повинні містити лише прості перевірки та ніколи не змінювати стан програми. Наприклад, твердження ніколи не повинне містити присвоєння.

Використовуйте рядки документації (docstrings) для створення вбудованої довідки.


У випадку, коли першим елементом тіла функції є рядок символів, який не присвоєно жодній змінній, Python автоматично прив’язує його до функції у вигляді атрибута. Цей атрибут стає доступним за допомогою вбудованої функції help. Цей рядок, що забезпечує документацію, також відомий як docstring.

PYTHON

def average(values):
    "Повертає середнє значення або None, якщо значення не надано."

    if len(values) == 0:
        return None
    return sum(values) / len(values)

help(average)

ВИВІД

Help on function average in module __main__:

average(values)
    Повертає середнє значення або None, якщо значення не надано.
Примітка

Багаторядкові рядки

Часто для документації використовуються багаторядкові рядки. Такі рядки починаються трьома символами лапок (одинарними чи подвійними) та закінчуються трьома відповідними символами.

PYTHON

"""Цей рядок охоплює
кілька рядків.

Порожні рядки дозволені."""
Обговорення

Що буде показано?

Виділіть в коді нижче рядки, які будуть доступні як онлайн-довідка. Чи є рядки, які мають бути доступні, але не будуть зображатися? Чи призведе якийсь із рядків до синтаксичної помилки або помилки виконання?

PYTHON

"Знаходить максимальну відстань редагування між кількома послідовностями."
# Знаходить максимальну відстань між усіма послідовностями.

def overall_max(sequences):
    '''Визначає загальну максимальну відстань редагування.'''

    highest = 0
    for left in sequences:
        for right in sequences:
            '''Уникаємо порівняння послідовності із самою собою.''
            if left != right:
                this = edit_distance(left, right)
                highest = max(highest, this)

    # Повертаємо результат.
    return highest
Вправа

Створюємо документацію

Застосовуйте коментарі для опису та пояснення розділів коду або окремих рядків, що можуть бути неінтуїтивно зрозумілими для інших. Вони є особливо корисними для будь-кого, хто матиме потребу зрозуміти та відредагувати ваш код у майбутньому, зокрема для вас самих.

Застосовуйте рядки документації для опису допустимих вхідних даних та очікуваних вихідних даних методу чи класу, а також їхнього призначення, припущень і передбачуваної поведінки. Рядки документації зображаються, коли користувач викликає вбудований метод help для вашого методу або класу.

Перетворіть коментар у наступній функції на рядок документації та переконайтеся, що команда help правильно його відображає.

PYTHON

def middle(a, b, c):
    # Повертає середнє значення для трьох величин.
    # Передбачається, що значення можна порівняти.
    values = [a, b, c]
    values.sort()
    return values[1]

PYTHON

def middle(a, b, c):
    '''Повертає середнє значення для трьох величин.
    Передбачається, що значення можна порівняти.'''
    values = [a, b, c]
    values.sort()
    return values[1]
Вправа

Зробіть цей код більш зрозумілим

  1. Прочитайте цю коротку програму та спробуйте передбачити, що вона робить.
  2. Запустіть її: наскільки точним було ваше передбачення?
  3. Переробіть програму, щоб зробити її більш читабельною. Не забувайте запускати її після кожної зміни, щоб переконатися, що її поведінка не змінилася.
  4. Порівняйте свій код з результатом когось іншого. Що ви зробили так само? Що ви зробили інакше і чому?

PYTHON

n = 10
s = 'et cetera'
print(s)
i = 0
while i < n:
    # print('at', j)
    new = ''
    for j in range(len(s)):
        left = j-1
        right = (j+1)%len(s)
        if s[left]==s[right]: new = new + '-'
        else: new = new + '*'
    s=''.join(new)
    print(s)
    i += 1

Ось один з варіантів рішення.

PYTHON

def string_machine(input_string, iterations):
    """
    На вхід поступає input_string. Далі генерується новий рядок із символами "-" та "*",
    що відповідають символам, які мають або не мають ідентичні сусідні
    символи, відповідно. Ця процедура повторюється з отриманими рядками з
    попереднього кроку задану кількість разів.
    """
    print(input_string)
    input_string_length = len(input_string)
    old = input_string
    for i in range(iterations):
        new = ''
        # перебираються символи в рядку old.
        for j in range(input_string_length):
            left = j-1
            right = (j+1) % input_string_length  # перший символ є суміжним для останнього
            if old[left] == old[right]:
                new = new + '-'
            else:
                new = new + '*'
        print(new)
        # Рядок new зберігається як old
        old = new     

string_machine('et cetera', 10)

ВИВІД

et cetera
*****-***
----*-*--
---*---*-
--*-*-*-*
**-------
***-----*
--**---**
*****-***
----*-*--
---*---*-
Ключові моменти
  • Дотримуйтеся стандартного стилю Python у своєму коді.
  • Використовуйте рядки документів для надання вбудованої довідки.