post

Python ru:Control Flow

Contents

Введение

В программах, которые мы до сих пор рассматривали, последовательность команд всегда выполнялась Python по порядку строго сверху вниз. Что, если вам необходимо изменить поток выполняющихся команд? Например, если вы хотите, чтобы программа принимала некоторое решение и выполняла различные действия в зависимости от ситуации; скажем, печатала ‘Доброе утро’ или ‘Добрый вечер’ в зависимости от времени суток?

Как вы уже, наверное, догадались, этого можно достичь при помощи операторов управления потоком. В Python есть три оператора управления потоком: if, for и while.

Оператор if

Оператор if используется для проверки условий: “если”[1] условие верно [2], выполняется блок выражений (называемый “if-блок”), “иначе”[3] выполняется другой блок выражений (называемый “else-блок”). Блок “else” не является обязательным.

Пример:

#!/usr/bin/python
# Filename: if.py

number = 23
guess = int(input('Введите целое число: '))

if guess == number:
    print('Поздравляю, вы угадали,') # Здесь начинается новый блок
    print('(хотя и не выиграли никакого приза!)') # Здесь заканчивается новый блок
elif guess < number:
    print('Нет, загаданное число немного больше этого.') # Ещё один блок
    # Внутри блока вы можете выполнять всё, что уодно ...
else:
    print('Нет, загаданное число немного меньше этого.')
    # чтобы попасть сюда, guessed должно быть больше, чем number

print('Завершено')
# Это последнее выражение выполняется всегда после выполнения оператора if

Вывод:

   $ python if.py
   Введите целое число: 50
   Нет, загаданное число немного меньше этого.
   Завершено

   $ python if.py
   Введите целое число: 22
   Нет, загаданное число немного больше этого.
   Завершено

   $ python if.py
   Введите целое число: 23
   Поздравляю, вы угадали,
   (хотя и не выиграли никакого приза!)
   Завершено

Как это работает:

В этой программе мы принимаем варианты от пользователя и проверяем, совпадают ли они с заранее заданным числом. Мы устанавливаем переменной number значение любого целого числа, какого хотим, например, 23. После этого мы принимаем вариант числа от пользователя при помощи функции input(). Функции – это всего-навсего повторно используемые фрагменты программы. Мы узнаем о них больше в следующей главе.

Мы передаём встроенной функции input строку, которую она выводит на экран и ожидает ввода от пользователя. Как только мы ввели что-нибудь и нажали клавишу Enter, функция input() возвращает то, что мы ввели, в виде строки. Затем мы преобразуем полученную строку в число, используя int(), и сохраняем это значение в переменную guess. Вообще-то, int – это класс, но всё, что вам необходимо знать на данном этапе, это что при помощи него можно преобразовать строку в целое число (предполагая, что строка содержит целое число).

Далее мы сравниваем число, введённое пользователем, с числом, которое мы выбрали заранее. Если они равны, мы печатаем сообщение об успехе. Обратите внимание, что мы используем соответствующие уровни отступа, чтобы указать Python’у, какие выражения относятся к какому блоку. Вот, почему отступы так важны в Python. Я надеюсь, вы придерживаетесь правила “постоянных отступов”, не так ли?

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

После этого мы проверяем, верно ли, что пользовательский вариант числа меньше загаданного, и если это так, мы информируем пользователя о том, что ему следует выбирать числа немного больше этого. Здесь мы использовали выражение elif, которое попросту объединяет в себе два связанных if else-if else выражения в одно выражение if-elif-else. Это делает чтение программы более лёгким, а также не требует дополнительных отступов.

Выражения elif и else также имеют двоеточие в конце логической строки, за которым следуют соответствующие блоки команд (с соответствующим числом отступов, конечно)

Вы можете использовать оператор if внутри if-блока другого оператора if и так далее – это называется вложенным[4] оператором if.

Помните, что части elif и else не обязательны. Минимальная корректная запись оператора if такова:

if True:
    print('Да, это верно.')

