Это старая версия Информатика/Архив/2019/9Д/ПравилаНаписанияПрограмм за 12.10.2018 10:41 под редакцией IlyaRayko.
Просмотр кода страницы Правила Написания Программ страница
== Требования к программам ==
=== Преамбула ===
Сформулированные ниже правила базируются на следующих документах:
1. PEP20. The Zen of Python (Дзен Питона). Если Вы программируете как-то иначе, то скорее всего Вы программируете не на Python. ((https://www.python.org/dev/peps/pep-0020/ Оригинал)) и ((https://tyapk.ru/blog/post/the-zen-of-python перевод)).
1. Общешкольные правила оформления программ. Если угодно, корпоративная этика. Сравнивать можно с ((https://server.179.ru/wiki/?page=DMA_Fr_F_Bl_2d_N этими)) и ((https://server.179.ru/wiki/?page=d_WZ_Ck_F7_1g_84_6 этими)).
1. PEP8. Style Guide for Python Code (Руководство по стилю кода на Python). Ejudge автоматически проверяет сдаваемые код на соответствие с этим руководством. Для автоматической проверки можно использовать утилиту ##pycodestyle## (иногда она распространяется под старым именем ##pep8##). Ejudge запускает её так: %%
pep8.py -r --show-source --ignore=W391,E251,E501,W292,W291,W293
%% ((https://www.python.org/dev/peps/pep-0008/ Оригинал)) и ((https://very-good-academic-fashion-translations-of-all-peps.com перевод)).
1. PEP257. Docstring Conventions (Соглашение о строках с документацией). Регулируют правила оформления ##docstrings##. Это тот самый текст, который выводить функция ##help##. ((https://www.python.org/dev/peps/pep-0257/ Оригинал)) и ((https://very-good-academic-fashion-translations-of-all-peps.com перевод)).
1. PEP3107. Function Annotations (Аннотации функций). Регламентирует аннотации к функциям. Поскольку они обязательны для **ВСЕХ** функций, то стоит ознакомиться и не забывать. ((https://www.python.org/dev/peps/pep-3107/ Оригинал)) и ((https://very-good-academic-fashion-translations-of-all-peps.com перевод)).
1. ((https://www.gnu.org/prep/standards/standards.html Правила написания кода проекта GNU.)) Большой сложный документ, охватывающий почти все возможные и невозможные случаи. Основной минус: они написаны для C/C++, поэтому некоторые технические детали к нам не относятся. Стоит обратить внимание на разделы ((https://www.gnu.org/prep/standards/standards.html#Semantics 4.2)), ((https://www.gnu.org/prep/standards/standards.html#Errors 4.4)), ((https://www.gnu.org/prep/standards/standards.html#Memory-Usage 4.11)), ((https://www.gnu.org/prep/standards/standards.html#File-Usage 4.12)), ((https://www.gnu.org/prep/standards/standards.html#Formatting 5.1)), ((https://www.gnu.org/prep/standards/standards.html#Comments 5.2)), ((https://www.gnu.org/prep/standards/standards.html#Names 5.4)), ((https://www.gnu.org/prep/standards/standards.html#Doc-Strings-and-Manuals 6.2)).
Так же советую обратить внимание на следующие утилиты: ((https://docs.python.org/3.5/library/pdb.html pdb)), ((https://www.pylint.org/ pylint)), ((http://flake8.pycqa.org/en/latest/ flake)).
**Следующий текст постепенно приходит к окончательному виду. Пока тут остаётся этот комментарий текст ниже может быть неполным и противоречивым.**
==== Символы и отступы ====
Величина отступа – четыре пробела. Использование символа табуляции (символа, с кодом 9) запрещается.
Последняя строка должна завершаться символом конца строки. Пустых строк в конце файла быть не должно. В конце любой строки не должно быть пробелов.
Функции должны отделяться двумя пустыми строками. Отдельные смысловые блоки в программе должны отделяться пустыми строками.
==== Имена переменных ====
Имена переменных, функций, типов должны быть осмысленными и отражать назначение. Слишком длинные имена, однако, не рекомендуются. В именах допускаются сокращения, которые не затрудняют понимание имени и назначения функций и переменных.
Допускается использование односложных имен переменных для счетчиков (i, j, k), а также если это имя фигурирует в условии задачи (N, M, K, L).
В именах должны использоваться только английские слова. Транслитерации русских слов не допускаются. Запрещается использование символов, отличных от латинских букв, цифр и символа подчеркивания.
Если имя переменной или функции состоит из нескольких слов, то они должны разделяться символом подчеркивания или заглавными буквами. Например:
Calc****Sqrt – допустимо
calc_sqrt – божественно
calculate_square_root – допустимо, но нежелательно (слишком длинное имя)
vychislenie_kornya – недопустимо (используются русские имена)
f – недопустимо (непонятно назначение функции)
Обычно в качестве имён функций и переменных используются одно или несколько слов (или их сокращений) маленькими буквами с разделением символом подчёркивания.
Например, result, factorial, calc_factorial(n), calc_fact(n), iter, find_next_value(), apples_num и т.д. Для перевода слов можно использовать словари ((http://www.multitran.ru/ мультитран)) или ((http://slovari.yandex.ru/ словари Lingvo на яндексе))
Имена констант записываются полностью заглавными буквами. Если имя константы состоит из нескольких слов, для их разделения используются подчеркивания. Например, EPSILON, MAX_SIZE.
Имена массивов и названия типов структур должны записываться с заглавной буквы.
==== Арифметические операции ====
В одной строчке записывается одна арифметическая операция. Например:
%%(php)
a = b
b = c
%%
Бинарные операции разделяются пробелом. После запятой ставится пробел. Между именем функции и скобками пробел не ставится, с внутренней стороны скобок пробелы не ставятся
%%(php)
a = b + 2 * c
a = (b + 2) * c
print(a, b, sep = "")
%%
==== Использование констант ====
Не допускается использование чисел в программе, значение которых неочевидно. Например, запись while i < 179 или c = c + 32 недопустима.
==== Длина строки и переносы ====
Длина каждой строки не должна превышать 79 символов, а длина строки с комментарием — 72. Переносы длинных строк могут выглядеть так:
%%(php)
# Aligned with opening delimiter
foo = long_function_name(var_one, var_two,
var_three, var_four)
# More indentation included to distinguish this from the rest.
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
%%
==== Отделение операторов пробелами ====
Пробелы не ставятся, если они примыкают к скобкам изнутри:
%%(php)
Yes: spam(ham[1], {eggs: 2})
No: spam( ham[ 1 ], { eggs: 2 } )
%%
Пробелы не ставятся перед знаками препинания:
%%(php)
Yes: if x == 4: print x, y; x, y = y, x
No: if x == 4 : print x , y ; x , y = y , x
%%
Пробелы не ставятся перед скобкой у функций или у списков:
%%(php)
Yes: spam(1)
No: spam (1)
Yes: dict['key'] = list[index]
No: dict ['key'] = list [index]
%%
Бинарные операции обычно отделяются одним пробелом слева и справа. Однако, если в выражении есть операции разного приоритета (например, сложение и умножение, или сложение и возведение в степень), то пробелы у операции с бОльшим приоритетом могут быть пропущены. В любом случае количество пробелов слева и справа от оператора должно быть одинаковым.
%%(php)
Yes: i = i + 1
Yes: submitted += 1
Yes: x = x*2 - 1
Yes: hypot2 = x*x + y*y
Yes: c = (a+b) * (a-b)
No: i=i+1
No: submitted +=1
No: x = x * 2 - 1
No: hypot2 = x * x + y * y
No: c = (a + b) * (a - b)
%%