Форум сайта python.su
0
Здравствуйте. Имею функцию (в будущем не одну), которая на основании нескольких параметров вычисляет несколько значений. Не понимаю как в python вернуть несколько значений так, чтобы не вспоминать либо их названий (если это словарь), либо их положения относительно друг друга. Например в чем-нибудь типа СИ я бы вернул структуру, а автодополнение IDE помогло мне бы через пару дней не забыть названия параметров и обращаться к ним через точку. Есть подозрение что можно использовать класс, но как он себя ведет объект в таких ситуациях, да и создавать класс чтобы использовать во внешней функции только для того чтобы записать результаты…
PS. Да и входящими параметрами местами такие же проблемы, использовать отдельные переменные для входящих параметров… их бывает слишком много… создвать два класса для входящих и исходящих значеий… да и как создавать, как свойства заполнять? вроде же заранее не объявишь… а опять запоминать имена всех входящий значений… не всегда выходит
Отредактировано mirrok (Июнь 2, 2019 01:46:15)
Офлайн
857
mirrokПриведи конкретный пример такой функции. Есть разные способы построения функций, но не каждый из них подходит под каждый случай.
которая на основании нескольких параметров вычисляет несколько значений
mirrokНу да, можно вернуть структуру типа Point(x, y), но можно и вернуть структуру-свалку из малоотносящихся друг к другу объектов, из-за чего потом иметь трудности со вспоминанием содержимого структуры. Случаи разные все, хоть и бывают похожи.
Например в чем-нибудь типа СИ я бы вернул структуру
Отредактировано py.user.next (Июнь 2, 2019 03:57:47)
Офлайн
0
def linear_overload(W, JM, A, T): A12 = JM / 2 B1 = math.exp(JM * W * T / 2) B2 = A / (W * math.sqrt(1.0 + JM ** 2)) cos_jmt = math.cos(JM * T) sin_jmt = math.sin(W * T) Z = B2 * (1.0 - B1 * (cos_jmt + A12 * sin_jmt)) / JM Z1 = B2 * (1.0 + A12 ** 2) * B1 * sin_jmt Z2 = A * B1 * (cos_jmt - A12 * sin_jmt) return Z, Z1, Z2
Офлайн
857
mirrok
кортеж же возвращает только значения
return (('val1', z), ('val2', z1), ('val3', z3))
>>> def f(): ... """I am f() and have no args.""" ... return 1 ... >>> help(f) f() I am f() and have no args.
>>> def pow2(n): ... """Return n^2.""" ... return n * n ... >>> pow2(10) 100 >>> help(pow2) pow2(n) Return n^2.
Отредактировано py.user.next (Июнь 2, 2019 12:33:58)
Офлайн
0
Вроде нашел что-то похожее на структуры namedtuple. Вроде нормально работают, а для входящих данных pyCharm предложил указывать тип переменных после двоеточия. В подсказке отображаются. А вот докстринги в подсказке не отображаются… Благодарю за помощь, без ключевых слов из ваших сообщений до namedtuple не догуглил бы…
Офлайн
253
много функций, много аргументов, много возвращаемых значений…. Все это трудно запомнить.
namedtuple, словари и подсказки ide слабо помогают в этом случае.
Это классика. Такое обычно бывает при непродуманности архитектуры программной системы. Аргументы функций и группы возвращаемых значений можно собрать в объекты имеющие понятный смысл. Может быть использовать наследование. Часть функций сделать методами (тогда функции с одинаковыми аргументами сгруппируются).
Обычно после этого вообще нет проблем с запоминанием.
Очевидно что вам смогут помочь двинуться в этом направлении если вы опишете тут вашу кучу функций.
Офлайн