Ocean
py.user.next
Функция set_random_x() где или в чём устанавливает произвольное x? Имя функции должно описывать то, что делается внутри функции. К наружнему окружению имя функции не относится.
функция генерирует случайное действительное число, которое будет использоваться как значение переменной х
generate_random_real_x() будет звучать понятнее?
Вот мы отделили твою функцию от кода
>>> import random
>>>
>>> def set_random_x():
... ''' Return value of x from a set of real numbers'''
... multiplier = random.randrange(1, 1000, 10)
... x = round((random.random() * 2 - 1) * multiplier, 2)
... return x
...
>>> print(set_random_x())
-802.13
>>>
и тут видно, что x никуда не устанавливается, а просто выводится. При этом имя функции говорит, что x куда-то устанавливается. И куда он устанавливается? Никуда. Эта информация притянута из того контекста, где была эта функция сначала. Но тут-то контекст другой уже.
Назови её так
и тогда она подойдёт к сотням других программ с сотней других контекстов, потому что в имени говорится о том, что делается внутри функции.
С новым именем она подходит и к той программе, и к этой
>>> import random
>>>
>>> def get_random_x():
... ''' Return value of x from a set of real numbers'''
... multiplier = random.randrange(1, 1000, 10)
... x = round((random.random() * 2 - 1) * multiplier, 2)
... return x
...
>>> print(get_random_x())
-551.85
>>>
Ocean
А вот так понятнее?
def calculate_sum(n, x):
'''Element of given series expresses with formula (2k! +|x|) / (k**2)!
where:
x is real
k is natural and k is defined in the interval 1 <= k <= n
Return nth partial sums of the series '''
Опять табуляции идут. Что-то у тебя там неправильно настроено. Я об этом вот и говорю - твоё копирование вот это с табуляциями происходит с табуляциями потому, что там стоят табуляции. Когда стоят пробелы, все копирования происходят через пробелы, которые и стоят, никаких табуляций ниоткуда не появляется. И вот мы сейчас отвлекаемся на табуляцию, я пишу этот целый абзац про табуляцию вот эту, на это уходит время, естественно, чтобы её убрать и превратить в пробелы, а не обсуждаем сразу твой docstring. И смотри, допустим, я отвечаю тебе десять минут и пять из них уходят на табуляцию, а другие пять из них уходят на docstring, потом их не хватает и я добавляю ещё пять минут, чтобы про docstring дописать инфу - в итоге пятнадцать минут занимает весь ответ. Вот так время и пожирается. Занимаемся выравниванием кода, вместо того, чтобы работать с кодом. Поэтому мы ставим четыре пробела всегда, потому что с ними
никогда этих отвлечений не происходит и не надо ничего выравнивать и перевыравнивать. Ты копируешь код - и он копируется как есть. Пробелы во всех редакторах, всех программах, всех движках выглядят одинаково. А табуляция во всех местах выглядит по-разному: где-то она выглядит как четыре пробела, а где-то - как восемь, а где-то ещё как-то. В итоге код съезжает и в разных местах один и тот же вставленный из буфера код выглядит по-разному.
Вот теперь можно про docstring пописать
"""Calculate sum of series (2k! + |x|) / (k^2) where x is real, n is natural and k in [1; n]."""
Сначала мы составляем полную docstring, описываем в ней всё, чтобы было всё-всё-всё понятно и догадываться
ни до чего не приходилось, а потом мы эту полную и завершённую docstring сокращаем и утрамбовываем, выбрасывая лишние слова. В docstring обязательно должно быть написано, что означает каждый аргумент функции, что возвращается из функции (если из функции не возвращается ничего (то есть функция является процедурой), то это тоже должно быть понятно из docstring) и должен быть описан процесс работы функции - каким образом аргументы преобразуются в возвращаемое значение. При этом всём описание должно быть кратким. За подробностями процесса преобразования, если это нужно для чего-то, человек должен обращаться к коду функции уже.
Если docstring больше восьмидесяти символов (нарушает PEP8), то тогда её в многострочную docstring превращаем. Все строчки должны быть короткими, чтобы потом при просмотре хелпа они не уезжали за край экрана. Есть дураки, которые нарушают PEP8, типа “а что тут такого? это же не обязательно”, но они не в курсе, что это приводит к последствиям, о которых они даже не подозревают потом. Но и их код никто не читает, кроме них самих

Поэтому они и сидят годами в розовых очках
один на один со своим кодом.
Дальше по имени фунции
Ocean
Что будет, если в программе нужно будет считать ещё две других суммы и использовать потом все эти результаты вычислений друг с другом? Имена нужно давать так, чтобы их не приходилось переименовывать потом из-за изменившихся требований к программе в целом.
Тут заполнил всё
>>> import math
>>>
>>> def calc_sum_2k_absx_k2(n, x):
... """Calculate sum of series (2k! + |x|) / (k^2) where 1 <= k <= n.
...
... n is natural
... x is real
... """
... y = 0
... for k in range(1, n + 1):
... y += (math.factorial(2 * k) + abs(x)) / math.factorial(k ** 2)
... return y
...
>>> calc_sum_2k_absx_k2(5, 2.5)
5.606157684907805
>>>
>>> help(calc_sum_2k_absx_k2)
>>>
Help on function calc_sum_2k_absx_k2 in module __main__:
calc_sum_2k_absx_k2(n, x)
Calculate sum of series (2k! + |x|) / (k^2) where 1 <= k <= n.
n is natural
x is real
(END)
Через вызов help() мы проверяем, как выглядит docstring, потому что потом при вызове help() для всего модуля, все docstring'и будут собраны из функций модуля и будут образовывать помощь по всему модулю. От информативности docstring'ов будет зависеть понимание всего модуля в целом. Поэтому часто можно запустить help() для какого-нибудь пакета, а писал его какой-то тупой хрен. Хелп есть - а ничего не понятно. Ну, например, описаны какие-то точные типы переменных, но при этом непонятно вообще, что делает функция. Нахрен мне эти типы его? Из-за этого приходится читать документацию, а там 100500 страниц воды всякой, ненужной для работы, приходится сидеть и выуживать крупицы нужной информации, чтобы просто начать что-то делать.