Циклы for, while в Python

Вот она - бесконечность Python

В статье разбираем циклы for, while в Python, использование функций range() и enumerate()

Что такое циклы в Python: зачем они нужны

Итак, термин «цикл» часто встречается в обычной жизни.

Сутки, дни недели, времена года, даже года – это своеобразные представители циклов.

Даже существует выражение «зациклиться на чем-то», что означает бесконечное занятие одной и той же деятельностью. Возвращаясь к теме, в python цикл имеет похожее значение.

Если придерживаться более строгой формулировки, то цикл в python – это блок кода, повторяющийся некоторое (а порой и бесконечное) количество раз.

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

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

Допустим, вы решили перебрать старые вещи и достали все коробки с чулана. Теперь необходимо построить алгоритм проверки коробок.

Алгоритм без цикла (они называются линейными):

  1. Открыть коробку №1.
  2. Проверить ее содержимое.
  3. Перейти к коробке №2.
  4. Проверить ее содержимое.
  5. Перейти к короб. №3.
  6. Проверить ее содержимое.

Только первые три коробки, а уже столько заморочек. В жизни бы вы их не заметили, а вот компьютеру придется объяснять все дословно, если только не воспользоваться циклическим алгоритмом.

С ним все выглядело бы так:

  1. Текущая коробка (n) = 1.
  2. Открыть коробку № n.
  3. Проверить ее содержимое.
  4. Если ящики не закончились, то увеличить n на один, а после вернуться к пункту 2.
  5. Иначе закончить поиск.

Заметьте, с таким алгоритмом пользователь может проверить бесконечное множество коробок, а количество команд так и останется равным пяти.

✅Читайте здесь Работа с числами в Python

Разве такой результат можно получить с помощью линейного алгоритма, а не циклического? Конечно, нет. Надеемся, что вы поняли основное преимущество циклов. Однако, в python, помимо основного преимущества существуют и дополнительные плюсы.

 

Задачи с коробками отлично подходят, чтобы понять суть переменных и циклов
Задачи с коробками отлично подходят, чтобы понять суть переменных и циклов

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

Цикл for: синтаксис

Как вы уже поняли, в питоне существует несколько типов циклов, один из них – это for. Цикл for часто используется для перебора значений внутри структурной переменной. Это позволяет обращаться сразу к элементу, а не к его индексу или ключу (предполагается, что читатель уже знает о списках и словарях).

Синтаксис конструкции for в python выглядит следующим образом:

for i in variable:

#some code

Разберем каждую команду отдельно.

For – это ключевое слово, которое говорит интерпретатору, что ниже будет цикл. i – это переменная, в которую будут помещаться временные значения для перебора. in – это еще одно ключевое слово, которое говорит интерпретатору, из какой переменной брать значения для i.

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

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

Наглядное обозначение синтасиса
Наглядное обозначение синтасиса

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

На языке python это будет выглядеть следующим образом:

boxes = ["текстиль", "старые игрушки", "посуда", "радиодетали", "зимние вещи", "фотографии"] # список с вещами
<p>print("среди боксов были найдены следующие вещи:") # операция вне цикла, которая выполнится один раз
for i in boxes:
print(i) # операция в цикле, которая выполнится столько раз, сколько значений в переменной boxes
print("Это весь список") # операция, которая выполнится один раз после завершения списка

Результат выполнения программы вы можете увидеть на скриншоте ниже

 

Результат выполнения программы
Результат выполнения программы

Использование функций range() и enumerate()

Однако иногда нет необходимости перебирать списки, а только выполнить код указанное количество раз. В таком случае на помощь приходит функция range, которая генерирует последовательность чисел в указанном диапазоне с заданным шагом.

Рассмотрим пример:

counter = int(input("Ну сколько раз еще нужно сказать \"ну пожалуйста\", чтобы вы согласились:"))
for i in range(0, counter):
print ("ну пожалуйста!", sep=" ")
print("А теперь вы согласитесь?")

Теперь эта программа будет выводить сообщение столько раз, сколько введет пользователь. Это удобно, когда нужно получить только число. Теперь перейдем к функции enumerate.

Она, в отличие от range, принимает в качестве аргумента список, а после возвращает список кортежей, где каждый кортеж состоит из двух значений: индекс элемента и его значение.

Пока непонятно, где на практике может понадобиться такая возможность, но главное, что она есть.

Реализация:

example = ["-", "кило", "мега", "гига", "тера", "пета"]
print("приставки к единицам измерения в информатике:")
for k, i in enumerate(example): # в k будет храниться индекс, а в i значение
print(k, ":", i)
Результат программы ожидаем.
Результат программы ожидаем.

Вложенный цикл

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

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

