Статьи

Плавное освежение на петлях Python

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

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

Чтобы дать представление о важности зацикливания, скажем, что вы писали программу, которая должна печатать одно и то же утверждение 100 000 раз. Вы бы посмели повторить это утверждение 100 000 раз вручную ?! Я не буду, и я думаю, что вы тоже не будете. Я уверен, что у вас есть гораздо более важные дела. Вот так и возникает красота петель.

Без дальнейших церемоний, давайте посмотрим, как работает цикл Python.

В этом типе итерации, пока тест оценивается как true , оператор или блок операторов продолжают выполняться. Таким образом, управление продолжает возвращаться к началу оператора (т. Е. Test) и будет обрабатывать управление следующим оператором (ами), если тест оценивается как false . Если тест всегда оценивается как true, в этом случае мы имеем бесконечный цикл .

Общий синтаксис оператора while очень прост и выглядит следующим образом:

1
2
while test: # loop test
   statements # loop body

Помните термин бесконечный цикл, который я упоминал некоторое время назад? То есть цикл, который никогда не останавливается, так как тест всегда верен? Давайте посмотрим пример такого цикла:

1
2
while 1:
   print ‘I\’m an infinite loop.

Значение 1 является другой формой логического значения true . Таким образом, если вы напишите while true , это будет эквивалентно выражению while в примере. Как вы заметите, вы будете печатать выписки бесконечно.

Чтобы завершить цикл, просто нажмите Control-C на клавиатуре. На рисунке ниже показано, как программа работала бесконечно и была прервана клавиатурой (т.е. Control-C).

Я бесконечный цикл Ctrl-C, чтобы остановить меня

Давайте теперь поливаем наши 10 красивых цветов Python. Это можно сделать следующим образом:

1
2
3
4
flowers = 1
while flowers <= 10:
    print ‘Water the flower # ‘ + str(flowers)
    flowers = flowers + 1

Результат программы может быть показан на следующем рисунке:

Полить цветок 10 раз

Прежде чем двигаться дальше, позвольте мне прояснить некоторые моменты в приведенном выше скрипте Python. Вам может быть интересно, что такое str() и почему мы использовали его здесь. На основании документации:

Вернуть строку, содержащую хорошо печатаемое представление объекта. Для строк это возвращает саму строку. Разница с repr(object) заключается в том, что str(object) не всегда пытается вернуть строку, приемлемую для eval() ; его цель — вернуть строку для печати. Если аргумент не указан, возвращает пустую строку '' .

Другими словами, str() вернет строковое представление объекта для печати. Но почему? Давайте посмотрим, на что Python будет жаловаться, если мы не будем использовать str() :

1
2
3
4
Traceback (most recent call last):
  File «test.py», line 3, in <module>
    print ‘Water the flower # ‘ + flowers
TypeError: cannot concatenate ‘str’ and ‘int’ objects

Таким образом, проблема в том, что str не может быть объединен с int .

Другой момент, который я хочу упомянуть, это использование flowers = flowers + 1 . Если бы мы не использовали такое утверждение, у нас был бы бесконечный цикл, в котором значение цветов оставалось бы равным 1 , и, следовательно, всегда меньше 10 (всегда истинно).

Цикл for-loop — это итерация, которая проходит по элементам упорядоченной последовательности, таким как списки , словарные ключи, кортежи , строки и т. Д.

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

1
2
for var in sequence:
   statement(s)

Где var будет содержать элементы последовательности (то есть, список, кортеж), через которые будет проходить for-loop тело for-loop будет выполняться для каждого элемента в последовательности.

Время для некоторых примеров for-loop !

1
2
3
4
5
languages = [‘Arabic’, ‘English’, ‘French’, ‘Spanish’]
counter = 0
for lang in languages:
    print ‘This language is in the list: ‘ + languages[counter]
    counter = counter + 1

Что произойдет, если мы инициализируем counter = 1 ? В этом случае вы получите ошибку, показанную ниже, поскольку в одной точке цикла индекс будет вне диапазона списка:

1
2
3
4
Traceback (most recent call last):
  File «test.py», line 4, in <module>
    print ‘This language is in the list: ‘ + languages[counter]
IndexError: list index out of range

Небольшая викторина. Каким будет вывод следующего цикла? (подсказка: помните, что Python начинает считать с 0 ):

1
2
for x in range(1,5):
   print x

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

Оператор break приводит к завершению цикла, и выполнение программы продолжается для следующего оператора.

Пример использования break показан ниже. Он показывает, как программа выходит из цикла ( break ), когда if-statement принимает значение true .

1
2
3
4
5
6
7
8
9
numbers = [1,2,3,4,5,6,7,8,9,10]
value = 1
while value in numbers:
    if value == 5:
        break
    print ‘I\’m # ‘ + str(value)
    value = value + 1
  
print ‘Sorry, I had to quit the loop when the value became 5’

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

01
02
03
04
05
06
07
08
09
10
11
12
numbers = [1,2,3,4,5,6,7,8,9,10]
value = 1
while value in numbers:
    if value < 5:
        print ‘I\’m # ‘ + str(value)
        value = value + 1
        continue
        print ‘I\’m in the if-condition, why are you ignoring me?!’
    elif value == 5:
        break
 
print (‘I have reached the last statement in the program and need to exit’)

Вы выяснили, как continue работу? Как вы думаете, что будет на выходе этого скрипта Python? Вперед, попробуй это.

Это утверждение немного сложнее. Оператор pass является null , то есть он ничего не делает. Но зачем мы это используем? Предположим, что вы писали программу, и в какой-то момент вы не были уверены, что должно быть в for-statement for, например, следующим образом:

1
2
3
4
5
6
numbers = [1,2,3,4,5,6,7,8,9,10]
value = 1
for value in numbers:
    # not sure what to do here yet
     
print (‘I have reached the last statement in the program and need to exit’)

Если вы попытаетесь запустить программу, вы получите следующую ошибку:

1
2
3
4
File «test.py», line 6
    print (‘I have reached the last statement in the program and need to exit’)
        ^
IndentationError: expected an indented block

Поэтому Python жалуется, что внутри цикла for-loop должно быть какое-то утверждение. Если вы введете pass в for-loop , вывод программы будет таким:

1
I have reached the last statement in the program and need to exit

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

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

1
2
3
4
5
6
7
8
9
numbers = [1,2,3]
value = 1
while value in numbers:
        print ‘I\’m # ‘ + str(value)
        value = value + 1
else:
    print ‘I\’m part of the else statement block’
    print ‘I\’m also part of the else statement block’
    

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

Делать это на изображении размером 256x256 означает, что мне пришлось повторить операции 65,536 раз (это количество пикселей)! Цикл на помощь!