После того, как Python заканчивает выполнение всего оператора if вместе с его частями elif и else, он переходит к следующему выражению в блоке, содержащем этот оператор if. В нашем случае это основной блок программы (в котором начинается выполнение программы), а следующее выражение – это print('Завершено'). После этого Python доходит до конца программы и просто выходит из неё.

Хотя это и чрезвычайно простая программа, я указал вам на целый ряд вещей, которые вам стоит иметь в виду. Всё это довольно легко (даже удивительно легко для тех из вас, кто пришёл из мира C/C++). Поначалу вам придётся держать все эти вещи в памяти, но после того, как немного попрактикуетесь, привыкнете, и они вам покажутся вполне “естественными”.

Замечание для программистов на C/C++
В Python нет оператора switch. Вы можете использовать if..elif..else для реализации того же самого (а в некоторых случаях даже использовать словарь, чтобы сделать это быстро).

Оператор while

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

Пример:

#!/usr/bin/python
# Filename: while.py

number = 23
running = True

while running:
    guess = int(input('Введите целое число: '))

    if guess == number:
        print('Поздравляю, вы угадали.')
        running = False # это останавливает цикл while
    elif guess < number:
        print('Нет, загаданное число немного больше этого')
    else:
        print('Нет, загаданное число немного меньше этого.')
else:
    print('Цикл while закончен.')
    # Здесь можете выполнить всё что вам ещё нужно

print('Завершение')

Output:

   $ python while.py
   Введите целое число: 50
   Нет, число несколько меньше.
   Введите целое число: 22
   Нет, число несколько больше.
   Введите целое число: 23
   Поздравляю, вы угадали.
   Цикл while закончен.
   Конец

Как это работает:

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

Мы переместили операторы input и if внутрь цикла while и установили переменную running в значение True перед запуском цикла. Прежде всего проверяется, равно ли значение переменной running True, а затем происходит переход к соответствующему while-блоку. После выполнения этого блока команд условие, которым в данном случае является переменная running, проверяется снова. Если оно истинно, while-блок запускается снова, в противном случае происходит переход к дополнительному else-блоку, а затем – к следующему оператору.

Блок else выполняется тогда, когда условие цикла while становится ложным (False) – это может случиться даже при самой первой проверке условия. Если у цикла while имеется дополнительный блок else, он всегда выполняется, если только вы не прервёте выполнение цикла оператором break.

True и False называются булевым типом данных, и вы можете считать их эквивалентными значениям 1 и 0 соответственно.

Примечание для программистов на C/C++
Помните, что у цикла while может быть блок else.

Цикл for

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

Пример:

#!/usr/bin/python
# Filename: for.py

for i in range(1, 5):
    print(i)
else:
    print('Цикл for закончен')

Вывод:

   $ python for.py
   1
   2
   3
   4
   Цикл for закончен

Как это работает:

В этой программе мы выводим на экран последовательность чисел. Мы генерируем эту последовательность, используя встроенную функцию range[5].

Мы задаём два числа, и range возвращает последовательность чисел от первого числа до второго. Например, range(1,5) даёт последовательность [1, 2, 3, 4]. По умолчанию range принимает значение шага, равное 1. Если мы зададим также и третье число range, оно будет служить шагом. Например, range(1,5,2) даст [1,3]. Помните, интервал простирается только до второго числа, т.е. не включает его в себя.

Обратите внимание, что range() генерирует последовательность чисел, но только по одному числу за раз – когда оператор for запросит следующий элемент. Если вы хотите увидеть всю последовательность чисел сразу, используйте list(range()). Списки[6] подробно рассматриваются в главе Структуры данных.

Затем цикл for осуществляет итерацию по этому диапазону – for i in range(1,5) эквивалентно for i in [1, 2, 3, 4], что напоминает присваивание переменной i по одному числу (или объекту) за раз, выполняя блок команд для каждого значения i. В данном случае мы просто выводим значение на экран в блоке команд.

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

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

