#python #for-loop
#python #для-цикла
Вопрос:
Я пишу простой цикл For на Python. Есть ли способ разорвать цикл без использования команды ‘break’. Я бы подумал, что, установив count = 10, условие выхода будет выполнено, и цикл остановится. Но, похоже, это не так.
ПРИМЕЧАНИЕ: Часть проблемы заключается в использовании цикла FOR, а не цикла WHILE.
import random
guess_number = 0
count = 0
rand_number = 0
rand_number = random.randint(0, 10)
print("The guessed number is", rand_number)
for count in range(0, 5):
guess_number = int(input("Enter any number between 0 - 10: "))
if guess_number == rand_number:
print("You guessed it!")
count = 10
else:
print("Try again...")
count = 1
Я новичок в программировании, поэтому я просто промокаю ноги. Я мог бы использовать «перерыв», но я пытаюсь понять, почему цикл не заканчивается, когда вы правильно вводите угаданное число.
Комментарии:
1. Это не заканчивается, потому что вы не используете
break
😉2. Правильный способ выйти из цикла в Python — использовать
break
. Стиль Pythonic обычно скорее препятствует, чем поощряет запутывающие обходные пути.
Ответ №1:
for
Цикл, который у вас здесь, не совсем такой, как то, что вы видите в других языках программирования, таких как Java и C. range(0,5)
генерирует список, и for
цикл повторяется по нему. На каждой итерации цикла условие не проверяется. Таким образом, вы можете переназначить переменную цикла по своему желанию, но на следующей итерации она просто будет установлена на любое значение, которое будет следующим в списке.
На самом деле это не имело бы смысла, чтобы это работало в любом случае, поскольку вы можете перебирать произвольный список. Что, если бы ваш список был, вместо range(0,5)
, что-то вроде [1, 3, -77, 'Word', 12, 'Hello']
? Не было бы способа переназначить переменную таким образом, чтобы это имело смысл для прерывания цикла.
Я могу придумать три разумных способа выхода из цикла:
- Используйте
break
инструкцию. Это делает ваш код чистым и простым для понимания - Окружите цикл блоком try-except и вызовите исключение. Это было бы неуместно для примера, который вы показали здесь, но это способ, которым вы можете вырваться из одного (или нескольких!)
for
циклы. - Поместите код в функцию и используйте
return
оператор для прерывания. Это также позволяет вам выйти из более чем одногоfor
цикла.
Еще один способ (по крайней мере, в Python 2.7), который вы можете прервать цикл, — это использовать существующий список, а затем изменять его во время итерации. Обратите внимание, что это очень плохой способ, но он работает. Я не уверен, что этот пример будет работать в Python 3.x, но он работает в Python 2.7:
iterlist = [1,2,3,4]
for i in iterlist:
doSomething(i)
if i == 2:
iterlist[:] = []
Если у вас есть doSomething
print out i
, он будет печатать только 1 и 2, а затем завершит цикл без ошибок. Опять же, это плохой способ сделать это.
Комментарии:
1. (Подразумевается: присвоение переменной count внутри цикла бессмысленно.)
2. Итак, могу ли я изменить несколько подобных вещей и заставить их прерваться раньше: для count в диапазоне (0, 5, count2) затем присвоить count2 = 10, если число совпадает?
3. Нет. Присвоение нового значения count2 не приведет к изменению каких-либо значений, сохраняемых создающим генератором
range(0,5,count2)
.
Ответ №2:
Вы можете использовать while
:
times = 5
guessed = False
while times and not guessed:
guess_number = int(input("Enter any number between 0 - 10: "))
if guess_number == rand_number:
print("You guessed it!")
guessed = True
else:
print("Try again...")
times -= 1
Комментарии:
1. Извините, я должен был упомянуть, что часть проблемы заключается в продолжении использования цикла for . Тем не менее, цикл while работает. Я проверил это.
2. Правильный способ выйти из цикла в Python — использовать
break
. Стиль Pythonic обычно скорее препятствует, чем поощряет запутывающие обходные пути. Это не Perl:-P.
Ответ №3:
Циклы For в Python работают следующим образом.
У вас есть итерируемый объект (например, a list
или a tuple
), а затем вы просматриваете каждый элемент в итерируемом, сохраняя текущее значение в указанной переменной
Вот почему
for i in [0, 1, 2, 3]:
print item
и
for j in range(4):
print alist[j]
работает точно так же. i
и j
являются вашими переменными хранилища, а [0, 1, 2, 3]
и range(4)
являются вашими соответствующими итерациями. range(4)
возвращает список [0, 1, 2, 3]
, делая его идентичным первому примеру.
В вашем примере вы пытаетесь присвоить вашей переменной хранилища count
какое-то новое число (которое будет работать на некоторых языках). Однако в python count
просто переназначается следующей переменной в range
и продолжается. Если вы хотите выйти из цикла
- Используйте
break
. Это самый питонический способ - Создайте функцию и
return
значение посередине (я не уверен, что это то, что вы хотели бы сделать с вашей конкретной программой) - Используйте
try/except
блок и поднимитеException
, хотя это было бы неуместно
В качестве примечания, вы можете рассмотреть возможность использования xrange()
, если вы всегда / часто будете выходить из своего списка раньше.
Преимущество xrange() над range() минимально… за исключением случаев, когда … все элементы диапазона никогда не используются (например, когда цикл обычно завершается break )
Как указано в комментариях ниже, xrange
применяется только в python 2.x. В python 3 все range
s функционируют как xrange
Комментарии:
1. Обратите внимание, что
xrange
это применимо только к Python 2. В Python 3 нетxrange
.
Ответ №4:
В Python for
цикл означает «для каждого элемента сделайте это». Чтобы завершить этот цикл раньше, вам нужно использовать break . while
циклы работают со значением предиката. Используйте их, когда хотите что-то сделать, пока ваш тест не станет ложным. Например:
tries = 0
max_count = 5
guessed = False
while not guessed and tries < max_count:
guess_number = int(input("Enter any number between 0 - 10: "))
if guess_number == rand_number:
print("You guessed it!")
guessed = True
else:
print("Try again...")
tries = 1
Ответ №5:
Что сказал @Rob Watts: Python для циклов не работает, как Java или C для циклов. Чтобы быть немного более явным…
«Эквивалент» C будет:
for (count=0; count<5; count ) {
/* do stuff */
if (want_to_exit)
count=10;
}
… и это будет работать, потому что значение count
проверяется ( count<5
) перед началом каждой итерации цикла.
В Python range(5)
создает список [0, 1, 2, 3, 4]
, а затем с помощью for
перебирает элементы этого списка, копируя их в count
переменную один за другим и передавая их в тело цикла. Циклу Python for
«все равно», если вы измените переменную цикла в теле.
for
Цикл Python на самом деле намного более гибкий, чем цикл C for
из-за этого.
Ответ №6:
Вероятно, вы хотите использовать break
и избегать присвоения переменной count .
Смотрите Следующее, я отредактировал его с некоторыми комментариями:
import random
guess_number = 0
count = 0
rand_number = 0
rand_number = random.randint(0, 10)
print("The guessed number is", rand_number)
# for count in range(0, 5): instead of count, use a throwaway name
for _ in range(0, 5): # in Python 2, xrange is the range style iterator
guess_number = int(input("Enter any number between 0 - 10: "))
if guess_number == rand_number:
print("You guessed it!")
# count = 10 # instead of this, you want to break
break
else:
print("Try again...")
# count = 1 also not needed
Ответ №7:
Как указывали другие for
, цикл Python больше похож на традиционный foreach
цикл в том смысле, что он перебирает коллекцию элементов без проверки условия. Пока в коллекции есть что-то, Python будет принимать их, и если вы переназначите переменную цикла, цикл не будет знать или заботиться.
Для того, что вы делаете, рассмотрите возможность использования for ... break ... else
синтаксиса, поскольку он более «питонический»:
for count in range(0, 5):
guess_number = int(input("Enter any number between 0 - 10: "))
if guess_number == rand_number:
print("You guessed it!")
break
else:
print("Try again...")
else:
print "You didn't get it."
Ответ №8:
Как указано в вашем вопросе, ПРИМЕЧАНИЕ: часть проблемы заключается в использовании цикла FOR, а не цикла WHILE, и вы не хотите его использовать break
, вы можете поместить его в функцию и вернуть, когда угадывается правильное число, чтобы прервать цикл.
import random
def main():
guess_number = 0
count = 0
rand_number = 0
rand_number = random.randint(0, 10)
print("The guessed number is", rand_number)
for count in range(0, 5):
guess_number = int(input("Enter any number between 0 - 10: "))
if guess_number == rand_number:
print ("You guessed it!")
return
else:
print("Try again...")