Как мне реализовать данную функцию?
Мне нужно сделать своеобразную проверку на жанры. То есть у меня есть база данных, которая содержит в себе какую-то информацию о книге по ее индексу. Я выбираю какое-то рандомное число, нахожу эту книгу в базе данных по индексу, проверяю есть ли в ней необходимые мне жанры, и если нет, то функция запускается по новой уже с другим числом. Когда такая книга находится, то нужно выводить какую-либо информацию о ней, но это уже не так важно
conn = sqlite3.connect('booksrec.db')
curs = conn.cursor()
my_genres = ['Historical', 'Fantasy', 'Business']
number_of_books = random.randint(0, 9999)
def kniga(number):
curs.execute(f'SELECT * FROM books WHERE "index" = "{number_of_books}"')
book = curs.fetchone()
for element in my_genres:
if element in book[5]:
print(book[2])
else:
kniga(random.randint(0, 9999))
kniga(number_of_books)
При таком написании вылезает ошибка о превышении глубины рекурсии. Что можно сделать в данной ситуации?
Ответы (1 шт):
Ну избавиться то от рекурсии легко:
def kniga(number):
while True:
number_of_books = random.randint(0, 9999)
curs.execute(f'SELECT * FROM books WHERE "index" = "{number_of_books}"')
book = curs.fetchone()
found = True
for element in my_genres:
if element not in book[5]:
found = False
break
if found:
print(book[2])
break
Но подход изначально порочный. Вы можете много раз выбирать одни и те же книги на проверку. И зря будете дёргать базу, если нужных книг там немного. Лучше всё-таки придумать, как вынуть из базы только подходящие по критерию книги и из них уже выбрать одну случайную.
P.S. Переделал проверку на более правильную, если нужны все три жанра. Если достаточно совпадения одного жанра из списка, проверку нужно будет переделать.