Для не прерывающегося цикла (Python)

#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'] ? Не было бы способа переназначить переменную таким образом, чтобы это имело смысл для прерывания цикла.

Я могу придумать три разумных способа выхода из цикла:

  1. Используйте break инструкцию. Это делает ваш код чистым и простым для понимания
  2. Окружите цикл блоком try-except и вызовите исключение. Это было бы неуместно для примера, который вы показали здесь, но это способ, которым вы можете вырваться из одного (или нескольких!) for циклы.
  3. Поместите код в функцию и используйте 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 и продолжается. Если вы хотите выйти из цикла

  1. Используйте break . Это самый питонический способ
  2. Создайте функцию и return значение посередине (я не уверен, что это то, что вы хотели бы сделать с вашей конкретной программой)
  3. Используйте 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...")