Области применения Python в For -Else
Я изучаю Python и не могу понять, что происходит с флагом в приведенном ниже фрагменте кода. Поскольку я обновил флаг до false с помощью набора if, я ожидаю увидеть false, напечатанный из else, но вывод показывает true. Может кто-нибудь, пожалуйста, помогите мне понять, что здесь происходит.
objects=[1,2,3,4,5]
found_obj = None
for obj in objects:
flag = True
if obj == 3:
found_obj = obj
print("found the required object ",found_obj)
flag= False
else:
print ('Status flag ::', flag)
Ниже приведен вывод, который я получаю при выполнении этого кода
found the required object 3
Status flag :: True
3 ответа
Ты устанавливаешь flag = True
в начале каждой итерации, таким образом, она печатает true
где это назначено true
в последней итерации, где obj равно 5
Вы можете исправить это, переместившись flag = True
из цикла for:
flag = True
for obj in objects:
if obj == 3:
found_obj = obj
print("found the required object ",found_obj)
flag= False
break # no need to continue search
Но если я вырвусь из цикла, я не войду в остальное.
Хотя это правда, нет никаких оснований для for..else
построить. Поскольку вы ищете элемент в списке, имеет смысл как можно раньше выйти из цикла. Так что вы должны просто удалить else
полностью и запустить это print
независимо от того, как закончился цикл.
Кроме того, поскольку вы пытаетесь установить свой флаг независимо от того, нашли ли вы элемент или нет, вам не следует сбрасывать его на каждой итерации:
found_obj = None
flag = True
for obj in objects:
if obj == 3:
found_obj = obj
print("found the required object ",found_obj)
flag = False
break
print ('Status flag ::', flag)
Наконец, так как вы устанавливаете found_obj
когда вы нашли элемент, вам вообще не нужен этот флаг, так как значение None
скажет вам, что вы ничего не нашли, и любое другое значение скажет вам, что вы нашли это:
found_obj = None
for obj in objects:
if obj == 3:
found_obj = obj
print("found the required object ",found_obj)
break
print ('Status flag ::', found_obj is None)
Если break
-ing не вариант, это фиксированный код:
objects=[1,2,3,4,5]
found_obj = None
flag = True # flag is set once, before the loop
for obj in objects:
# this sets the flag to True *on each iteration*, we only want it once!
# flag = True
if obj == 3:
found_obj = obj
print("found the required object ",found_obj)
flag= False
else:
print ('Status flag ::', flag)
Это небольшая вариация структуры петли, которую я знаю по имени свидетель, поскольку вас интересует только один "свидетель" для дачи показаний. 3
находится в списке объектов. Как только вы нашли этого свидетеля (который является элементом 3).