• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Работа цикла for в цикле while

Ali_Pythonist

Member
21.02.2024
14
0
BIT
101
Первый код -
Python:
@bot_router_send_photo.message(Command("remind"), IsAdmin(lst_admin))
async def hello(message: Message, bot: Bot):
    await message.answer(text='Планировщик запущен.')
    with sq.connect('sq_bot.db') as time_photo:
        id = -4152120133
        cur = time_photo.cursor()
        time = cur.execute("""SELECT time FROM data_photo""").fetchall()
        photo = cur.execute("""SELECT photo FROM data_photo""").fetchall()
        photo_name = cur.execute("""SELECT photo_name FROM data_photo""").fetchall()
        while True:
             time_now = datetime.datetime.now().time()
             time_string = f'{time_now.hour}:{time_now.minute}'
             for i in range(len(photo)):
                 if time_string in time[i][0]:
                     await bot.send_photo(chat_id=id, photo=BufferedInputFile(filename=photo_name[i][0], file=photo[i][0]))
Второй код -
Python:
@bot_router_send_photo.message(Command("remind"), IsAdmin(lst_admin))
async def hello(message: Message, bot: Bot):
    await message.answer(text='Планировщик запущен.')
    with sq.connect('sq_bot.db') as time_photo:
        id = -4152120133
        cur = time_photo.cursor()
        time = cur.execute("""SELECT time FROM data_photo""").fetchall()
        photo = cur.execute("""SELECT photo FROM data_photo""").fetchall()
        photo_name = cur.execute("""SELECT photo_name FROM data_photo""").fetchall()
        iteration = 0
        while True:
             time_now = datetime.datetime.now().time()
             time_string = f'{time_now.hour}:{time_now.minute}'
             for i in range(len(photo)):
                 if time_string in time[i][0]:
                     await bot.send_photo(chat_id=id, photo=BufferedInputFile(filename=photo_name[iteration-1][0], file=photo[iteration-1][0]))
                     if iteration < len(photo):
                         iteration+=1

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

Luxkerr

Редактор Форума
28.10.2023
186
64
BIT
4 083
Первый код -
Python:
@bot_router_send_photo.message(Command("remind"), IsAdmin(lst_admin))
async def hello(message: Message, bot: Bot):
    await message.answer(text='Планировщик запущен.')
    with sq.connect('sq_bot.db') as time_photo:
        id = -4152120133
        cur = time_photo.cursor()
        time = cur.execute("""SELECT time FROM data_photo""").fetchall()
        photo = cur.execute("""SELECT photo FROM data_photo""").fetchall()
        photo_name = cur.execute("""SELECT photo_name FROM data_photo""").fetchall()
        while True:
             time_now = datetime.datetime.now().time()
             time_string = f'{time_now.hour}:{time_now.minute}'
             for i in range(len(photo)):
                 if time_string in time[i][0]:
                     await bot.send_photo(chat_id=id, photo=BufferedInputFile(filename=photo_name[i][0], file=photo[i][0]))
Второй код -
Python:
@bot_router_send_photo.message(Command("remind"), IsAdmin(lst_admin))
async def hello(message: Message, bot: Bot):
    await message.answer(text='Планировщик запущен.')
    with sq.connect('sq_bot.db') as time_photo:
        id = -4152120133
        cur = time_photo.cursor()
        time = cur.execute("""SELECT time FROM data_photo""").fetchall()
        photo = cur.execute("""SELECT photo FROM data_photo""").fetchall()
        photo_name = cur.execute("""SELECT photo_name FROM data_photo""").fetchall()
        iteration = 0
        while True:
             time_now = datetime.datetime.now().time()
             time_string = f'{time_now.hour}:{time_now.minute}'
             for i in range(len(photo)):
                 if time_string in time[i][0]:
                     await bot.send_photo(chat_id=id, photo=BufferedInputFile(filename=photo_name[iteration-1][0], file=photo[iteration-1][0]))
                     if iteration < len(photo):
                         iteration+=1

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

Ты используешь переменную i для обхода списка фотографий, но при этом не увеличиваешь счетчик i после отправки каждой фотографии. Следовательно, каждый раз отправляется фотография с индексом i, который не меняется, и поэтому отправляется одна и та же фотография.

Во втором случае ты используешь переменную iteration, чтобы отслеживать текущую позицию в списке фотографий. После отправки каждой фотографии ты увеличиваешь значение iteration, чтобы перейти к следующей фотографии в списке.
 

Ali_Pythonist

Member
21.02.2024
14
0
BIT
101
Но я думал всё это время что счётчик в цикле for увеличивать не надо вить он сам там увеличивается после каждой итерации
 

f22

Codeby Academy
Gold Team
05.05.2019
1 841
225
BIT
1 043
Но я думал всё это время что счётчик в цикле for увеличивать не надо вить он сам там увеличивается после каждой итерации
1714902757354.png
Вам выше написали верно - в первом случае не происходит изменения переменной iteraton, поэтому каждый раз используется один и тот же индекс для получения объекта в photo
В бесконечном цикле нужно добавить какое-то условие выхода, во втором случае у вас оно есть, а в первом - нет


И пара рекомендаций по коду - не стоит использовать такую глубокую вложенность - у вас аж 5 отступов. Лучше выделить какую-то логику и перенести её в отдельную функцию
Не стесняйтесь использовать комментарии к коду - над каждой строкой, которая вам не до конца понятна добавляйте её описание - так работать с кодом будет гораздо проще
 

Ali_Pythonist

Member
21.02.2024
14
0
BIT
101
Посмотреть вложение 74709
Вам выше написали верно - в первом случае не происходит изменения переменной iteraton, поэтому каждый раз используется один и тот же индекс для получения объекта в photo
В бесконечном цикле нужно добавить какое-то условие выхода, во втором случае у вас оно есть, а в первом - нет


И пара рекомендаций по коду - не стоит использовать такую глубокую вложенность - у вас аж 5 отступов. Лучше выделить какую-то логику и перенести её в отдельную функцию
Не стесняйтесь использовать комментарии к коду - над каждой строкой, которая вам не до конца понятна добавляйте её описание - так работать с кодом будет гораздо проще
Спасибо учту вашу рекомендацию.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!