ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 817
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Для примера напишем программу, которая проверяет, является введенное пользователем число четным или нет (листинг 4.1). После проверки выводится соответствующее сооб- щение.
Листинг 4.1. Проверка числа на четность
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, " - четное число") else: print(x, " - нечетное число") input()
Если блок состоит из одной инструкции, эту инструкцию можно разместить на одной стро- ке с заголовком:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, " - четное число") else: print(x, " - нечетное число") input()
В этом случае концом блока является конец строки. Это означает, что можно разместить сразу несколько инструкций на одной строке, разделяя их точкой с запятой:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, end=" "); print("- четное число") else: print(x, end=" "); print("- нечетное число") input()
С
ОВЕТ
Знайте, что так сделать можно, но никогда на практике не пользуйтесь этим способом, поскольку подобная конструкция нарушает стройность кода и ухудшает его сопровождение в дальнейшем. Всегда размещайте инструкцию на отдельной строке, даже если блок содержит только одну инструкцию.
Согласитесь, что следующий код читается намного проще, чем предыдущий:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, end=" ") print("- четное число")
64
Часть I. Основы языка Python else: print(x, end=" ") print("- нечетное число") input()
Оператор ветвления if...else позволяет проверить сразу несколько условий. Рассмотрим это на примере (листинг 4.2).
Листинг 4.2. Проверка нескольких условий
# -*- coding: utf-8 -*- print("""Какой операционной системой вы пользуетесь?
1 — Windows 10 2 — Windows 8.1 3 — Windows 8 4 — Windows 7 5 — Windows Vista
6 — Другая""") os = input("Введите число, соответствующее ответу: ") if os == "1": print("Вы выбрали: Windows 10") elif os == "2": print("Вы выбрали: Windows 8.1") elif os == "3": print("Вы выбрали: Windows 8") elif os == "4": print("Вы выбрали: Windows 7") elif os == "5": print("Вы выбрали: Windows Vista") elif os == "6": print("Вы выбрали: другая") elif not os: print("Вы не ввели число") else: print("Мы не смогли определить вашу операционную систему") input()
С помощью инструкции elif мы можем определить выбранное значение и вывести соответ- ствующее сообщение. Обратите внимание на то, что логическое выражение не содержит операторов сравнения: elif not os:
Такая запись эквивалентна следующей: elif os == "":
Проверка на равенство выражения значению
True выполняется по умолчанию. Поскольку пустая строка интерпретируется как
False
, мы инвертируем возвращаемое значение с по- мощью оператора not
Один условный оператор можно вложить в другой. В этом случае отступ вложенной инст- рукции должен быть в два раза больше (листинг 4.3).
Глава 4. Условные операторы и циклы
65
Листинг 4.3. Вложенные инструкции
# -*- coding: utf-8 -*- print("""Какой операционной системой вы пользуетесь?
1 — Windows 10 2 — Windows 8.1 3 — Windows 8 4 — Windows 7 5 — Windows Vista
6 — Другая""") os = input("Введите число, соответствующее ответу: ") if os != "": if os == "1": print("Вы выбрали: Windows 10") elif os == "2": print("Вы выбрали: Windows 8.1") elif os == "3": print("Вы выбрали: Windows 8") elif os == "4": print("Вы выбрали: Windows 7") elif os == "5": print("Вы выбрали: Windows Vista") elif os == "6": print("Вы выбрали: другая") else: print("Мы не смогли определить вашу операционную систему") else: print("Вы не ввели число") input()
Оператор ветвления if...else имеет еще один формат:
<Переменная> = <Если истина> if <Условие> else <Если ложь>
Пример:
>>> print("Yes" if 10 % 2 == 0 else "No")
Yes
>>> s = "Yes" if 10 % 2 == 0 else "No"
>>> s
'Yes'
>>> s = "Yes" if 11 % 2 == 0 else "No"
>>> s
'No'
4.3. Цикл for
Предположим, нужно вывести все числа от 1 до 100 по одному на строке. Обычным спосо- бом пришлось бы писать 100 строк кода: print(1) print(2) print(100)
66
Часть I. Основы языка Python
При помощи цикла то же действие можно выполнить одной строкой: for x in range(1, 101): print(x)
Иными словами, циклы позволяют выполнить одни и те же инструкции многократно.
Цикл for применяется для перебора элементов последовательности и имеет такой формат: for <Текущий элемент> in <Последовательность>:
<Инструкции внутри цикла>
[else:
<Блок, выполняемый, если не использовался оператор break>
]
Здесь присутствуют следующие конструкции:
<Последовательность>
— объект, поддерживающий механизм итерации: строка, список, кортеж, диапазон, словарь и др.;
<Текущий элемент>
— на каждой итерации через эту переменную доступен очередной элемент последовательности или ключ словаря;
<Инструкции внутри цикла>
— блок, который будет многократно выполняться;
если внутри цикла не использовался оператор break
, то после завершения выполнения цикла будет выполнен блок в инструкции else
. Этот блок не является обязательным.
Пример перебора букв в слове приведен в листинге 4.4.
Листинг 4.4. Перебор букв в слове for s in "str": print(s, end=" ") else: print("\nЦикл выполнен")
Результат выполнения: s t r
Цикл выполнен
Теперь выведем каждый элемент списка и кортежа на отдельной строке (листинг 4.5).
Листинг 4.5. Перебор списка и кортежа for x in [1, 2, 3]: print(x) for y in (1, 2, 3): print(y)
Цикл for позволяет также перебрать элементы словарей, хотя словари и не являются после- довательностями. В качестве примера выведем элементы словаря двумя способами. Первый способ использует метод keys()
, возвращающий объект dict_keys
, который содержит все ключи словаря:
>>> arr = {"x": 1, "y": 2, "z": 3}
>>> arr.keys()
Глава 4. Условные операторы и циклы
67 dict_keys(['y', 'x', 'z'])
>>> for key in arr.keys(): print(key, arr[key]) y 2 x 1 z 3
Во втором способе мы просто указываем словарь в качестве параметра — на каждой итера- ции цикла будет возвращаться ключ, с помощью которого внутри цикла можно получить значение, соответствующее этому ключу:
>>> for key in arr: print(key, arr[key]) y 2 x 1 z 3
Обратите внимание на то, что элементы словаря выводятся в произвольном порядке, а не в порядке, в котором они были указаны при создании объекта. Чтобы вывести элементы в алфавитном порядке, следует отсортировать ключи с помощью функции sorted()
:
>>> arr = {"x": 1, "y": 2, "z": 3}
>>> for key in sorted(arr): print(key, arr[key]) x 1 y 2 z 3
С помощью цикла for можно перебирать сложные структуры данных. В качестве примера выведем элементы списка кортежей:
>>> arr = [(1, 2), (3, 4)] # Список кортежей
>>> for a, b in arr: print(a, b)
1 2 3 4 4.4. Функции range() и enumerate()
До сих пор мы только выводили элементы последовательностей. Теперь попробуем умно- жить каждый элемент списка на 2:
>>> arr = [1, 2, 3]
>>> for i in arr: i = i * 2
>>> print(arr)
[1, 2, 3]
68
Часть I. Основы языка Python
Как видно из примера, список не изменился. Переменная i
на каждой итерации цикла со- держит лишь копию значения текущего элемента списка, поэтому изменить таким способом элементы списка нельзя. Чтобы получить доступ к каждому элементу, можно, например, воспользоваться функцией range()
для генерации индексов. Функция range()
имеет сле- дующий формат: range([<Начало>, ]<Конец>[, <Шаг>])
Первый параметр задает начальное значение. Если параметр
<Начало>
не указан, то по умолчанию используется значение
0
. Во втором параметре указывается конечное значение.
Следует заметить, что это значение не входит в возвращаемые значения. Если параметр
<Шаг>
не указан, то используется значение
1
. Функция возвращает диапазон — особый объ- ект, поддерживающий итерационный протокол. С помощью диапазона внутри цикла for можно получить значение текущего элемента. В качестве примера умножим каждый эле- мент списка на 2:
>>> arr = [1, 2, 3]
>>>for i in range(len(arr)): arr[i] *= 2
>>> print(arr)
[2, 4, 6]
В этом примере мы получаем количество элементов списка с помощью функции len()
и передаем результат в функцию range()
. В итоге последняя вернет диапазон значений от
0
до len(arr) — 1
. На каждой итерации цикла через переменную i
доступен текущий элемент из диапазона индексов. Чтобы получить доступ к элементу списка, указываем индекс внут- ри квадратных скобок. Умножаем каждый элемент списка на 2, а затем выводим результат с помощью функции print()
Рассмотрим несколько примеров использования функции range()
:
Выведем числа от 1 до 100: for i in range(1, 101): print(i)
Можно не только увеличивать значение, но и уменьшать его. Выведем все числа от 100 до 1: for i in range(100, 0, -1): print(i)
Можно также изменять значение не только на единицу. Выведем все четные числа от 1 до 100: for i in range(2, 101, 2): print(i)
В Python 2 функция range()
возвращала список чисел. В Python 3 поведение функции изме- нилось — теперь она возвращает диапазон. Чтобы получить список чисел, следует передать диапазон, возвращенный функцией range()
, в функцию list()
:
>>> obj = range(len([1, 2, 3]))
>>> obj range(0, 3)
>>> obj[0], obj[1], obj[2] # Доступ по индексу
(0, 1, 2)
>>> obj[0:2] # Получение среза range(0, 2)
Глава 4. Условные операторы и циклы
69
>>> i = iter(obj)
>>> next(i), next(i), next(i) # Доступ с помощью итераторов
(0, 1, 2)
>>> list(obj) # Преобразование диапазона в список
[0, 1, 2]
>>> 1 in obj, 7 in obj # Проверка вхождения значения
(True, False)
Диапазон поддерживает два полезных метода:
index(<Значение>)
— возвращает индекс элемента, имеющего указанное значение. Если значение не входит в диапазон, возбуждается исключение
ValueError
:
>>> obj = range(1, 5)
>>> obj.index(1), obj.index(4)
(0, 3)
>>> obj.index(5)
... Фрагмент опущен ...
ValueError: 5 is not in range
count(<Значение>)
— возвращает количество элементов с указанным значением. Если элемент не входит в диапазон, возвращается значение
0
:
>>> obj = range(1, 5)
>>> obj.count(1), obj.count(10)
(1, 0)
Функция enumerate(<Объект>[, start=0])
на каждой итерации цикла for возвращает кор- теж из индекса и значения текущего элемента. С помощью необязательного параметра start можно задать начальное значение индекса. В качестве примера умножим на 2 каждый элемент списка, который содержит четное число (листинг 4.6).
Листинг 4.6. Пример использования функции enumerate() arr = [1, 2, 3, 4, 5, 6] for i, elem in enumerate(arr): if elem % 2 == 0: arr[i] *= 2 print(arr) # Результат выполнения: [1, 4, 3, 8, 5, 12]
Функция enumerate()
не создает список, а возвращает итератор. С помощью функции next()
можно обойти всю последовательность. Когда перебор будет закончен, возбуждается исключение
StopIteration
:
>>> arr = [1, 2]
>>> obj = enumerate(arr, start=2)
>>> next(obj)
(2, 1)
>>> next(obj)
(3, 2)
>>> next(obj)
70
Часть I. Основы языка Python
Traceback (most recent call last):
File "
", line 1, in next(obj)
StopIteration
Кстати, цикл for при работе активно использует итераторы, но делает это незаметно для нас.
4.5. Цикл while
Выполнение инструкций в цикле while продолжается до тех пор, пока логическое выраже- ние истинно. Цикл while имеет следующий формат:
<Задание начального значения для переменной-счетчика> while <Условие>:
<Инструкции>
<Приращение значения в переменной-счетчике>
[else:
<Блок, выполняемый, если не использовался оператор break>
]
Последовательность работы цикла while
:
1. Переменной-счетчику присваивается начальное значение.
2. Проверяется условие, и если оно истинно, то выполняются инструкции внутри цикла, иначе выполнение цикла завершается.
3. Переменная-счетчик изменяется на величину, указанную в параметре
<Приращение>
4. Переход к пункту 2.
5. Если внутри цикла не использовался оператор break
, то после завершения выполнения цикла будет выполнен блок в инструкции else
. Этот блок не является обязательным.
Выведем все числа от 1 до 100, используя цикл while
(листинг 4.7).
Листинг 4.7. Вывод чисел от 1 до 100 i = 1 # <Начальное значение> while i < 101: # <Условие> print(i) # <Инструкции> i += 1 # <Приращение>
В
НИМАНИЕ
!
Если <Приращение> не указано, цикл будет выполняться бесконечно. Чтобы прервать бес- конечный цикл, следует нажать комбинацию клавиш+. В результате генерируется исключение KeyboardInterrupt, и выполнение программы останавливается. Следует учи- тывать, что прервать таким образом можно только цикл, который выводит данные.
Выведем все числа от 100 до 1 (листинг 4.8).
Глава 4. Условные операторы и циклы
71
Листинг 4.8. Вывод чисел от 100 до 1 i = 100 while i: print(i) i -= 1
Обратите внимание на условие — оно не содержит операторов сравнения. На каждой ите- рации цикла мы вычитаем единицу из значения переменной-счетчика. Как только значение будет равно
0
, цикл остановится, поскольку число
0
в логическом контексте эквивалентно значению
False
С помощью цикла while можно перебирать и элементы различных структур. Но в этом слу- чае следует помнить, что цикл while работает медленнее цикла for
. В качестве примера умножим каждый элемент списка на 2 (листинг 4.9).
Листинг 4.9. Перебор элементов списка arr = [1, 2, 3] i, count = 0, len(arr) while i < count: arr[i] *= 2 i += 1 print(arr) # Результат выполнения: [2, 4, 6]
4.6. Оператор continue: переход на следующую итерацию цикла
Оператор continue позволяет перейти к следующей итерации цикла до завершения выпол- нения всех инструкций внутри цикла. В качестве примера выведем все числа от 1 до 100, кроме чисел от 5 до 10 включительно (листинг 4.10).
Листинг 4.10. Оператор continue for i in range(1, 101): if 4 < i < 11: continue # Переходим на следующую итерацию цикла print(i)
4.7. Оператор break: прерывание цикла
Оператор break позволяет прервать выполнение цикла досрочно. Для примера выведем все числа от 1 до 100 еще одним способом (листинг 4.11).
Листинг 4.11. Оператор break i = 1 while True: if i > 100: break # Прерываем цикл print(i) i += 1
72
Часть I. Основы языка Python
Здесь мы в условии указали значение
True
. В этом случае выражения внутри цикла станут выполняться бесконечно. Однако использование оператора break прерывает выполнение цикла, как только он будет выполнен 100 раз.
В
НИМАНИЕ
!
Оператор break прерывает выполнение цикла, а не программы, т. е. далее будет выполне- на инструкция, следующая сразу за циклом.
Цикл while совместно с оператором break удобно использовать для получения не опреде- ленного заранее количества данных от пользователя. В качестве примера просуммируем произвольное количество чисел (листинг 4.12).
Листинг 4.12. Суммирование не определенного заранее количества чисел
# -*- coding: utf-8 -*- print("Введите слово 'stop' для получения результата") summa = 0 while True: x = input("Введите число: ") if x == "stop": break # Выход из цикла x = int(x) # Преобразуем строку в число summa += x print("Сумма чисел равна:", summa) input()
Процесс ввода трех чисел и получения суммы выглядит так (значения, введенные пользова- телем, здесь выделены полужирным шрифтом):
Введите слово 'stop' для получения результата
Введите число:
10
Введите число:
20
Введите число:
30
Введите число: stop
Сумма чисел равна: 60
Листинг 4.1. Проверка числа на четность
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, " - четное число") else: print(x, " - нечетное число") input()
Если блок состоит из одной инструкции, эту инструкцию можно разместить на одной стро- ке с заголовком:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, " - четное число") else: print(x, " - нечетное число") input()
В этом случае концом блока является конец строки. Это означает, что можно разместить сразу несколько инструкций на одной строке, разделяя их точкой с запятой:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, end=" "); print("- четное число") else: print(x, end=" "); print("- нечетное число") input()
С
ОВЕТ
Знайте, что так сделать можно, но никогда на практике не пользуйтесь этим способом, поскольку подобная конструкция нарушает стройность кода и ухудшает его сопровождение в дальнейшем. Всегда размещайте инструкцию на отдельной строке, даже если блок содержит только одну инструкцию.
Согласитесь, что следующий код читается намного проще, чем предыдущий:
# -*- coding: utf-8 -*- x = int(input("Введите число: ")) if x % 2 == 0: print(x, end=" ") print("- четное число")
64
Часть I. Основы языка Python else: print(x, end=" ") print("- нечетное число") input()
Оператор ветвления if...else позволяет проверить сразу несколько условий. Рассмотрим это на примере (листинг 4.2).
Листинг 4.2. Проверка нескольких условий
# -*- coding: utf-8 -*- print("""Какой операционной системой вы пользуетесь?
1 — Windows 10 2 — Windows 8.1 3 — Windows 8 4 — Windows 7 5 — Windows Vista
6 — Другая""") os = input("Введите число, соответствующее ответу: ") if os == "1": print("Вы выбрали: Windows 10") elif os == "2": print("Вы выбрали: Windows 8.1") elif os == "3": print("Вы выбрали: Windows 8") elif os == "4": print("Вы выбрали: Windows 7") elif os == "5": print("Вы выбрали: Windows Vista") elif os == "6": print("Вы выбрали: другая") elif not os: print("Вы не ввели число") else: print("Мы не смогли определить вашу операционную систему") input()
С помощью инструкции elif мы можем определить выбранное значение и вывести соответ- ствующее сообщение. Обратите внимание на то, что логическое выражение не содержит операторов сравнения: elif not os:
Такая запись эквивалентна следующей: elif os == "":
Проверка на равенство выражения значению
True выполняется по умолчанию. Поскольку пустая строка интерпретируется как
False
, мы инвертируем возвращаемое значение с по- мощью оператора not
Один условный оператор можно вложить в другой. В этом случае отступ вложенной инст- рукции должен быть в два раза больше (листинг 4.3).
Глава 4. Условные операторы и циклы
65
Листинг 4.3. Вложенные инструкции
# -*- coding: utf-8 -*- print("""Какой операционной системой вы пользуетесь?
1 — Windows 10 2 — Windows 8.1 3 — Windows 8 4 — Windows 7 5 — Windows Vista
6 — Другая""") os = input("Введите число, соответствующее ответу: ") if os != "": if os == "1": print("Вы выбрали: Windows 10") elif os == "2": print("Вы выбрали: Windows 8.1") elif os == "3": print("Вы выбрали: Windows 8") elif os == "4": print("Вы выбрали: Windows 7") elif os == "5": print("Вы выбрали: Windows Vista") elif os == "6": print("Вы выбрали: другая") else: print("Мы не смогли определить вашу операционную систему") else: print("Вы не ввели число") input()
Оператор ветвления if...else имеет еще один формат:
<Переменная> = <Если истина> if <Условие> else <Если ложь>
Пример:
>>> print("Yes" if 10 % 2 == 0 else "No")
Yes
>>> s = "Yes" if 10 % 2 == 0 else "No"
>>> s
'Yes'
>>> s = "Yes" if 11 % 2 == 0 else "No"
>>> s
'No'
4.3. Цикл for
Предположим, нужно вывести все числа от 1 до 100 по одному на строке. Обычным спосо- бом пришлось бы писать 100 строк кода: print(1) print(2) print(100)
66
Часть I. Основы языка Python
При помощи цикла то же действие можно выполнить одной строкой: for x in range(1, 101): print(x)
Иными словами, циклы позволяют выполнить одни и те же инструкции многократно.
Цикл for применяется для перебора элементов последовательности и имеет такой формат: for <Текущий элемент> in <Последовательность>:
<Инструкции внутри цикла>
[else:
<Блок, выполняемый, если не использовался оператор break>
]
Здесь присутствуют следующие конструкции:
<Последовательность>
— объект, поддерживающий механизм итерации: строка, список, кортеж, диапазон, словарь и др.;
<Текущий элемент>
— на каждой итерации через эту переменную доступен очередной элемент последовательности или ключ словаря;
<Инструкции внутри цикла>
— блок, который будет многократно выполняться;
если внутри цикла не использовался оператор break
, то после завершения выполнения цикла будет выполнен блок в инструкции else
. Этот блок не является обязательным.
Пример перебора букв в слове приведен в листинге 4.4.
Листинг 4.4. Перебор букв в слове for s in "str": print(s, end=" ") else: print("\nЦикл выполнен")
Результат выполнения: s t r
Цикл выполнен
Теперь выведем каждый элемент списка и кортежа на отдельной строке (листинг 4.5).
Листинг 4.5. Перебор списка и кортежа for x in [1, 2, 3]: print(x) for y in (1, 2, 3): print(y)
Цикл for позволяет также перебрать элементы словарей, хотя словари и не являются после- довательностями. В качестве примера выведем элементы словаря двумя способами. Первый способ использует метод keys()
, возвращающий объект dict_keys
, который содержит все ключи словаря:
>>> arr = {"x": 1, "y": 2, "z": 3}
>>> arr.keys()
Глава 4. Условные операторы и циклы
67 dict_keys(['y', 'x', 'z'])
>>> for key in arr.keys(): print(key, arr[key]) y 2 x 1 z 3
Во втором способе мы просто указываем словарь в качестве параметра — на каждой итера- ции цикла будет возвращаться ключ, с помощью которого внутри цикла можно получить значение, соответствующее этому ключу:
>>> for key in arr: print(key, arr[key]) y 2 x 1 z 3
Обратите внимание на то, что элементы словаря выводятся в произвольном порядке, а не в порядке, в котором они были указаны при создании объекта. Чтобы вывести элементы в алфавитном порядке, следует отсортировать ключи с помощью функции sorted()
:
>>> arr = {"x": 1, "y": 2, "z": 3}
>>> for key in sorted(arr): print(key, arr[key]) x 1 y 2 z 3
С помощью цикла for можно перебирать сложные структуры данных. В качестве примера выведем элементы списка кортежей:
>>> arr = [(1, 2), (3, 4)] # Список кортежей
>>> for a, b in arr: print(a, b)
1 2 3 4 4.4. Функции range() и enumerate()
До сих пор мы только выводили элементы последовательностей. Теперь попробуем умно- жить каждый элемент списка на 2:
>>> arr = [1, 2, 3]
>>> for i in arr: i = i * 2
>>> print(arr)
[1, 2, 3]
68
Часть I. Основы языка Python
Как видно из примера, список не изменился. Переменная i
на каждой итерации цикла со- держит лишь копию значения текущего элемента списка, поэтому изменить таким способом элементы списка нельзя. Чтобы получить доступ к каждому элементу, можно, например, воспользоваться функцией range()
для генерации индексов. Функция range()
имеет сле- дующий формат: range([<Начало>, ]<Конец>[, <Шаг>])
Первый параметр задает начальное значение. Если параметр
<Начало>
не указан, то по умолчанию используется значение
0
. Во втором параметре указывается конечное значение.
Следует заметить, что это значение не входит в возвращаемые значения. Если параметр
<Шаг>
не указан, то используется значение
1
. Функция возвращает диапазон — особый объ- ект, поддерживающий итерационный протокол. С помощью диапазона внутри цикла for можно получить значение текущего элемента. В качестве примера умножим каждый эле- мент списка на 2:
>>> arr = [1, 2, 3]
>>>for i in range(len(arr)): arr[i] *= 2
>>> print(arr)
[2, 4, 6]
В этом примере мы получаем количество элементов списка с помощью функции len()
и передаем результат в функцию range()
. В итоге последняя вернет диапазон значений от
0
до len(arr) — 1
. На каждой итерации цикла через переменную i
доступен текущий элемент из диапазона индексов. Чтобы получить доступ к элементу списка, указываем индекс внут- ри квадратных скобок. Умножаем каждый элемент списка на 2, а затем выводим результат с помощью функции print()
Рассмотрим несколько примеров использования функции range()
:
Выведем числа от 1 до 100: for i in range(1, 101): print(i)
Можно не только увеличивать значение, но и уменьшать его. Выведем все числа от 100 до 1: for i in range(100, 0, -1): print(i)
Можно также изменять значение не только на единицу. Выведем все четные числа от 1 до 100: for i in range(2, 101, 2): print(i)
В Python 2 функция range()
возвращала список чисел. В Python 3 поведение функции изме- нилось — теперь она возвращает диапазон. Чтобы получить список чисел, следует передать диапазон, возвращенный функцией range()
, в функцию list()
:
>>> obj = range(len([1, 2, 3]))
>>> obj range(0, 3)
>>> obj[0], obj[1], obj[2] # Доступ по индексу
(0, 1, 2)
>>> obj[0:2] # Получение среза range(0, 2)
Глава 4. Условные операторы и циклы
69
>>> i = iter(obj)
>>> next(i), next(i), next(i) # Доступ с помощью итераторов
(0, 1, 2)
>>> list(obj) # Преобразование диапазона в список
[0, 1, 2]
>>> 1 in obj, 7 in obj # Проверка вхождения значения
(True, False)
Диапазон поддерживает два полезных метода:
index(<Значение>)
— возвращает индекс элемента, имеющего указанное значение. Если значение не входит в диапазон, возбуждается исключение
ValueError
:
>>> obj = range(1, 5)
>>> obj.index(1), obj.index(4)
(0, 3)
>>> obj.index(5)
... Фрагмент опущен ...
ValueError: 5 is not in range
count(<Значение>)
— возвращает количество элементов с указанным значением. Если элемент не входит в диапазон, возвращается значение
0
:
>>> obj = range(1, 5)
>>> obj.count(1), obj.count(10)
(1, 0)
Функция enumerate(<Объект>[, start=0])
на каждой итерации цикла for возвращает кор- теж из индекса и значения текущего элемента. С помощью необязательного параметра start можно задать начальное значение индекса. В качестве примера умножим на 2 каждый элемент списка, который содержит четное число (листинг 4.6).
Листинг 4.6. Пример использования функции enumerate() arr = [1, 2, 3, 4, 5, 6] for i, elem in enumerate(arr): if elem % 2 == 0: arr[i] *= 2 print(arr) # Результат выполнения: [1, 4, 3, 8, 5, 12]
Функция enumerate()
не создает список, а возвращает итератор. С помощью функции next()
можно обойти всю последовательность. Когда перебор будет закончен, возбуждается исключение
StopIteration
:
>>> arr = [1, 2]
>>> obj = enumerate(arr, start=2)
>>> next(obj)
(2, 1)
>>> next(obj)
(3, 2)
>>> next(obj)
70
Часть I. Основы языка Python
Traceback (most recent call last):
File "
", line 1, in
StopIteration
Кстати, цикл for при работе активно использует итераторы, но делает это незаметно для нас.
4.5. Цикл while
Выполнение инструкций в цикле while продолжается до тех пор, пока логическое выраже- ние истинно. Цикл while имеет следующий формат:
<Задание начального значения для переменной-счетчика> while <Условие>:
<Инструкции>
<Приращение значения в переменной-счетчике>
[else:
<Блок, выполняемый, если не использовался оператор break>
]
Последовательность работы цикла while
:
1. Переменной-счетчику присваивается начальное значение.
2. Проверяется условие, и если оно истинно, то выполняются инструкции внутри цикла, иначе выполнение цикла завершается.
3. Переменная-счетчик изменяется на величину, указанную в параметре
<Приращение>
4. Переход к пункту 2.
5. Если внутри цикла не использовался оператор break
, то после завершения выполнения цикла будет выполнен блок в инструкции else
. Этот блок не является обязательным.
Выведем все числа от 1 до 100, используя цикл while
(листинг 4.7).
Листинг 4.7. Вывод чисел от 1 до 100 i = 1 # <Начальное значение> while i < 101: # <Условие> print(i) # <Инструкции> i += 1 # <Приращение>
В
НИМАНИЕ
!
Если <Приращение> не указано, цикл будет выполняться бесконечно. Чтобы прервать бес- конечный цикл, следует нажать комбинацию клавиш
Выведем все числа от 100 до 1 (листинг 4.8).
Глава 4. Условные операторы и циклы
71
Листинг 4.8. Вывод чисел от 100 до 1 i = 100 while i: print(i) i -= 1
Обратите внимание на условие — оно не содержит операторов сравнения. На каждой ите- рации цикла мы вычитаем единицу из значения переменной-счетчика. Как только значение будет равно
0
, цикл остановится, поскольку число
0
в логическом контексте эквивалентно значению
False
С помощью цикла while можно перебирать и элементы различных структур. Но в этом слу- чае следует помнить, что цикл while работает медленнее цикла for
. В качестве примера умножим каждый элемент списка на 2 (листинг 4.9).
Листинг 4.9. Перебор элементов списка arr = [1, 2, 3] i, count = 0, len(arr) while i < count: arr[i] *= 2 i += 1 print(arr) # Результат выполнения: [2, 4, 6]
4.6. Оператор continue: переход на следующую итерацию цикла
Оператор continue позволяет перейти к следующей итерации цикла до завершения выпол- нения всех инструкций внутри цикла. В качестве примера выведем все числа от 1 до 100, кроме чисел от 5 до 10 включительно (листинг 4.10).
Листинг 4.10. Оператор continue for i in range(1, 101): if 4 < i < 11: continue # Переходим на следующую итерацию цикла print(i)
4.7. Оператор break: прерывание цикла
Оператор break позволяет прервать выполнение цикла досрочно. Для примера выведем все числа от 1 до 100 еще одним способом (листинг 4.11).
Листинг 4.11. Оператор break i = 1 while True: if i > 100: break # Прерываем цикл print(i) i += 1
72
Часть I. Основы языка Python
Здесь мы в условии указали значение
True
. В этом случае выражения внутри цикла станут выполняться бесконечно. Однако использование оператора break прерывает выполнение цикла, как только он будет выполнен 100 раз.
В
НИМАНИЕ
!
Оператор break прерывает выполнение цикла, а не программы, т. е. далее будет выполне- на инструкция, следующая сразу за циклом.
Цикл while совместно с оператором break удобно использовать для получения не опреде- ленного заранее количества данных от пользователя. В качестве примера просуммируем произвольное количество чисел (листинг 4.12).
Листинг 4.12. Суммирование не определенного заранее количества чисел
# -*- coding: utf-8 -*- print("Введите слово 'stop' для получения результата") summa = 0 while True: x = input("Введите число: ") if x == "stop": break # Выход из цикла x = int(x) # Преобразуем строку в число summa += x print("Сумма чисел равна:", summa) input()
Процесс ввода трех чисел и получения суммы выглядит так (значения, введенные пользова- телем, здесь выделены полужирным шрифтом):
Введите слово 'stop' для получения результата
Введите число:
10
Введите число:
20
Введите число:
30
Введите число: stop
Сумма чисел равна: 60