Примечание для программистов на C/C++/Java/C#
Цикл for в Python радикально отличается от цикла for в C/C++. Программисты на C# заметят, что цикл for в Python похож на цикл foreach в C#. Программистам на Java это может напомнить конструкцию for (int i: IntArray) в Java 1.5.
В C/C++, вы могли бы написать for (int i = 0; i < 5; i++), тогда в Python следовало бы писать for i in range(0,5). Как вы видите, цикл for проще, более выразителен и менее подвержен ошибкам в Python.

Оператор break

Оператор break служит для прерывания[7] цикла, т.е. остановки выполнения команд даже если условие выполнения цикла ещё не приняло значения False или последовательность элементов не закончилась.

Важно отметить, что если вы прерываете цикл for или while оператором break, соответствующие им блоки else выполняться не будут.

Пример:

#!/usr/bin/python
# Filename: break.py

while True:
    s = input('Введите что-нибудь: ')
    if s == 'выход':
        break
    print('Длина строки: ', len(s))
print('Завершение')

Вывод:

   $ python break.py
   Введите что-нибудь: Программировать весело.
   Длина строки: 23
   Введите что-нибудь: Если работа скучна,
   Длина строки: 19
   Введите что-нибудь: Чтобы придать ей весёлый тон -
   Длина строки: 30
   Введите что-нибудь:       используй Python!
   Длина строки: 23
   Введите что-нибудь: выход
   Завершение

Как это работает:

В этой программе мы многократно считываем пользовательский ввод и выводим на экран длину каждой введённой строки. Для остановки программы мы вводим специальное условие, проверяя, совпадает ли пользовательский ввод со строкой 'выход'. Мы останавливаем программу прерыванием цикла оператором break и достигаем её конца.

Длина введённой строки может быть найдена при помощи встроенной функции len.

Помните также, что оператор break может применяться и в цикле for.

Поэтический Python Swaroop’а

Для ввода строк здесь я использовал мини-стишок, который сам сочинил. Он называется Поэтический Python Swaroop’а[8]:

   Программировать весело.
   Если работа скучна,
   Чтобы придать ей весёлый тон -
         используй Python!

Оператор continue

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

Пример:

#!/usr/bin/python
# Filename: continue.py

while True:
    s = input('Введите что-нибудь: ')
    if s == 'выход':
        break
    if len(s) < 3:
        print('Слишком мало')
        continue
    print('Введённая строка достаточной длины')
    # Разные другие действия здесь...

Вывод:

   $ python continue.py
   Введите что-нибудь: a
   Слишком мало
   Введите что-нибудь: 12
   Слишком мало
   Введите что-нибудь: абв
   Введённая строка достаточной длины
   Введите что-нибудь: выход

Как это работает:

В этой программе мы запрашиваем ввод со стороны пользователя, но обрабатываем введённую строку только если она имеет длину хотя бы в 3 символа. Итак, мы используем встроенную функцию len для получения длины строки, и если длина менее 3, мы пропускаем остальные действия в блоке при помощи оператора continue. В противном случае все остальные команды в цикле выполняются, производя любые манипуляции, которые нам нужны.

Заметьте, что оператор continue также работает и с циклом for.

Резюме

Мы увидели, как использовать три оператора для управления потоком команд: if, while и for, а также связанные с ними операторы break и continue. Это наиболее часто используемые части Python, поэтому овладеть ими очень важно.

Далее мы увидим, как создавать и использовать функции.

Примечания

  1. if – англ. “если” (прим.перев.)
  2. Соответствует булевому значению True (прим.перев.)
  3. else – англ. “иначе”, “в противном случае” (прим.перев.)
  4. nested – англ. “вложенный” (прим.перев.)
  5. range – англ. “диапазон”, “интервал” (прим.перев.)
  6. list – англ. “список” (прим.перев.)
  7. break – англ. “разбивать”, “разрывать” (прим.перев.)
  8. Swaroop’s Poetic Python:

    Programming is fun.
    When the work is done,
    if you wanna make your work also fun:
    use Python!
    (перев. Смоляра В.)

  9. continue – англ. “продолжать” (прим.перев.)