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

Огляд

Викладання: 15 хв
Вправи: 15 хв
Питання
  • Як я можу зробити мої програми більш читабельними?

  • Як більшість програмістів форматують свій код?

  • Як програми можуть перевірити свою роботу?

Цілі
  • Визначення основних правил стилю кодування

  • Рефакторинг односторінкових програм, щоб зробити їх більш читабельними та обґрунтувати зміни

  • Використовання стандартів кодування спільноти Python (PEP-8).

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

Стиль кодування допомагає нам краще зрозуміти код. Це допомагає підтримувати та змінювати код. Python значним чином покладається на стиль кодування, як ми можемо помітити за відступами, які ми застосовуємо до рядків для визначення різних блоків коду. Python пропонує стандартний стиль в одній із своїх перших пропозицій щодо вдосконалення Python (Python Enhancement Proposals - PEP), PEP8, і підкреслює важливість читабельності в Zen of Python.

Виділимо такі важливі моменти:

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

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

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

def calc_bulk_density(mass, volume):
    '''Return dry bulk density = powder mass / powder volume.'''
    assert volume > 0
    return mass / volume

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

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

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, якщо набір величин не наданий.

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

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

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

Допускаються порожні рядки."""

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

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

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

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.

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

Рішення

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

Очистіть цей код

  1. Прочитайте цю коротку програму та спробуйте передбачити, що вона робить.
  2. Запустіть програму: наскільки точним був ваш прогноз?
  3. Проведіть рефакторинг програми, щоб зробити її більш читабельною. Не забувайте запускати програми після кожної зміни, щоб переконатися, що її поведінка не змінилася.
  4. Порівняйте свої перетворення з результатом студента поруч. Що ви зробили так само? Що ви зробили інакше і чому?
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 += '-'
        else: new += '*'
    s=''.join(new)
    print(s)
    i += 1

Рішення

Ось одне рішення.

def string_machine(input_string, iterations):
    """
    Бере поточну input_string і генерує новий рядок із символів -'s та *'s,
   - відповідає  випадку ідентичних суміжних символів
   в противному випадку генерується символ *. Повторює цю процедуру відповідно
     заданої кількості ітерацій.
    """
    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 += '-'
            else:
                new += '*'
        print(new)
        # зберегти новий рядок як старий
        old = new     

string_machine('et cetera', 10)
et cetera
*****-***
----*-*--
---*---*-
--*-*-*-*
**-------
***-----*
--**---**
*****-***
----*-*--
---*---*-

Ключові моменти

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

  • Використовуйте рядки документів для надання вбудованої довідки