Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2019 01:37:58

mirrok
Зарегистрирован: 2019-06-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно вернуть несколько и не сломать мозг

Здравствуйте. Имею функцию (в будущем не одну), которая на основании нескольких параметров вычисляет несколько значений. Не понимаю как в python вернуть несколько значений так, чтобы не вспоминать либо их названий (если это словарь), либо их положения относительно друг друга. Например в чем-нибудь типа СИ я бы вернул структуру, а автодополнение IDE помогло мне бы через пару дней не забыть названия параметров и обращаться к ним через точку. Есть подозрение что можно использовать класс, но как он себя ведет объект в таких ситуациях, да и создавать класс чтобы использовать во внешней функции только для того чтобы записать результаты…
PS. Да и входящими параметрами местами такие же проблемы, использовать отдельные переменные для входящих параметров… их бывает слишком много… создвать два класса для входящих и исходящих значеий… да и как создавать, как свойства заполнять? вроде же заранее не объявишь… а опять запоминать имена всех входящий значений… не всегда выходит

Отредактировано mirrok (Июнь 2, 2019 01:46:15)

Офлайн

#2 Июнь 2, 2019 03:57:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Как правильно вернуть несколько и не сломать мозг

mirrok
которая на основании нескольких параметров вычисляет несколько значений
Приведи конкретный пример такой функции. Есть разные способы построения функций, но не каждый из них подходит под каждый случай.

mirrok
Например в чем-нибудь типа СИ я бы вернул структуру
Ну да, можно вернуть структуру типа Point(x, y), но можно и вернуть структуру-свалку из малоотносящихся друг к другу объектов, из-за чего потом иметь трудности со вспоминанием содержимого структуры. Случаи разные все, хоть и бывают похожи.



Отредактировано py.user.next (Июнь 2, 2019 03:57:47)

Офлайн

#3 Июнь 2, 2019 11:01:46

mirrok
Зарегистрирован: 2019-06-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно вернуть несколько и не сломать мозг


 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

напимер, что-то такое, таких функций довольно много, в данном варианте параметров не много, но даже если назвать удобоваримо, кортеж же возвращает только значения, а не имена

Офлайн

#4 Июнь 2, 2019 12:18:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Как правильно вернуть несколько и не сломать мозг

mirrok
кортеж же возвращает только значения
 return (('val1', z), ('val2', z1), ('val3', z3))
Это просто метки. Но лучше словарь взять, он похож на JSON и сейчас они стали упорядоченными - то есть можно ключи или пары (ключ,значение) брать по порядку. Также можно вернуть объект, заполненный значениями.
Можно вернуть кортеж кортежей. Можно вернуть словарь словарей. Можно вернуть кортеж словарей. Можно вернуть словарь кортежей. Названия можно хранить в строках. Так же можно и передавать аргументы в функцию. Можешь отнаследоваться от словаря, добавить к своему классу методов и передавать его как словарь с дополнительными методами и хранилищем.

1)
Имена в верхнем регистре принято давать константам (во многих языках программирования так принято). Простые переменные пишутся в нижнем регистре через подчёркивание (если несколько слов в имени).
2)
Имена переменных должны быть информативны, даже если это математические переменные. Информативно - это когда ты посмотрел на переменную в какой-нибудь формуле где-нибудь в середине функции и сразу понял, что это за переменная (из её имени должно быть понятно). Не надо экономить буквы, сейчас не 1970-й год, когда компиляторы воспринимали только короткие имена, а больше 6 символов в имени просто отбрасывали.

Думаю, тебе надо поработать над самодокументированием кода. Надо использовать docstring'и, многие IDE их читают и выводят подсказки. Также докстринги можно читать через функцию help(). Когда делаешь help() для модуля питона, собираются именно docstring'и из всех функций и классов и показываются одним списком.
  
>>> 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.

Да и заголовок функции должен рассказывать, что делает функция и что именно она принимает. Для этого надо делать длинные и понятные имена у всего, а сверху писать комментарий. В питоне вместо комментария используется doscstring - первая однострочная или многострочная строка в функции.



Отредактировано py.user.next (Июнь 2, 2019 12:33:58)

Офлайн

#5 Июнь 2, 2019 13:18:22

mirrok
Зарегистрирован: 2019-06-02
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно вернуть несколько и не сломать мозг

Вроде нашел что-то похожее на структуры namedtuple. Вроде нормально работают, а для входящих данных pyCharm предложил указывать тип переменных после двоеточия. В подсказке отображаются. А вот докстринги в подсказке не отображаются… Благодарю за помощь, без ключевых слов из ваших сообщений до namedtuple не догуглил бы…

Офлайн

#6 Июнь 2, 2019 21:21:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как правильно вернуть несколько и не сломать мозг

много функций, много аргументов, много возвращаемых значений…. Все это трудно запомнить.
namedtuple, словари и подсказки ide слабо помогают в этом случае.

Это классика. Такое обычно бывает при непродуманности архитектуры программной системы. Аргументы функций и группы возвращаемых значений можно собрать в объекты имеющие понятный смысл. Может быть использовать наследование. Часть функций сделать методами (тогда функции с одинаковыми аргументами сгруппируются).
Обычно после этого вообще нет проблем с запоминанием.

Очевидно что вам смогут помочь двинуться в этом направлении если вы опишете тут вашу кучу функций.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version