Форум сайта python.su
doza_andЕго можно перелить в другую ёмкость, в которой не будет пустоты при любом количестве молока в ней. А найти молоко в пакетах изначально может быть просто нереально. В магазинах такое может просто не продаваться, а свою корову негде размещать.
Вы перешли на молоко в полиэтиленовых пакетах?
Отредактировано py.user.next (Май 12, 2021 22:52:17)
Офлайн
py.user.nextЯ сделала ее, но туплю
Ocean , давай уже про сумму ей (будьласке) вторую задачу делай.
#!/usr/bin/env python3 # Calculate sum when given # n - natural number # x - real number import math import random def random_n(): n = random.randint(1, 10) # print('n=', n) return n def random_x(): multiplier = random.randrange(1, 1000, 10) x = round((random.random() * 2 - 1) * multiplier, 2) return x def is_sum(n, x): y = 0 for k in range(1, n+1): y += (math.factorial(2 * k) + abs(x)) / math.factorial(k ** 2) return y def main(): n = random_n() x = random_x() y = is_sum(n, x) print('x=', x) print('n=', n) print('y=', y) if __name__ == '__main__': main()
Отредактировано Ocean (Май 13, 2021 04:16:56)
Офлайн
Есть два взаимоисключающих правила именования функций: декларативный и императивный. Декларативное имя функции отвечает на вопрос “что делает эта функция?”. Кратко “что делает?”. Императивное имя функции отвечает на вопрос “что нужно сделать этой функции?”. Кратко “что сделать?”.
Поменяй названия функций так, чтобы каждая функция отвечала на вопрос “что сделать?” - в императивный вид. Функцию main() не трогай, так как она особенная.
Слово is в функциях означает “является …”, поэтому такие функци отвечают на вопрос “что делает?”.
В питоне функция print() переводится как “вывести”, а отвечает она на вопрос “что надо сделать этой функции?”. Если бы эта функция отвечала на вопрос “что делает эта функция?”, то она называлась бы prints() и переводилась бы как “выводит”.
То же самое касается функци filter() - “отфильтровать”.
То же самое касается функци map() - “отобразить”.
То же самое касается функци enumerate() - “перечислить”.
Отредактировано py.user.next (Май 13, 2021 09:32:17)
Офлайн
py.user.next
Переделала имена и добавила докстринги.
#!/usr/bin/env python3 # Calculate sum when given # n - natural number # x - real number import math import random def set_random_n(): ''' Return number of sequence element for calculating nth partial sums of the series''' n = random.randint(1, 10) return n 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 def calculate_sum(n, x): ''' Return nth partial sums of the series ''' y = 0 for k in range(1, n+1): y += (math.factorial(2 * k) + abs(x)) / math.factorial(k ** 2) return y def main(): n = set_random_n() x = set_random_x() y = calculate_sum(n, x) print('x=', x) print('n=', n) print('y=', y) if __name__ == '__main__': main()
Отредактировано Ocean (Май 13, 2021 12:27:36)
Офлайн
OceanЗадача поставлена точно. Любая функция имеется в виду. Но будьласка не написала, какая функция имеется в виду. А для её уровня эта функция должна быть указана, иначе она не решит эту задачу. Поэтому мы эту задачу не делаем.
А ты понимаешь точную постановку задачи №4 на скане будьласки?
Вычислить произведение отрицательных значений функции z. В какой точке (х) функция достигает максимального значения.
Мне что самой такую функцию надо придумать? Или тут в задании чего-то не хватает?
def calculate_sum(n, x): ''' Return nth partial sums of the series '''
Отредактировано py.user.next (Май 13, 2021 22:22:25)
Офлайн
py.user.nextУ меня везде табуляции, это при переносе сюда подправляла руками иногда.
Дальше по отступам
У тебя используются и табуляции, и четыре пробела. Нужно использовать что-то одно. Табуляции хороши тем, что это один байт. Но табуляции плохи тем, что их отображение нужно настраивать в каждой среде редактирования кода (если есть такая возможность), иначе они по умолчанию слишком широкие (восемь пробелов обычно) и пара-тройка уровней вложенности уезжает далеко и надолго за край экрана в разных системах отображения кода. Пробелы хороши тем, что не требуют настройки в разных средах редактирования кода. Пробелы плохи тем, что занимают по четыре байта и таким образом тратят память на диске (четыре байта на один отступ).
Используем четыре пробела везде.
py.user.nextСпасибо, стало все понятно)
Задача поставлена точно. Любая функция имеется в виду. Но будьласка не написала, какая функция имеется в виду. А для её уровня эта функция должна быть указана, иначе она не решит эту задачу. Поэтому мы эту задачу не делаем.
Условие задачи не запрещает нам выдумывать любые недостающие данные. Поэтому задач тут можно наплодить бесконечное множество. И таких задач можно наплодить даже без этой задачи, а просто сами по себе.
py.user.nextфункция генерирует случайное действительное число, которое будет использоваться как значение переменной х
Дальше по именам
Функция set_random_x() где или в чём устанавливает произвольное x? Имя функции должно описывать то, что делается внутри функции. К наружнему окружению имя функции не относится.
py.user.next
Дальше по комментариям
Вот я прочитал заголовок функции и её комментарий и не понял, что такое n и x. Точно не могу сказать, связаны ли n из аргумента и nth из комментария. И про какой именно ряд речь идёт, тоже не понял.
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 '''
Отредактировано Ocean (Май 14, 2021 13:07:47)
Офлайн
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 >>>
get_random_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Опять табуляции идут. Что-то у тебя там неправильно настроено. Я об этом вот и говорю - твоё копирование вот это с табуляциями происходит с табуляциями потому, что там стоят табуляции. Когда стоят пробелы, все копирования происходят через пробелы, которые и стоят, никаких табуляций ниоткуда не появляется. И вот мы сейчас отвлекаемся на табуляцию, я пишу этот целый абзац про табуляцию вот эту, на это уходит время, естественно, чтобы её убрать и превратить в пробелы, а не обсуждаем сразу твой docstring. И смотри, допустим, я отвечаю тебе десять минут и пять из них уходят на табуляцию, а другие пять из них уходят на docstring, потом их не хватает и я добавляю ещё пять минут, чтобы про docstring дописать инфу - в итоге пятнадцать минут занимает весь ответ. Вот так время и пожирается. Занимаемся выравниванием кода, вместо того, чтобы работать с кодом. Поэтому мы ставим четыре пробела всегда, потому что с ними никогда этих отвлечений не происходит и не надо ничего выравнивать и перевыравнивать. Ты копируешь код - и он копируется как есть. Пробелы во всех редакторах, всех программах, всех движках выглядят одинаково. А табуляция во всех местах выглядит по-разному: где-то она выглядит как четыре пробела, а где-то - как восемь, а где-то ещё как-то. В итоге код съезжает и в разных местах один и тот же вставленный из буфера код выглядит по-разному.
А вот так понятнее?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 '''
"""Calculate sum of series (2k! + |x|) / (k^2) where x is real, n is natural and k in [1; n]."""
OceanЧто будет, если в программе нужно будет считать ещё две других суммы и использовать потом все эти результаты вычислений друг с другом? Имена нужно давать так, чтобы их не приходилось переименовывать потом из-за изменившихся требований к программе в целом.def calculate_sum(n, x):
>>> 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)
Отредактировано py.user.next (Май 16, 2021 10:58:20)
Офлайн
py.user.nextДа, теперь поняла! Если я буду делать как ты сказал, то я просто готовую функцию импортирую(или скопирую) и все. А если оставлю контекст, то мне надо будет каждый раз ее подтачивать руками, когда вздумаю использовать еще раз. Офигенно! Взяла на заметку.
и тут видно, что x никуда не устанавливается, а просто выводится. При этом имя функции говорит, что x куда-то устанавливается. И куда он устанавливается? Никуда. Эта информация притянута из того контекста, где была эта функция сначала. Но тут-то контекст другой уже.
Назови её так и тогда она подойдёт к сотням других программ с сотней других контекстов, потому что в имени говорится о том, что делается внутри функции.
py.user.nextОбещаю, это последний раз. Работаем именно с кодом, а не моими тупняками и настройками блокнота.
Опять табуляции идут. Что-то у тебя там неправильно настроено. И вот мы сейчас отвлекаемся на табуляцию, я пишу этот целый абзац про табуляцию вот эту, на это уходит время, естественно, чтобы её убрать и превратить в пробелы, а не обсуждаем сразу твой docstring. И смотри, допустим, я отвечаю тебе десять минут и пять из них уходят на табуляцию, а другие пять из них уходят на docstring, потом их не хватает и я добавляю ещё пять минут, чтобы про docstring дописать инфу - в итоге пятнадцать минут занимает весь ответ. Вот так время и пожирается. Занимаемся выравниванием кода, вместо того, чтобы работать с кодом.
py.user.nextТы очень интересно ужал докстрингу. Получается, что не нужно добавлять что возвращает отдельным предложением, потому что сразу в лоб указано Calculate sum of series. Тут придется тоже попотеть, чтобы мозг переключится на иной стиль мышления. Спасибо за подсказку. Очень ценный пример.
Сначала мы составляем полную docstring, описываем в ней всё, чтобы было всё-всё-всё понятно и догадываться ни до чего не приходилось, а потом мы эту полную и завершённую docstring сокращаем и утрамбовываем, выбрасывая лишние слова
py.user.nextА как это описать правильно для процедуры, что ничего не возвращается при вызове?
что возвращается из функции (если из функции не возвращается ничего (то есть функция является процедурой), то это тоже должно быть понятно из docstring)
py.user.nextЗапомнила. Спасибо большое!
Если docstring больше восьмидесяти символов (нарушает PEP8), то тогда её в многострочную docstring превращаем. Все строчки должны быть короткими, чтобы потом при просмотре хелпа они не уезжали за край экрана. Есть дураки, которые нарушают PEP8, типа “а что тут такого? это же не обязательно”
py.user.nextО, еще одно большое спасибо. Я поняла! Теперь до меня дошло! Я встречала в рекомендациях и в книгах, но мне не было понятно. Звучало противоречием, а ты прямо по полочкам мне в голове разложил:
Что будет, если в программе нужно будет считать ещё две других суммы и использовать потом все эти результаты вычислений друг с другом?
py.user.nextЗапомнила, буду всегда проверять.
Через вызов help() мы проверяем, как выглядит docstring, потому что потом при вызове help() для всего модуля, все docstring'и будут собраны из функций модуля и будут образовывать помощь по всему модулю.
py.user.nextТы про такое говоришь или это ок?
Хелп есть - а ничего не понятно. Ну, например, описаны какие-то точные типы переменных, но при этом непонятно вообще, что делает функция. Нахрен мне эти типы его? Из-за этого приходится читать документацию, а там 100500 страниц воды всякой, ненужной для работы, приходится сидеть и выуживать крупицы нужной информации, чтобы просто начать что-то делать.
def suggest_places(auth_key, city): """Returns longitude and latitude of first suggested location in the Netherlands from Postcode API. :param auth_key: authorization key for Postcode API :type auth_key: str :param city: textual input for city names to match in Postcode API :type city: str :rtype: (str, str), str, str :return: (longitude, latitude), Postcode API status code, Postcode API error message
Офлайн
OceanТы просто текст всего комментария переделываешь так, чтобы было ясно, что функция (процедура) ничего не возвращает.py.user.nextА как это описать правильно для процедуры, что ничего не возвращается при вызове?
если из функции не возвращается ничего (то есть функция является процедурой), то это тоже должно быть понятно из docstring
Указать, что Return None или как правильно? Я гуглила про это и не нашла ответа или примеров.
>>> def f(n): ... """Print n numbers to the screen.""" ... print(*range(n)) ... >>> f(5) 0 1 2 3 4 >>> >>> help(f) >>>
f(n)
Print n numbers to the screen.
(END)
OceanЭто вообще похоже на автоперевод. Знаешь, бывает так, что проекты переводят с одного языка на другой. Естественно, для большей части кода пишутся трансляторы. Что-то совсем уж сложное переводится руками. И вот эти трансляторы транслируют комментарии напрямую. И комментарии из того языка, где эти типы важны, попадают в язык, где эти типы нафиг не нужны. А автоматом это не переведёшь, так как слишком сложная семантика, чтобы транслятор такой написать можно было. Вот они и переводят напрямую и оставляют так. Оно типа кушать не просит и не нарушает понимание. А тем, что здесь много лишних слов, просто пренебрегают и не тратят время на корректирование.
Я прост видела во многих статьях такого рода примеры многострочных докстрингов.def suggest_places(auth_key, city): """Returns longitude and latitude of first suggested location in the Netherlands from Postcode API. :param auth_key: authorization key for Postcode API :type auth_key: str :param city: textual input for city names to match in Postcode API :type city: str :rtype: (str, str), str, str :return: (longitude, latitude), Postcode API status code, Postcode API error message
Отредактировано py.user.next (Май 16, 2021 11:34:23)
Офлайн
py.user.nextПоняла!
Бывает и такое, что функция возвращает и None в качестве значения. Это выглядит так, будто она ничего не вернула. А на самом деле это функция, которая в числе возвращаемых значений может и None вернуть. Тогда это пишется явно - “функция возвращает None тогда-то”, а в теле функции такие None'ы всегда возвращаются через return, а не через окончание работы функции.
py.user.nextЯ не знаю можно ли тут ссылки давать на внешние источники. Если нет, то моментально удалю.
Это вообще похоже на автоперевод. Знаешь, бывает так, что проекты переводят с одного языка на другой.
py.user.nextСпасибо! Буду учиться по этим комментариям.
Вот источник комментариев тебе
https://github.com/python/cpython/tree/main/Lib
py.user.nextПоняла и накрепко запомнила. Спасибо огромное.
А вот эту Java'шную херню не надо принимать за пример, так как она тебе просто засрёт мозги и ты будешь очень хорошо знать, как на питоне хорошо писать в Java-стиле, который в питоне нафиг не упал.
Офлайн