Использование time.time () в цикле while вызывает функцию дважды - PullRequest
0 голосов
/ 25 мая 2019

Я создал такую ​​функцию:

import time

def func(seconds):
    time.sleep(seconds)
    print(f'waited {seconds} seconds')

Теперь, если я создам while loop, как это, и вызову func(6), через 6 секунд будет напечатано waited 6 seconds:

start_time = time.time()
while time.time() - start_time < 5:
    func(6)

output:
waited 6 seconds

Но если я создам тот же while loop, при вызове func(4) скрипт будет ждать 4 секунды, затем вывести waited 4 seconds, а через 4 секунды он снова напечатает waited 4 seconds!

start_time = time.time()

while time.time() - start_time < 5:
    func(4)

output:
waited 4 seconds
waited 4 seconds

Почему это происходит?

Я понимаю, почему func(6) ведет себя так, но я ожидал, что func(4) будет выполнен только один раз, таким образом напечатав waited 4 seconds только один раз.

Ответы [ 3 ]

2 голосов
/ 25 мая 2019

Условия while проверяют, прошло ли пять секунд.Для func(6), «6 секунд> 5 секунд», так что условие выполнено и оно завершает цикл while.Когда возвращается func(4), условие «4 секунды> 5 секунд» не соответствует True, поэтому цикл while будет повторяться еще раз.

1 голос
/ 25 мая 2019

Что происходит:

start_time = time.time()               # captures the time right now()
while time.time() - start_time < 5:    # 1.) checks the time right after last check
                                       # 3.) checks the time right after 6s passed
    func(6)                            # 2.) waits 6 seconds
                                       # 4.) done

Когда вы используете 4s:

start_time = time.time()               # captures the time right now()
while time.time() - start_time < 5:    # 1.) checks the time right after last check
                                       # 3.) checks the time right after 4s passed, still < 5
                                       #     (should be something along 4.00023 or so)
                                       # 5.) checks the time afte4 4+4s passed
    func(4)                            # 2.) waits 4 seconds
                                       # 4.) waits 4 more seconds
                                       # 6.) done

Вычитание раз дает число с плавающей запятой:

import time

t = time.time()
time.sleep(1)           # guaranteed to wait at least 1s
print(time.time()-t)  

Выход:

1.00106596947

После time.sleep(4) вы все еще далеки от 5 - по этой причине он дважды входит в цикл.

0 голосов
/ 25 мая 2019

Условие while (<5) по сравнению с вычислением дельты времени позволило бы циклу while снова войти в себя после 4-секундного сна, например, новая дельта времени может быть 4.0022xxx после первого 4-секундного сна, поскольку условие (4.0022) xx <5) Истина, это приведет ко второму 4-секундному сну. </p>

...