Разница между Python 3.x и Python 2.x в цикле while - PullRequest
0 голосов
/ 01 октября 2018

У меня есть этот кусок кода, который я написал несколько недель назад.Первоначально я написал его для Python 2.7, и он работает очень хорошо, но некоторое время назад я решил просто отказаться от него и перейти на Python 3.7.Может кто-нибудь объяснить мне, почему этот цикл while бесконечен и не хочет полностью выполнять эти условия?

В Python 2.7 этот код позволяет мне просматривать между моими файлами данных и этими уловками любителей в моем кодепозволяет мне справляться с препятствиями, такими как смена часов через 60 минут или дата через 24 часа.До сих пор не знаю, как преобразовать его в Python 3.

# Input variables
h = "Arctic"
u = 'Denver'
p = 'Patagonia'

Station = input('Enter a station name (Arctic = h, Denver = u, Patagonia = p): ')
Date = input('Enter date time (yyyymmdd): ')
Date_end = input('Enter end date time (yyyymmdd): ')
Start_time_hours = int(input('Enter start time (hh): '))
Start_time_minutes = int(input('Enter start time (mm): '))
End_time_hours = int(input('Enter end time (hh): '))
End_time_minutes = int(input('Enter end time (mm): '))
Save_Print_SavPrin = input('Press s = Save, p = Plot: ')


while Start_time_hours == Start_time_hours and Start_time_minutes == Start_time_minutes and Date == Date:
    Start_time_hours += (Start_time_minutes / 60)
    Start_time_minutes %= 60
    str(Start_time_minutes)
    str(Start_time_hours)
    str(End_time_minutes)
    str(End_time_hours)
    Start_time_hours_format = '{:02}'.format(Start_time_hours)
    Start_time_minutes_format = '{:02}'.format(Start_time_minutes)
    End_time_hours_format = '{:02}'.format(End_time_hours)
    End_time_minutes_format = '{:02}'.format(End_time_minutes)
    int(Start_time_minutes)
    Start_time_minutes += 5
    if Save_Print_SavPrin == "p":
        print("Showing figures...")
        print ("Succesful!")
        if Start_time_hours_format == End_time_hours_format and Start_time_minutes_format == End_time_minutes_format and Date == Date_end:
            print (Start_time_hours_format, Start_time_minutes_format, End_time_hours_format, End_time_minutes_format)
            break

1 Ответ

0 голосов
/ 01 октября 2018

Во-первых, ваше условие цикла представляет собой бесконечный цикл, потому что вы сравниваете переменные с ... самими собой.Таким образом, вы можете заменить на while True: (допустимо для обеих версий Python)

Теперь проблемный код такой:

Start_time_hours += (Start_time_minutes / 60)

в Python 3, / 60 выполняет деление с плавающей запятой, дажемежду целочисленными операндами.В результате теперь Start_time_hours является плавающей точкой и никогда не может быть равным End_time_hours, что является целым числом (тест if Start_time_hours_format == End_time_hours_format всегда не выполняется, особенно потому, что вы конвертируете оба в строку).

Исправление (работает для обеих версий) - принудительное целочисленное деление:

Start_time_hours += (Start_time_minutes // 60)

Кроме того, выполнение str(something) в одной строке не приведет к превращению этого something в строку, если только выназначьте его обратно на something.Вы можете удалить все эти утверждения, так как они в любом случае бесполезны.

...