Большое количество математических уравнений и функций в Python модуль


У меня примерно 40 или 50 функций, которые похожи на один предоставленную ниже код.

Я сохранил все общие расчеты между несколькими функциями отдельных, таких как service_coverage_area . Затем я сохранил все конкретные расчеты, которые не повторяются или нужны любые другие функции в функцию, которая нужны эти вычисления, такие как вычисление f_sc.

Мой вопрос: я делаю это право? а в это лучшая практика для вспомогательных функций код? я должен отделять все мини-расчеты на отдельные функции, но затем приходится иметь дело с 200 функций вместо нынешних 50?

Обратите внимание , что самость есть причина этот код является частью класса. Я просто скопировать и вставить 2 функции в этой пасты

import bisect

def service_coverage_area(self, mode):
  #simplified for codereview
  return 1


def some_calc(self, mode, street_type, grade, elderly_proportion, f_px):
    """ where:
          r = r_0 * f_sc * f_s * f_pop * f_px

          r_0 = ideal transit stop service radius
            400m for bus and 800m for rail / express bus and commuter
            needed variable: mode

          f_sc = street connectivity factor
            {'grid':1, 'hybrid':0.85, 'cul_de_sac':0.45}
            needed variable: street connectivity tye

          f_s = grade fator
            0.00 to 0.05 -> 1.00
            0.06 to 0.08 -> 0.95
            0.09 to 0.11 -> 0.80
            0.12 to 0.15 -> 0.65
            needed variable: grade

          f_pop population factor
            1 for normal population
            0.85 of 20% is elderly population
            needed variable:elderly_proportion

          f_px pedestrian crossing factor
            provided by another calculation
    """
    #calculate r_0
    r_0 = self.service_coverage_area(mode)

    #calculate f_sc
    if street_type == 'grid':
      f_sc = 1
    elif street_type == 'hybrid':
      f_sc = 0.85
    elif street_type == 'cul_de_sac':
      f_sc = 0.45

    #calculate f_s
    grades = [0.05, 0.08, 0.11]
    f_s_values = [1.00, 0.85, 0.80, 0.65]
    f_s_score = bisect.bisect(grades, grade)
    f_s = f_s_values[f_s_score]

    #calculate f_pop
    if elderly_proportion <= 0.2:
      f_pop = 1
    else:
      f_pop = 0.85

    return r_0 * f_sc * f_s * f_pop * f_px


508
3
задан 28 июля 2011 в 02:07 Источник Поделиться
Комментарии
2 ответа


Я делаю это право?

Почти.


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

Это не "служебные" функции. Они появляются, чтобы быть в вашем приложении. Редко бывают "полезные" функции в любом приложении.

То, что мы привыкли называть "служебные" функции, почти всегда являются частью стандартной библиотеки.


я должен отделять все мини-расчеты на отдельные функции

Да.


но тогда придется иметь дело с 200 функций вместо нынешних 50?

У вас еще есть расчеты. Ты просто даешь им имена и держать их отдельно. Давая им отдельные имена, делает их более многоразовые, легче тестировать и легче найти.

Самое главное здесь, чтобы не создавать a (почти) никому не нужный класс, который просто содержит кучу функций.

Ваш код не использует переменные экземпляра и просто использует другую функцию, что происходит в классе. Оба из них могут быть @staticmethod метод.

Нет смысла ... в Python-создание класса, если у вас есть переменные экземпляра и изменение в состоянии какого-то.

[В Java, вы должны часто создают "все статические" классы, потому что нет никакого другого места, чтобы поставить мат без гражданства такой.]

Вы можете просто положить эти функции в простой модуль и избежать определения классов.

5
ответ дан 28 июля 2011 в 11:07 Источник Поделиться

#calculate r_0
r_0 = self.service_coverage_area(mode)

Я рекомендую более описательное имя переменной, затем r_0 (для всех переменных)

#calculate f_sc
if street_type == 'grid':
f_sc = 1
elif street_type == 'hybrid':
f_sc = 0.85
elif street_type == 'cul_de_sac':
f_sc = 0.45

Использовать словарь f_sc = MYDICT[street_type]

#calculate f_s
grades = [0.05, 0.08, 0.11]
f_s_values = [1.00, 0.85, 0.80, 0.65]

константы лучше размещать на глобальном уровне/классе, а не внутри функции.

1
ответ дан 29 июля 2011 в 01:07 Источник Поделиться