12 октября 2012 г.

Циклы



Циклы while и for

Инструкция  while, обеспечивает способ организации универсальных циклов;
Инструкция for, предназначена для обхода элементов в последовательностях и выполнения
блока программного кода для каждого из них.


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


Циклы while:

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

Общий формат:


while <test>:          # Условное выражение test
    <statements1>      # Тело цикла
else:                  # Необязательная часть else
    <statements2>      # Выполняется, если выход из цикла
                       # производится не 
                       # инструкцией break

Пример:


>>> while True:
...     print(‘Type Ctrl-C to stop me!’)

Пока условие возвращает истину на экран будет выводится "Type Ctrl-C to stop me!", если нажать Ctrl-C тогда мы прекратим выполнение цикла, тем самым задав ему ложное значение False.
-----------------------------------------------------------------


>>> x = ‘spam’
>>> while x:       # Пока x не пустая строка
...     print(x, end=’ ‘)
...     x = x[1:]  # Вырезать первый символ из x
...
spam pam am m


Aргумент end=’  ‘ , который  обеспечивает вывод значений в одну строку через пробел.


-----------------------------------------------------------------



>>> a=0; b=10
>>> while a < b:       # Один из способов организации циклов   
                       # перечисления
...     print(a, end=’ ‘)
...     a += 1         # Или, a = a + 1
0 1 2 3 4 5 6 7 8 9

-----------------------------------------------------------------


В языке Python отсутствует цикл «do until», его можно имитировать, добавив в конец тела цикла условную инструкцию и инструкцию break:
while True:
    ...тело цикла...
    if exitTest(): break
-----------------------------------------------------------------

break, continue, pass и else

break - Производит переход за пределы объемлющего цикла (всей инструкции цикла).
continue - Производит переход в начало цикла (в строку заголовка).
pass  - Ничего не делает: это пустая инструкция, используемая как заполнитель.
Блок else - Выполняется, только если цикл завершился обычным образом (без 
использования инструкции break).

С учетом инструкций break и continue цикл while:

while <test1>:
    <statements1>
    if <test2>: break    # Выйти из цикла, пропустив часть else
    if <test3>: continue # Перейти в начало цикла, к выражению
                         # test1
else:
    <statements2>        # Выполняется, если не была использована 
                         # инструкция ‘break’
-----------------------------------------------------------------

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

Бесконечный цикл, который ничего не делает:
while 1: pass         
-----------------------------------------------------------------

continue:
Инструкция continue вызывает немедленный переход в начало цикла. Она иногда позволяет избежать использования вложенных инструкций.

Пример, обход нечетных чисел:
x = 10
while x:
    x = x-1                   # Или, x -= 1
    if x % 2 != 0: continue   # Нечетное? – пропустить вывод
    print(x, end=’ ‘)
-----------------------------------------------------------------

break:
Инструкция break вызывает немедленный выход из цикла.

Ввод данных с помощью функции input (raw_input в Python 2.6) и производится 
выход из цикла, если в ответ на запрос имени будет введена строка «stop»:
>>> while 1:
...     name = input(‘Enter name:’)
...     if name == ‘stop’: break
...     age = input(‘Enter age: ‘)
...     print(‘Hello’, name, ‘=>’, int(age) ** 2)
...
Enter name:mel
Enter age: 40
Hello mel => 1600
Enter name:bob
Enter age: 30
Hello bob => 900
Enter name:stop
-----------------------------------------------------------------

else:

При объединении с частью else инструкция break часто позволяет избавиться от необходимости сохранять флаг состояния поиска, как  это делается  в  других языках программирования.

Следующий пример выявляет является ли положительное целое число y простым числом, выполняя поиск делителей больше 1:

x = y // 2                        # Для значений y > 1
while x > 1:
    if y % x == 0:                # Остаток
        print(y, ‘has factor’, x)
        break                     # Перешагнуть блок else
    x -= 1
else:                             # Нормальное завершение цикла
    print(y, ‘is prime’)
-----------------------------------------------------------------

else в цикле:
Блок else в циклах обеспечивает явный синтаксис  представления  распространенной  ситуации.
Поиск значения в цикле, если найден - выводим
found = False
while x and not found:
    if match(x[0]):        # Искомое значение является первым?
        Print(‘Ni’)
        found = True
    else:
        x = x[1:]          # Вырезать первое значение и повторить
