Как вызвать функцию (каждый раз возвращает разные значения), в теле цикла несколько раз, чтобы возвращенное значение менялось? Python
Как вызвать функцию gen_prog(), с разными выходными значениями в теле цикла функции add_all()?
import random
import math
n = 513
a = []
b = [str(x) for x in str(n)]
all_var = []
def gen_prog():
'''Генерирует новую комбинацию из чисел в "n".'''
while True:
z = random.choice(b)
if z not in a:
a.append(z)
if len(a) == len(b):
break
return ''.join(a)
def add_all():
'''Должна добавлять сгенерированную ранее комбинацию в список "all_var".
Цикл длится до тех пор, пока все возможные значения не будут добавлены в список "all_var".
Цикл бесконечный, так как значение "y" в теле цикла всегда равно одному и тому же.'''
while len(all_var) != math.factorial(len(b)):
y = gen_prog()
if y not in all_var:
all_var.append(y)
add_all()
Проблема в том, что в цикле функции add_all() значение y всегда равно одному и тому же. Соответственно значение y будет добавлено в список all_var только один раз, а затем условие if y not in all_var: будет соблюдено и цикл станет бесконечным. Чтобы этого не произошло нужно чтобы функция gen_prog, значение которой присвоено y, каждый раз генерировала новые значения. Сама по себе функция gen_prog работает исправно, однако если она находится в цикле, ее значение всегда равно одному и тому же числу.
Ответы (1 шт):
Проблема в использовании глобальной переменной a.
После первого вызова она заполнена, и последующие вызовы всегда генерируют то же значение. Сделайте a локальной:
def gen_prog():
'''Генерирует новую комбинацию из чисел в "n".'''
a = []
while True:
z = random.choice(b)
if z not in a:
a.append(z)
if len(a) == len(b):
break
return ''.join(a)