Чтобы создать вложенную конструкцию, достаточно еще раз указать ключевое слово for, открыть новый блок с помощью знака двоеточия, а после писать все конструкции с уже с двойным отступом. То есть, два вложенных цикла – два отступа, три – три отступа и так далее.

Пример вложенности:

strings = ["Утро","День","Вечер", "Ночь"]
for i in strings: # в i помещается отдельный элемент из списка
for z in i: # в z помещается отдельный символ из элемента, полученного в цикле выше
print(z, sep = " ")
print("\n")
На каждый уровень блока – отдельный отступ
На каждый уровень блока – отдельный отступ

Цикл while

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

В принципе, конструкции, которые упрощают какие-то процессы, но не добавляют ничего нового, называются «синтаксическим сахаром». А вот while – это уже не «сахар», а незаменимая конструкция, которая, в отличие от for, позволяет делать не только циклы с определенным количеством повторений, но и циклы с условиями и даже бесконечные (python от такого не защищен).

Синтаксис конструкции:

while (condition):

#code

Пока истинно условие (condition), будет выполняться код внутри блока. Может выйти так, что цикл не выполнится ни разу, если условия заведомо ложное.

Блок-схема while
Блок-схема while

Давайте рассмотрим три примера.

Пример с обычным условием:

numbers = [2,6,7,9,13,18,24,32,52,55,60,61,66,70,71,77,80,100] #список чисел
x = 0 # счетчик, по нему можно обратиться к элементу списка
while (numbers[x] <= 70): # выполнять, если (или пока) текущий элемент меньше 70
print(numbers[x]) # вывести текущий элемент
x+=1 # увеличить индекс, чтобы перейти к следующему элементу

Программа выведет все числа до 70, а вот 71, 77 и т.д. не выведутся, так как они не соответствуют условию внутри while.

Пример с заведомо ложным условием:

while (5 == 2):
print("YES")

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

Пример с всегда истинным условием:

while (5 == 5):
print("YES")

А вот эта программа, наоборот, зациклится и не закончится, ведь пока условие истинно, цикл не остановится. Будьте осторожны, бесконечные циклы – это частая проблема в коде, которую трудно найти.

Небольшая шпаргалка
Небольшая шпаргалка

Бесконечный цикл while

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

Так вот, чтобы не пускать пользователя дальше, пока тот не введет пароль, можно использовать как раз такие бесконечные циклы.

Реализация:

correct_password = "qwerty123"
user_password = ""
while (True): # условие заведомо постоянно истинно
user_password = input("введите пароль:")
if (user_password == correct_password):
break
print("Неверный пароль")
Вот она - бесконечность
Вот она — бесконечность

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

Результат выполнения программы
Результат выполнения программы

Операторы break, continue и pass в python

В python существует три ключевых слова, которые могут повлиять на поведение циклов.

Первый из них – это break. Когда вы указываете в блоке кода break, то он автоматически прерывает выполнение текущей итерации и реализует выход из цикла. Пример вы могли увидеть выше.

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

Пример программы, которая переписывает введенный текст, но без запятых:

word = "это предложение, чтобы показать работу continue,,,"
for i in word:
if(i == ","): # если запятая, то перейти к следующему элементу
continue
print(i, end = "")

На выходе пользователь получит только «это предложение чтобы показать работу continue». И, наконец, pass. Это слово не играет практической роли на итоговом этапе разработки, а нужно только при тестировании.

Если создать пустой цикл, то появится ошибка синтаксиса (а точнее отступов). Если создать его, а после добавить слово «pass», то все будет работать. Подытоживая, pass – это своего рода слово-пустышка для заполнения кода.

Небольшая шпаргалка
Небольшая шпаргалка

Оператор else

Помните, в условиях мы использовали else, чтобы указать действия, выполняемые в противном случае. Так вот, в питоне похожая роль и у else в for и while.

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

Реализация:

rates = [5,5,3,5, 6, 5]
for i in rates:
if(i > 5 or i < 2):
print("В списке есть некорректная оценка")
break
else:
print("Проверен весь список, ошибок нет") 

Теперь else будет работать только в том случае, если цикл не будет прерываться break-ом. В этом примере, к слову, прерывание будет, а потому вывод из else не сработает. Попробуйте убрать 6 из списка, чтобы исправить ситуацию. 

Заключение

Когда я впервые познакомился с циклами (а было это еще на C++), я решил, что это бесполезная вещь, ведь проще вводить команды отдельно, а не думать над условиями для циклических алгоритмов. Так вот, новичков, возможно, посещают похожие мысли. Со временем это пройдет, когда проекты станут более серьезными, а лаконичность кода выйдет на передний план. А на этом у нас все, благодарим за прочтение.

Айтистанция
Добавить комментарий

Мы используем файлы cookie на нашем сайте

OK