Простой способ сделать несколько отправлений в python? (Нет внешних библиотек или построение классов?) - PullRequest
2 голосов
/ 16 января 2020

Я пишу одноразовый скрипт для вычисления некоторых аналитических решений для нескольких симуляций, которые я запускаю.

Я хотел бы реализовать функцию таким образом, чтобы на основе ее входных данных вычислялся правильный ответ. Например, скажем, у меня есть следующее математическое уравнение:

tmax = (s1 - s2) / 2 = q * (a^2 / (a^2 - b^2))

Мне кажется простым, что я должен быть в состоянии сделать что-то вроде:

def tmax(s1, s2):
    return (s1 - s2) / 2

def tmax(a, b, q):
    return q * (a**2 / (a**2 - b**2))

Возможно, я получил раньше писал в julia, но я действительно не хочу усложнять этот сценарий больше, чем нужно.

Ответы [ 2 ]

3 голосов
/ 16 января 2020

В статически типизированных языках, таких как C ++, вы можете перегружать функции, основываясь на типах входных параметров (и количестве), но это на самом деле невозможно в Python. Может быть только одна функция с любым именем.

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

def tmax(p1, p2, p3 = None):
    # Two-argument variant has p3 as None.

    if p3 is None:
        return (p1 - p2) / 2

    # Otherwise, we have three arguments.

    return (p1 * p1 / (p1 * p1 - p2 * p2)) * p3

Если вам интересно, почему я изменил операции возведения в квадрат с n ** 2 на n * n, это потому, что последняя работает быстрее ( или было в некоторый момент в прошлом, по крайней мере для малых целочисленных степеней, таких как 2 - это , вероятно, все еще имеет место, но вы можете подтвердить это.

возможен случай, когда может быть быстрее g1 ** 2, чем g1 * g1, где g1 является глобальным, а не локальным (это занимает больше времени для Python VM до LOAD_GLOBAL, а не LOAD_FAST). Это не относится к опубликованному коду, поскольку этот аргумент по своей сути не является глобальным.

0 голосов
/ 16 января 2020

Вы можете сделать это, используя необязательный аргумент:

def tmax_2(s1, s2):
    return (s1 - s2) / 2

def tmax_3(a, b, q):
    return q * (a**2 / (a**2 - b**2))

def tmax(a, b, c=None):
    if c is None:
        return tmax_2(a, b)
    else:
        return tmax_3(a, b, c)
...