Циклы в Питоне: while

Андрей К…
Последнее изменение:
0
0
0

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

Практических примеров цикла можно назвать много, например:

  • Просмотреть все файлы в папке (и удалить старые)
  • Просканировать все ссылки на сайте (и собрать все статьи)
  • Посчитать сложные проценты (прибавляя % каждый раз к предыдущему значению)
  • Просканировать все сервера в интернете
  • Бесконечно ждать ответа от другого компьютера или устройства
  • Получить список значений (например, торговых пар на бирже) и выбрать из них только активные
  • Заставлять бота работать бесконечно, например торговать на бирже или добавлять друзей в твиттере/инстаграмме
  • И всякое разное другое

В общем циклы, это одно из краеугольных моментов программирования, и их нужно знать. Давайте рассмотрим, как это делается в Питоне.


Реклама


while

Начнем с простого цикла – он будет выполняться до тех пор, пока какое-то условие истинно. Давайте для наглядности возьмем такой код:

while True:
    print('Я тут')

    print('Привет привет')

print('Обо мне вы никогда не услышите (((((')

Фактически, я говорю интерпретатору  Питона компьютеру:

  1. Когда дойдешь до выполнения этого кода, проверь, является ли то, что написано в строчке после while истинным значением.
  2. Если да, то
    1. выполни все, что находится в блоке после него, отделенное отступами слева (тело цикла)
    2. вернись снова к пункту 1
  3. Если нет, то выполняй все, что находится после тела цикла

Если вы запустите пример, то увидите, что примерно бесконечное количество раз на экран выводятся фразы «Я тут», «Привет привет»

Программа ушла в бесконечный цикл, пока мы её не остановим, она так и будет работать. Иногда (и довольно часто) это является желаемым поведением, и бесконечные циклы создаются специально, иногда это следствие ошибки программирования. Давайте рассмотрим несколько способов выхода из такого цикла.

Выход по изменению истинности условия.

Кстати говоря, что такое истинность в терминологии Питона? Это либо ключевое слово True, которое мы указывали в примере выше, либо числовое значение не равное нулю, либо непустая последовательность значений.  

Давайте начнем с простой проверки условия. Например, истинно ли то, что число 3 больше 5? А то, что 5 больше 3?

Мы видим, как Питон возвращает ключевое слово True или False в зависимости от истинности условия (True это истина, а False означает ложь). Мы могли бы изменить наше условие на что-то похожее

И оно также работало бы бесконечно, потому 3 всегда будет меньше 5 (по крайней мере, в математике).

Однако, если использовать переменные, можно их менять в теле цикла, и выходить из него, когда истинность изменится. Возьмем для примера хулигана Петю, который выбивает зубы у отличника Васи. Петя планирует оставить Васе хотя бы 3 зуба, что бы тот мог есть (и смешно фепелявить). Нет-нет, мы не поддерживаем Петю!

vasyas_teeth = 32

while vasyas_teeth > 3:
    print('Хрясь')
    vasyas_teeth -= 1
    print('Осталось', vasyas_teeth, 'зубов')

print('Фсё! Осталось', vasyas_teeth, 'зубов')

Изначально мы объявили переменную vasyas_teeth, где указали, что у Васи 32 зуба (он же отличник, все зубы мудрости вылезли заранее). Каждый раз Петя проверяет, что осталось больше зубов, чем он умеет считать 3, и выбивает еще один. Когда зубов становится не больше трех, Петя прекращает свои противоправные действия (и едет зону на малолетку, хотя это другая история).

Вот как-то так всё:

 

Говоря серьезно, каждый раз проверялось условие vasyas_teeth > 3, пока оно было истинным цикл выполнялся, когда значение в переменной vasyas_teeth стало равно 3, вычисление 3 > 3 оказалось ложным, и программа продолжила выполнение в обход тела цикла, и больше никогда к нему не вернется.

Выход по команде

Помимо выхода «логического», как в примерах выше, иногда бывает полезным завершить цикл заранее, при каких-то условиях. В нашем примере, могли появиться родители, полиция, друзья Васи, Петя мог устать, и всякое другое разное, что помешало бы довести задуманное до конца.

 Давайте подключим модуль random для генерации псевдослучайных событий, random.random() возвращает случайное число от 0 до 1, после каждого выбитого зуба Петя озирается, и, если random.random() > 0.8 (т.е. с вероятностью 0.2, они же 20%) появляется кто-то, Петя убегает. Хулиганы, они такие. Теперь Пете намного сложное закончить начатое.

import random

vasyas_teeth = 32

while vasyas_teeth > 3:
    print('Хрясь')
    vasyas_teeth -= 1
    print('Осталось', vasyas_teeth, 'зубов')
    if random.random() > 0.8:
        print('Шухер')
        break

print('Фсё! Осталось', vasyas_teeth, 'зубов')

 

В этом примере появилось ключевое слово break.

Это слово обозначает выйти из цикла немедленно, не дожидаясь следующей проверки. Программа продолжит выполнять код дальше по тексту, после тела цикла.

Пропуск шага цикла

Еще есть ключевое слово continue, оно позволяет сразу перейти к следующему шагу цикла. Допустим, зуб выбивается с вероятностью 35%, поэтому удар засчитывать надо, а зуб вычитать – нет. Давайте это реализуем.

import random

vasyas_teeth = 32

while vasyas_teeth > 3:
    
    print('Хрясь')
    
    if random.random() < 0.65:
        print('Зуб не выбит')
        continue
    
    if random.random() > 0.8:
        print('Шухер')
        break
    vasyas_teeth -= 1
    print('Осталось', vasyas_teeth, 'зубов')
    

print('Фсё! Осталось', vasyas_teeth, 'зубов')

Теперь, «Хрясь» происходит как и раньше, каждый раз, однако, если зуб не выбит, срабатывает слово continue, оставшаяся часть логики в теле цикла не выполняется, а цикл уходит на новую проверку. При этом счетчик зубов так же не уменьшается, поэтому Пете приходится долбить еще и еще.

Ну, и что бы довести ситуацию с Петей до более правильного завершения, логично предположить, что посторонние люди могут появиться в любой момент, а не только после удара, поэтому поставим их в начало цикла, потом удар, потом проверка на выбитый зуб и увеличение счетчика. Вот так:

import random

vasyas_teeth = 32

while vasyas_teeth > 3:

    if random.random() > 0.8:
        print('Шухер')
        break
    
    print('Хрясь')
    
    if random.random() < 0.65:
        print('Зуб не выбит')
        continue
    
    vasyas_teeth -= 1
    print('Осталось', vasyas_teeth, 'зубов')
    

print('Фсё! Осталось', vasyas_teeth, 'зубов')

Теперь возможны ситуации, когда Вася вообще не пострадает. И это правильно.


Реклама


Заключение:

Помимо while в питоне есть циклы for, которые итерируются по последовательностям, и специальные слова, например range, для генерации последовательностей. Рассмотрим их в следующих статьях цикла.

Удачи вам в изучении нового языка!

Нет комментариев
Пожалуйста, Авторизуйтесь что бы оставить свой комментарий