Как я могу сгенерировать некоторые скрипты Python на основе различных условий? - PullRequest
3 голосов
/ 19 сентября 2019

Я хочу сгенерировать некоторые скрипты Python, основанные на разных условиях.Это означает: у меня есть постоянное тело моих скриптов Python, которое одинаково во всех различных условиях, но из-за того, что у меня есть несколько разных условий, в этих скриптах Python есть некоторые области, которые должны быть изменены.Допустим, это моя постоянная часть, которая одинакова для всех условий:

import numpy as np

variables = []

for i in range(100):
 variables.append(tempVariable)

print variables

И у меня есть 4 различных условия, где tempVariable вычисляется по-разному как:

Условие 1:tempVariable = i

Условие 2: tempVariable = i**2

Условие 3: tempVariable = i**3

Условие 4: tempVariable = i + 4.34

Обратите внимание, что я неЯ не хочу использовать оператор if для переключения этих четырех условий, потому что эти условия на самом деле разные и не связаны друг с другом.В конце я хочу получить variables для этих четырех различных условий и случаев независимо.Моя идея состоит в том, чтобы поместить эти четыре случая или условия в текстовый файл и обработать константную часть скрипта Python как другой текстовый файл, выполнить итерации по всем этим четырем условиям или случаям и добавить необходимую часть для вычисления tempVariable переддобавив его в variables.Конечно, это выглядит довольно некрасиво, и что более важно, я хочу отправить его другим людям, чтобы иметь возможность использовать его.Я ценю, если есть более хороший и общий подход к этому.В моем реальном приложении у меня есть 94 различных условия или случая, которые были бы очень уродливыми, если бы я хотел поместить их в некоторые операторы if или elif.Любое предложение или идея приветствуется.

Ответы [ 6 ]

2 голосов
/ 19 сентября 2019

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

Для предоставленных вами условий, объект типа:

mylist = [[0,1,0,0],[0,0,1,0],[0,0,0,1],[4.34,1,0,0]]

Тогда ваша n -ая строка условия будет просто читать:

Condition: tempVariable = mylist[n][0] + mylist[n][1]*i + mylist[n][2]*i**2 + mylist[n][3]*i**3 

ByДля построения обобщенного условия вам не понадобится несколько копий этой функции

1 голос
/ 19 сентября 2019

Использование лямбды .

Вот пример, демонстрирующий идею.

lambdas = [None]*4

lambdas[0] = lambda i : i

lambdas[1] = lambda i : i**2

lambdas[2] = lambda i : i**3

lambdas[3] = lambda i : i + 4.34


for i in range(0, 10):
    print( "=====  ", i )
    print( lambdas[0](i) )
    print( lambdas[1](i) )
    print( lambdas[2](i) )
    print( lambdas[3](i) )
1 голос
/ 19 сентября 2019

Если вам не нужно изменять условия во время выполнения, но при выполнении программы: вы можете добавить постоянные переменные в начале файла или создать файл, подобный parameters, и сохранить все условия и какиеактивен в этом файле.Затем импортируйте этот файл и примите активное условие (параметр) и действуйте как он.

0 голосов
/ 23 сентября 2019

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

commands.txt:

tempVariable = i
tempVariable = i**2
tempVariable = i**3
tempVariable = i + 4.34

Затем я читаюи выполните их так:

def Execute(command):
 variables = []

 for i in range(100):
  exec(command)
  variables.append(tempVariable)

 print variables

if __name__ == "__main__":
 conditions = open('commands.txt').read().split('\n')[:-1]
 map(Execute, conditions) 
0 голосов
/ 19 сентября 2019

Вы можете попробовать:

def cond1(x):
    return x

def cond2(x):
    return x**2

def cond3(x):
    return x**3

def cond4(x):
    return x + 4.34

my_conds = (cond1, cond2, cond3, cond4)
variables = [list(map(cond, range(100))) for cond in my_conds]
0 голосов
/ 19 сентября 2019

Вот один из способов:

variables = []
func_dict = {'linear': lambda x: x, 'squared': lambda x: x ** 2, 'cubed': lambda x: x ** 3}


def calculator(func, myArray):
    for i in range(10):
        myArray.append(func(i))


answers = {}
for func_name in func_dict:
    new_arr = []
    calculator(func_dict[func_name], new_arr)
    answers[func_name] = new_arr

print(answers)

Вывод:

{'linear': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'squared': [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], 'cubed': [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]}

При этом, когда у вас есть новая функция, все, что вам нужно сделать, это добавить ее в функциюДИКТ.Больше ничего не нужно менять.Возможно, вы сможете еще больше упростить это.

...