Вызвать список функций со случайными параметрами - PullRequest
0 голосов
/ 29 октября 2018

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

import random

def sum_3 (a):
    return (sum(a) + 3)
def sum_2 (b):
    return (sum(b) + 2)

# Call the functions 
functions = [sum_3, sum_2]
# Using random arguments
random.sample(range(1, 100000), 5)

Ответы [ 4 ]

0 голосов
/ 07 ноября 2018

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

  1. Скомпилируйте нужные вам функции в объект.

  2. Применение функций в скомпилированном объекте к параметрам.

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

import random

def sum_3 (a):
    return (sum(a) + 3)
def sum_2 (b):
    return (sum(b) + 2)

parameters = random.sample(range(1, 100000),5)

# generic function to apply functions on parameters
def compile(*fs): return lambda x: map(lambda f: f(x), fs)

# choose the functions you want to apply
dosum3and2 = compile(sum_3,sum_2)
dosum2only = compile(sum_2)

# apply the defined functions to parameters
print(list(dosum3and2(parameters)))
print(list(dosum2only(parameters)))
# output =>
# [294334, 294333]
# [294333]

Когда у вас много функций sum_1, sum_2, sum_3, ..., sum_n, вы сначала компилируете их, а затем применяете к таким параметрам, как

# compile the chosen functions
# which looks very similar as what you did with list (functions = [sum_3, sum_2]).
functions = compile(sum_1,sum_2,sum_3,...,sum_n)
# apply to parameters
functions(parameters)
0 голосов
/ 29 октября 2018

Вы можете перебирать свои функции и вызывать их с образцом.

>>> the_sample = random.sample(range(1, 100000), 5)
>>> the_sample
>>> [6163, 38513, 35085, 4876, 27506]
>>>
>>> for func in functions:
...:    print(func(the_sample))
...:    
112146
112145

Построение списка результатов:

>>> [func(the_sample) for func in functions]
>>> [112146, 112145]
0 голосов
/ 29 октября 2018

Зависит от того, сколько раз вы хотите позвонить.Один из подходов заключается в следующем:

import random

def sum_3 (a):
    print('calling sum3 with', a)
    return (sum(a) + 3)

def sum_2 (b):
    print('calling sum2 with', b)
    return (sum(b) + 2)

functions = [sum_3, sum_2]
for i in range(3): # call each function 3 times
    for func in functions:
        print(func(random.sample(range(1, 100000), random.randint(2, 6))))

Вывод

calling sum3 with [76385, 37776, 19464]
133628
calling sum2 with [21520, 97936, 44610]
164068
calling sum3 with [1184, 4786]
5973
calling sum2 with [2680, 36487, 24265, 39569, 18331]
121334
calling sum3 with [87777, 81241, 95238, 58267, 3434, 85015]
410975
calling sum2 with [5020, 68999, 50868, 17544]
142433
0 голосов
/ 29 октября 2018

Предположим, functions это список функций:

import random
# Call your function like this:
random.choice(functions)(a)

Используйте np.random.choice, если вы предпочитаете использовать numpy (что я и делаю, поскольку это больше математическая библиотека по умолчанию)

...