Генерация случайных анонимных (lambda) функций

Мне нужно сгенерировать список анонимных функций (lambda), каждая из которых будет выполнять какое-либо математическое действие непосредственно c x и случайным числом. Но по какой-то причине, каждый раз элементы списка редактируются. Код программы:

from random import choice, randint

random_choices = ['+', '-', '*', '/']

random_actions = [lambda x: eval(f'{x} {choice(random_choices)} {randint(1, 50)}') for _ in range(len(random_choices))]

for i in range(4):
    print(random_actions[i](5))

print('\n')

for i in range(4):
    print(random_actions[i](5))

Вывод:

15
90
0.7142857142857143
12


0.10638297872340426
15
32
0.22727272727272727

Как можете заметить, при исполнении двух одинаковых циклов получаются разные результаты, как мне сделать так чтобы такого не было?


Ответы (1 шт):

Автор решения: mazzz3r

Почему данные "редактируются"? Вы будете получать разные результаты, ведь каждый каждый вызов лямбда функции используется случайное действие choice(random_choices) и случайное число randint(1, 50). Вероятность, что что-то случайно окажется одинаковым, крайне мала. (ответ @andreymal)

Могу предложить данное решение проблемы:

from random import choice, randint

random_choices = ['+', '-', '*', '/']

commands = ["{0}" + f"{choice(random_choices)} {randint(1, 50)}" for _ in range(len(random_choices))]

random_actions = lambda x: [eval(command.format(x)) for command in commands]

for i in range(4):
    print(random_actions(5)[i])

print('\n')

for i in range(4):
    print(random_actions(5)[i])

Вывод:

120
215
5
15

120
215
5
15
→ Ссылка