понедельник, 7 декабря 2015 г.

Циклы for и while

Общее представление циклов



Циклы приходят к нам на помощь тогда, когда есть необходимость выполнить определенный сегмент кода несколько раз. В зависимости от условий, цикл может быть бесконечным, обрываемым при получении определенного результата, условным - когда условие цикла проверяет значение какого-то выражения и при получении результата, выполняет или не выполняет заложенный в него блок кода. Давайте представим, что нам нужно заполнить список из 50 элементов числами, каждое последующее из которых, будет множиться на 2.
Среди всего разнообразия различных вариантов А-ля "Да заполним этот список руками, умножая все это дело на калькуляторе своего телефона", мы можем применить цикл. Как? Очень просто.

Давайте представим, что у нас есть некий абстрактный список, и мы будем заполнять его значениями, начиная от 1, и умножая каждый раз предыдущее значение на 2. Текущее значение, будет храниться в какой-то переменной и изначально равняется 1. Мы говорим циклу, что пока длинна списка не достигнет 50, мы выполняем цикл. В блоке кода(теле) цикла, мы добавляем текущее значение переменной, где сохранено то число, которое мы будем добавлять и умножать. Затем умножаем его на 2 с присваиванием результата в ту же переменную. Теперь там уже не 1, а 2, а это значит, что при втором выполнении цикла, 2й элемент списка добавится 1 умноженное на 2. После чего 2 опять умножится на 2 и станет равно 4 и при следующем выполнении цикла третим элементом списка станет 4, Т.Е. 2 Помноженное на 2, а это значит, что когда длинна списка достигнет 49 индекса, Т.Е. Он будет состоять из 50 элементов. Каждый элемент начиная с первого, будет помноженный на 2. Что в свою очередь полностью соответствует условиям поставленной задачи.

И так цикл - это некая структура кода, которая может выполнять определенный блок исходя из каких-то условий, необходимое количество раз. Мы опять запутались? Значит переходим от абстракции к практике.


Цикл while



Цикл while, будет выполнять блок кода, пока выражение после while будет возвращать True или пока не будет прерван специальным оператором, про которые мы будем говорить далее. Как выглядит конструкция while:

while выражение:

    блок кода


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

Давайте рассмотрим реальное выполнение задачи со списком элементов значений с умножением каждого предыдущего на 2:

>>> i = 1 # Изначальное значение, которое мы будем добавлять и умножать

>>> a = [] # Пустой список

>>> while len(a) < 50: # Цикл будет выполняться до тех пор, пока длинна списка меньше 50

...     a.append(i) # добавляем в список элемент с текущим значением i

...     i = i * 2 # Умножаем текущее значение i на 2 и присваеваем результат обратно i

...

>>> len(a) # Длинна списка после выполнения цикла

50

>>> a

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65

536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554

432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648L, 4294967

296L, 8589934592L, 17179869184L, 34359738368L, 68719476736L, 137438953472L, 2748

77906944L, 549755813888L, 1099511627776L, 2199023255552L, 4398046511104L, 879609

3022208L, 17592186044416L, 35184372088832L, 70368744177664L, 140737488355328L, 2

81474976710656L, 562949953421312L]

>>>


Это чудесно. Всего несколько строк позволили нам получить достаточно ощутимый результат. Чем-то while похож на if, с ттой лишь разницей, что блок кода после if выполняется один раз при значении выражения True, а while будет выполняться все время, пока значение выражения будет True.


Цикл for



Если цикл While для тех, кто знает какие-то другие языки был вполне предсказуем, то цикл for, будет слегка, если так можно выразиться, нестандартным. Цикл фор предназначен для обхода списка элементов (итерируемого объекта). Чем-то for в Python, напоминает foreach в таком языке как c#, но является куда более гибким. Как выглядит конструкция for:

for имя временной переменной in список для обхода:

    блок кода


Давайте разберем чуть-чуть подробнее. Что такое временная переменная? Это переменная, в которую будут помещаться элементы списка, обход которого мы совершаем. При первом выполнении цикла for, туда будет помещен первый элемент списка. При втором, второй элемент списка... И так до тех пор, пока список не закончится. Временную переменную можно использовать в процессе выполнения цикла, но после того, как цикл прекратит свою работу, временная переменная будет уничтожена. Давайте посмотрим на цикл for в действии:

>>> a = ["Red", "Blue", "Green", "Magenta"]

>>> a

['Red', 'Blue', 'Green', 'Magenta']

>>> for i in a:

...     print i

...

Red

Blue

Green

Magenta

>>> for i in a:

...     print "Color " + i

...

Color Red

Color Blue

Color Green

Color Magenta

>>>


Мы создали список, содержащий 4 строчных элемента. За первым разом, пробежались по нему, просто выводя значение элементов на экран, а за вторым разом, вывели значения элементов, добавив в начало слово Color.