if not found:
    print(‘not found’)
-----------------------------------------------------------------

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

Общий формат:
for <target> in <object>:   # Связывает элементы объекта с 
                            # переменной цикла
    <statements>       # Повторяющееся тело цикла: использует
                       # переменную цикла
else:
    <statements>       # Если не попали на инструкцию ‘break’

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

Полная форма цикла for имеет следующий вид:
for <target> in <object>: # Присваивает элементы объекта с 
                          # переменной цикла
    <statements>
    if <test>: break      # Выход из цикла, минуя блок else
    if <test>: continue   # Переход в начало цикла
else:
    <statements>          # Если не была вызвана инструкция ‘break’
-----------------------------------------------------------------

>>> for x in [“spam”, “eggs”, “ham”]:
...     print(x, end=’ ‘)
...
spam eggs ham
-----------------------------------------------------------------

В следующих двух примерах вычисляется сумма и произведение всех элементов в списке. 
1й -пример
>>> sum = 0
>>> for x in [1, 2, 3, 4]:
...     sum = sum + x
...
>>> sum
10
2й -пример
>>> prod = 1
>>> for item in [1, 2, 3, 4]: prod *= item
...
>>> prod
24
-----------------------------------------------------------------

Цикл for может применяться к строкам и кортежам:
>>> S = “lumberjack”
>>> T = (“and”, “I’m”, “okay”)
 
>>> for x in S: print(x, end=’ ‘)      # Обход строки
...
l u m b e r j a c k
 
>>> for x in T: print(x, end=’ ‘)      # Обход элементов кортежа
...
and I’m okay
-----------------------------------------------------------------

Присваивание кортежа в цикле for:
>>> T = [(1, 2), (3, 4), (5, 6)]
>>> for (a, b) in T:           # Операция присваивания кортежа в 
                               # действии
...     print(a, b)
...
1 2
3 4
5 6

Здесь первый проход цикла действует подобно инструкции (a, b) = (1, 2), второй 
проход – инструкции (a, b) = (3, 4) и так далее.
-----------------------------------------------------------------

Кортежи в циклах for можно использовать для обхода ключей и значений словарей, применяя метод items, что гораздо удобнее, чем выполнять обход ключей и затем с помощью операции индексирования извлекать значения:
>>> D = {‘a’: 1, ‘b’: 2, ‘c’: 3}
>>> for key in D:
...     print(key, ‘=>’, D[key])   # Используется итератор 
                                   # словаря 
...                                # и операция индексирования
a => 1
c => 3
b => 2
 
>>> list(D.items())
[(‘a’, 1), (‘c’, 3), (‘b’, 2)]
 
>>> for (key, value) in D.items():
...     print(key, ‘=>’, value)    # Обход ключей и значений 
                                   # одновременно
...
a => 1
c => 3
b => 2
-----------------------------------------------------------------

Расширенная операция присваивания последовательностей в циклах for в версии 
Python 3.0:
>>> a, b, c = (1, 2, 3)    # Присваивание кортежа
>>> a, b, c
(1, 2, 3)
>>> for (a, b, c) in [(1, 2, 3), (4, 5, 6)]:   # Используется в
                                               # цикле for
...     print(a, b, c)
...
1 2 3
4 5 6
-----------------------------------------------------------------

Вложенные циклы for:
Теперь рассмотрим более сложный вариант цикла for
Пример иллюстрирует использование блока else и вложенный цикл for
>>> items = [“aaa”, 111, (4, 5), 2.01] # Множество объектов
>>> tests = [(4, 5), 3.14] # Ключи, которые требуется отыскать
>>>
>>> for key in tests:                  # Для всех ключей
...     for item in items:             # Для всех элементов
...         if item == key:            # Проверить совпадение
...             print(key, “was found”)
...             break
...     else:
...         print(key, “not found!”)
...
(4, 5) was found
3.14 not found!

Блок else будет выполняться только в случае, когда поиск завершится неудачей.
Далее пример аналог примера выше (использование in - упрощает конструкцию) :
>>> for key in tests:        # Для всех ключей
...     if key in items:     # Позволить интерпретатору отыскать
                             # совпадение
...         print(key, “was found”)
...     else:
...         print(key, “not found!”)
...
(4, 5) was found
3.14 not found!

Далее будет пост в котором углубимся в изучении циклов...


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

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