Python, функция иногда выдает none

Решил попытаться написать игру Коровы и Быки на Питоне. Написал первую функцию которая должна рандомить массив из трех чисел. Проверяя функцию заметил что иногда функция выдаёт "none". Понятия не имею с чем это может быть связано.

P.S. Изначально код был меньше, было if secretNum[0] == ([secretNum[1] or secretNum[2]) и еще одна подобная строка для проверки второго элемента массива. Поменял, думая что это поможет решить проблему, не помогло)

Вот код

#Импорт нужных модулей
import random

#Функция присваивания секретного числа
def setNum():
    secretNum = []
    secretNumSet = random.randint(100,999)
    #Цикл разделяющий число int на массив
    for i in str(secretNumSet):
           secretNum.append(i)
    #Проверка числа на одиннаковые цифры. Т.е. не равна ли первая цифра второй и т.д. Нужно для правильного числа по правилам игры 
    if secretNum[0] == secretNum[1]:
        setNum()
    elif secretNum[0] == secretNum[2]:
        setNum()
    elif secretNum[1] == secretNum[0]:
        setNum()
    elif secretNum[1] == secretNum[2]:
        setNum()
    else:
        return secretNum    #Если всё нормально, функция возвращает массив secretNum

#Присваивание массива secretNum через функцию setNum()
secretNum = setNum()
print(secretNum)#Удалить, написал для проверки правильности кода

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

Автор решения: Danis
    if secretNum[0] == secretNum[1]:
        return setNum()
    elif secretNum[0] == secretNum[2]:
        return setNum()
    elif secretNum[1] == secretNum[0]:
        return setNum()
    elif secretNum[1] == secretNum[2]:
        return setNum()
    else:
        return secretNum

Либо:

    if secretNum[0] == secretNum[1]:
        secretNum = setNum()
    elif secretNum[0] == secretNum[2]:
        secretNum = setNum()
    elif secretNum[1] == secretNum[0]:
        secretNum = setNum()
    elif secretNum[1] == secretNum[2]:
        secretNum = setNum()
    return secretNum

Более правильный код:

import random

def setNum():
    num = list(str(random.randint(100, 999)))
    
    if len(num) != len(set(num)):
        return setNum()
    return num
→ Ссылка
Автор решения: n1tr0xs

Я так понял, что вы хотели использовать рекурсию, тогда нужно setNum() внутри каждого (el)if заменить на return setNum().

#Функция присваивания секретного числа
def setNum():
    secretNum = []
    secretNumSet = random.randint(100,999)
    #Цикл разделяющий число int на массив
    for i in str(secretNumSet):
           secretNum.append(i)
    #Проверка числа на одиннаковые цифры. Т.е. не равна ли первая цифра второй и т.д. Нужно для правильного числа по правилам игры 
    if secretNum[0] == secretNum[1]:
        return setNum()
    elif secretNum[0] == secretNum[2]:
        return setNum()
    elif secretNum[1] == secretNum[0]:
        return setNum()
    elif secretNum[1] == secretNum[2]:
        return setNum()
    else:
        return secretNum    #Если всё нормально, функция возвращает массив secretNum

Однако, лучше использовать такой код, если целью является именно рекурсивная функция:

def setNum():
    secretNumSet = random.randint(100, 999)
    secretNum = [i for i in str(secretNumSet)]  # число int на массив
    if len(set(secretNum)) == len(secretNum):
        return secretNum
    return setNum()

Или такой код, если рекурсивная функция целью не является:

def setNum():
    while True:
        secretNumSet = random.randint(100, 999)
        secretNum = [i for i in str(secretNumSet)]  # число int на массив
        if len(set(secretNum)) == len(secretNum):
            break
    return secretNum
→ Ссылка