Давайте для общего фана, решим такуюже задачу, которую мы решали при помощи цикла while. Для этого, мы рассмотрим одну полезную функцию, которая возвращает список чисел - range():

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>


Передаваемый функции range() аргумент, генерирует список чисел от нуля до указанного числа, не включая его. Т.Е. При аргументе 10, будет сгенерирован список из 10 элементов от нуля до 9. Также мы можем явно указать двумя аргументами, с какого числа и по какое, не включая последнее, нам нужно генерировать список чисел:

>>> range(1,10)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>


В следующих темах, мы рассмотрим функцию range() более детально, как и еще некоторые встроенные функции Python.

>>> a = [1] # Список с изначальным элементом 1

>>> a

[1]

>>> for i in range(0,49):

...     a.append(a[i]*2)

...

>>> len(a)

50

>>> a

[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65

536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554

432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648L, 4294967

296L, 8589934592L, 17179869184L, 34359738368L, 68719476736L, 137438953472L, 2748

77906944L, 549755813888L, 1099511627776L, 2199023255552L, 4398046511104L, 879609

3022208L, 17592186044416L, 35184372088832L, 70368744177664L, 140737488355328L, 2

81474976710656L, 562949953421312L]

>>>


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

Мы создали список, который содержит в себе первым элементом единицу, Т.Е. изначальное значение, с которого мы должны начать список. Далее, мы говорим циклу for, что он будет бежать по списку, который сгенерирован функцией range() от нуля до 48 включительно. Это значит, что переменная i при первом прохождении цикла, будет равна 0.

В теле цикла, мы добавляем элемент в список "a", руководствуясь следующей логикой. Добавить элемент в список "a"(элемент списка "a"[с индексом i] умножить на 2). Элемент списка "a" с индексом "i" - это каждый раз будет предыдущий элемент списка, Т.К. изначально список содержит один элемент под индексом 0 со значением 1. Добавляем еще один элемент в список "a", взяв элемент с индексом 0 и умножив его на 2. Список уже состоит из 2х элементов с индексами 0 и 1. Цикл фор переходит на следующий элемент списка, который сгенерирован функцией range() - это 1. Теперь блок кода будет добавлять элемент в список "a", взяв элемент со списка "a" с индексом i, Т.Е. 1 и умножив его на 2... И таким образом, в список "a", будет добавлено еще 49 элементов, каждый из которых будет равен предыдущему элементу умноженному на 2. Сложно? А никто не обещал, что будет легко.


Оператор continue в циклах



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

>>> a = [1,2,3,4,5]

>>> for i in a:

...     print i

...

1

2

3

4

5

>>> for i in a:

...     if i == 3:

...             continue

...     print i

...

1

2

4

5

>>>


Мы создали список из 5 элементов от 1 до 5 и пробежались по нему циклом for, выводя значение каждого элемента на экран. За первым разом, мы получили все элементы, Т.К. никаких особых условий у нас не было. За вторым разом, при помощи условного оператора if, мы проверяли, не является ли текущий пробегаемый элемент значению 3 и когда for дошел до элемента списка со значением 3, блок кода после if был выполнен. В блоке кода if, у нас был оператор continue, который прервал выполнение цикла в месте своего нахождения и цикл продолжил выполняться со следующего шага, пропустив код после continue, что привело к тому, что значение 3 так и не было выведено на экран. Оператор continue, выполняет одинаковую роль как для цикла for, так и для цикла while.


Оператор break



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

>>> a

[1, 2, 3, 4, 5]

>>> for i in a:

...     if i == 3:

...             break

...     print i

...

1

2

>>>


Мы взяли такой же пример, как и для continue, но теперь на экран вывелись только первых 2 элемента со значением 1 и 2, когда мы дошли до элемента со значением 3, был выполнен блок кода после if, где встретился оператор break и цикл полностью завершил свою работу. Как и оператор continue, break выполняет одинаковую роль в циклах for и while.


Часть else в циклах



Циклы в Python, могут содержать в себе часть else, которая будет выполнена в случае, если цикл небыл оборван оператором break. Если сказать проще, часть else не будет выполнена тогда, когда цикл будет оборван оператором break.

>>> a

[1, 2, 3, 4, 5]

>>> for i in a:

...     print i

... else:

...     print "End"

...

1

2

3

4

5

End

>>> for i in a:

...     if i == 3:

...             break

...     print i

... else:

...     print "End"

...

1

2

>>>


За первым разом, цикл прошелся по всем элементам списка до конца, завершил свою работу вполне штатно и вывел часть else. за вторым разом, когда цикл добрался до элемента со значением 3 и был выполнен оператор break после if. Цикл завершил свою работу и часть else не была выполнена, Т.К. Цикл был оборван оператором break.

Комментариев нет:

Отправить комментарий