Модуль расписания, создающий странный вывод

#python #python-3.x #schedule

#python #python-3.x #Расписание

Вопрос:

Этот фрагмент кода ведет себя не так, как я ожидал: вместо печати 1, 2, 3, …; код возвращает только случайные числа (я пытался закрыть все и перезапустить его, но он всегда выдает случайные числа.)

 import schedule
import time

a = 0


def count_fun():
    global a
    for i in range(1000):
        a  = i
    return a


def print_a():
    print(a)


schedule.every(3).seconds.do(count_fun)
schedule.every(3).seconds.do(print_a)



while True:
    schedule.run_pending()
 

Ответ №1:

Он не печатает случайные числа, он печатает k * sum(range(1000) для k in 1, 2, 3, …

Ваше ожидание, что это должно печатать целые числа 1, 2, 3 и т.д., неверно. a не увеличивается на 1 на каждой итерации, оно обновляется значением sum(range(1000)) на каждой итерации. Каждый раз выполняется весь цикл for.

Запуск кода, который у вас здесь, выводит

 499500
999000
1498500
1998000
 

Некоторая быстрая арифметика должна подтвердить, что разница между последовательными элементами существует 499500 , или sum(range(1000)) .

Комментарии:

1. Спасибо за ваш ответ! Это имеет смысл. Есть ли у вас какие-либо предложения относительно того, что попытаться заставить код печатать 1, 2, 3 и т.д.? Я попытался переписать функцию, используя yield , а затем выполнить next с помощью schedule, но, похоже, это не сработало.

2. Чтобы напечатать эту последовательность чисел, вам нужно просто назначить a , а не добавлять к ней. Т.е. a = i внутри цикла. = добавление на месте.