2015-06-13 8 views
0

Это мой первый вопрос, поэтому я искренне приношу свои извинения за любые ошибки в публикации, которые, я уверен, я сделаю. Сначала я просмотрел ранее ответившие вопросы, но я не нашел подходящего решения, хотя я понимаю, что, возможно, я не искал правильную терминологию или ключевые слова.Как реализовать варианты/варианты функции

У меня есть общая функция, которую я бы хотел быстро оценить в Python. Он передается оптимизатору (fmin_cobyla), и я предпочел бы, чтобы он принимал только один аргумент. Я хотел бы иметь возможность использовать различные варианты (варианты? Ароматы?) Этой функции, которые могут контролироваться флагом. Так как я хочу это быстро оценили это не имеет смысла иметь кучу или, если это случай заявления внутри функции (? Справа), так что в настоящее время у меня есть, если заявления вокруг определений функции вариантов:

if flag==1: 
    def f(x): 
     for i in range(0,len(x)*3,3): 
      A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3) 
     tmp=np.linalg.solve(A,b) 
     y=somecmodulefunction(tmp) 
     return y 
elif flag==2: 
    def f(x): 
     for i in range(0,len(x)*3,3): 
      A[i:i+3,i:i+3]=x[i/3]*np.eye(3) 
     tmp=np.linalg.solve(A,b) 
     y=somecmodulefunction(tmp) 
     return y 
... 

Функции идентичны, за исключением одной строки. Правильно ли это? Так или иначе, чтобы сделать это, чтобы, если у меня есть 10 различных вариантов, это не просто длинный громоздкий блок кода?

Спасибо!

+0

Добавьте параметр 'flag' в функцию, затем добавьте блок' if', чтобы реализовать различное поведение. Попробуйте следовать DRY (не повторяйте себя). – TigerhawkT3

+0

Если функция должна оцениваться 10^10 раз, не было бы, если инструкции в функции замедляли ее оценку? (Я упомянул об этом в исходном сообщении) – omegamanda

+0

Конечно, добавление инструкции замедляло бы ее с помощью ненулевой суммы, но если вы беспокоитесь о производительности, полученной от простого 'if boolean_value', вы должны написать программу в C. – TigerhawkT3

ответ

0

Почему бы вам не передать переменную флага в качестве входа в функцию?

def f(x, flag): 
    for i in range(0,len(x)*3,3): 
     if flag == 1: 
      A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3) 
     elif flag == 2: 
      A[i:i+3,i:i+3]=x[i/3]*np.eye(3) 
    tmp=np.linalg.solve(A,b) 
    y=somecmodulefunction(tmp) 
    return y 

Если значение по умолчанию flag, вы можете использовать, Default Argument Values:

def f(x, flag=1): 
    for i in range(0,len(x)*3,3): 
     if flag == 1: 
      A[i:i+3,i:i+3]=1/x[i/3]*np.eye(3) 
     elif flag == 2: 
      A[i:i+3,i:i+3]=x[i/3]*np.eye(3) 
    tmp=np.linalg.solve(A,b) 
    y=somecmodulefunction(tmp) 
    return y 

Так что, когда вы делаете, f(10), функция f() будет выполняться с использованием flag равно 1 ,

Если вы хотите использовать другое значение flag, вы можете просто: f(10,2).

0

Попробуйте повторить как можно меньше. Это означает только указание разницы, которая является инверсией этого выражения. Остальное - то же самое. Если вы хотите изменить способ вычисления чего-то, вам нужно только внести изменения в одно место.

def f(x, flag): 
    for i in range(0,len(x)*3,3): 
     temp = x[i/3]*np.eye(3) 
     if flag-2: 
      temp = 1/temp 
     A[i:i+3,i:i+3] = temp 
    tmp=np.linalg.solve(A,b) 
    y=somecmodulefunction(tmp) 
    return y 

Когда flag является 2, то if ветвь не будет выполнена, так как 2-2 равна 0, а falsey значение. Когда flag будет 1, будет выполнена ветка if, потому что 1-2 равно -1, правдивое значение. Однако я бы рекомендовал использовать логический флаг (т. Е. Ожидающие значения True или False), поэтому вы можете просто сделать if flag: и иметь True, означающий, что вы хотите инверсию.

+0

Я думаю, что «флаг» - хорошее решение, но я считаю эту конкретную реализацию своего теста немного неясной (что-то более явное может быть лучше), но если вы это сделаете, почему бы просто не просто «A [i: i + 3 , i: i + 3] = x [i/3] ** (2 * flag-3) * np.eye (3) '? – xnx

 Смежные вопросы

  • Нет связанных вопросов^_^