#3. Циклы. Файлы
Циклы for
и while
. Работа с файлами
План
- Циклы
- Цикл
while
- Бесконечный цикл
- Операторы управления циклом
- Цикл
for
- Функция
range
- Функция
enumerate
- Цикл
- Файлы
Циклы
Когда у программиста возникает необходимость повторить какое-то действие несколько раз, он пишет цикл.
В Python cуществуют операторы цикла while
и for
.
Цикл while
Цикл while
(“пока”) позволяет выполнить одну и ту же последовательность действий, пока проверяемое условие истинно. Условие записывается до тела цикла и проверяется до выполнения тела цикла. Как правило, цикл while
используется, когда невозможно определить точное значение количества проходов исполнения цикла.
Синтаксис цикла while
в простейшем случае выглядит так:
while условие:
блок инструкций
При выполнении цикла while
сначала проверяется условие. Если оно ложно, то выполнение цикла прекращается и управление передается на следующую инструкцию после тела цикла while
. Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.
Например, следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10:
i = 1
while i <= 10:
print(i ** 2)
i += 1
В этом примере переменная i
внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i
будет равно 11
, поскольку именно при i == 11
условие i <= 10
впервые перестанет выполняться.
Бесконечный цикл
Бесконечный цикл — цикл, написанный таким образом, что условие выхода из него никогда не выполняется.
В программировании довольно часто используются бесконеные циклы. Просто есть ситуации, когда нет явного ограничения, и условие трудно проверить заранее.
while True:
...
Операторы управления циклом
break
Для того, чтобы выйти из вечного цикла, и вообще из цикла, используется оператор break
. Оператор break
досрочно прерывает цикл.
i = 0
while True:
i+=1
if i > 5:
break
print(i)
continue
Оператор continue
начинает следующий проход цикла, минуя оставшееся тело цикла.
i = 0
while True:
i += 1
if i % 2:
continue
if i > 10:
break
print(i)
Волшебное слово else
Слово else
, примененное в цикле, проверяет, был ли произведен выход из цикла инструкцией break
, или же “естественным” образом. Блок инструкций внутри else
выполнится всего один раз только в том случае, если выход из цикла произошел без помощи break
.
Если во время выполнения Python встречает инструкцию break
внутри цикла, то он сразу же прекращает выполнение этого цикла и выходит из него. При этом ветка else
исполняться не будет.
Вот пример программы, которая считывает числа до тех пор, пока не встретит отрицательное число. При появлении отрицательного числа программа завершается.
a = int(input())
while a != 0:
if a < 0:
print('Встретилось отрицательное число', a)
break
a = int(input())
else:
print('Ни одного отрицательного числа не встретилось')
Цикл for
Этот цикл проходится по коллекции (последовательности объектов, например строке или списку), и во время каждого прохода возвращает элемент коллекции и выполняет тело цикла.
for переменная in коллекция:
действие
for char in 'hello world':
print(char * 2, end='')
# hheelllloo wwoorrlldd
Операторы break
, continue
и else
работают аналогично while
.
Вложенные циклы
Одни циклы внутри себя могут содержать другие циклы.
Рассмотрим на примере вывода таблицы умножения:
i = 1
j = 1
while i < 10:
while j < 10:
print(i * j, end="\t")
j += 1
print("\n")
j = 1
i += 1
Или тоже самое с for
:
for i in range(1, 10):
for j in range(1, 10):
print(i * j, end="\t")
print("\n")
Функция range
Для повторения цикла некоторое заданное число раз n
можно использовать цикл for
вместе с функцией range
:
range([start=0], stop, [step=1])
арифметическая прогрессия от start до stop (не включительно!) с шагом step.
for i in range(4):
# здесь можно выполнять циклические действия
print(i)
print(i ** 2)
# цикл закончился, поскольку закончился блок с отступом
print('Конец цикла')
Например, создать ряд чисел, кратных трем, так чтобы не нужно было вводить каждое из них.
for i in range(3, 16, 3):
quotient = i / 3
print(f"{i} делится на 3, результат {int(quotient)}.")
Если ваш шаг положительный — то вы двигаетесь по ряду увеличивающихся чисел, это называется инкрементация. Если ваш шаг отрицательный, то вы двигаетесь по ряду убывающих чисел, это называется декрементация. Это позволяет вам идти вспять.
В следующем примере ваш шаг будет -2
. Это значит, что декрементация будет равна 2 для каждого цикла:
for i in range(10, -6, -2):
print(i)
Функция enumerate
Периодически требуется пройти по элементам списка и при этом обрабатывать не только значение элемента, но так же и его порядковый номер в списке. Вот в этом случае понадобится enumerate
:
enumerate(collection, start=0)
Возвращает номера и соответствующий элемент последовательности.
for index, value in enumerate('abcdef'):
print(index, '->', value)
Файлы
Рассмотрим встроенные средства Python для работы с файлами: открытие / закрытие, чтение и запись.
Для начала создадим текстовый файл text.txt
с таким содержимым
Hello world!
The end.
Открытие
Прежде, чем работать с файлом, его надо открыть. С этим справится встроенная функция open
:
f = open('text.txt', 'r')
Обычно ей передают один или два аргумента.
Первый – имя файла или имя с адресом, если файл находится не в том каталоге, где находится сама программа.
Второй аргумент – режим, в котором открывается файл.
Режим | Обозначение |
'r' | открытие на чтение (является значением по умолчанию). |
'w' | открытие на запись, содержимое файла удаляется, если файла не существует, создается новый. |
'x' | открытие на запись, если файла не существует, иначе исключение. |
'a' | открытие на дозапись, информация добавляется в конец файла. |
'b' | открытие в двоичном режиме. |
't' | открытие в текстовом режиме (является значением по умолчанию). |
'+' | открытие на чтение и запись |
По умолчанию режим равен ‘rt’.
Чтение
Для этого есть несколько способов, но большого интереса заслуживают лишь два из них.
Первый - метод read
, читающий весь файл целиком, если был вызван без аргументов, и n символов, если был вызван с аргументом (целым числом n).
>>> f = open('text.txt')
>>> f.read(1)
'H'
>>> f.read()
'ello world!\n\nThe end.\n\n'
>>> f.read()
При повторном чтении файла отображается пустая строка. Так происходит из-за того, что при вызове метода read
, считывается весь файл. И после того, как файл был считан, курсор остается в конце файла.
Управлять положением курсора можно с помощью метода seek
f.seek(0) # 0 означает начало файла
Метод readline
считывает из файла одну строку и возвращает её
>>> f = open('text.txt')
>>> f.readline()
'Hello world!\n'
Ещё один способ сделать это - прочитать файл построчно, воспользовавшись циклом for
:
>>> f = open('text.txt')
>>> for line in f:
... print(line)
...
'Hello world!\n'
'\n'
'The end.\n'
'\n'
Запись
Запись в файл осуществляется с помощью метода write
:
>>> f = open('text.txt', 'w')
>>> line = 'Hello world!'
>>> f.write(line + '\n')
Метод write
возвращает число записанных символов.
Закрытие
После того как работа с файлом закончена, важно не забывать его закрыть, чтобы освободить место в памяти и позводить другим программам работать с файлом. Делается это с помощью файлового метода close()
. Свойство файлового объекта closed позволяет проверить закрыт ли файл.
>>> f.close()
>>> f.closed
True
Практика
- Написать программу, которая выводит сама себя.
- Создать c помощью цикла файл
data.txt
c таким содержимым:
Написать программу, которая открывает этот файл на чтение, построчно считывает из него данные и записывает строки в другой файл1 2 3 4 5
data_tr.txt
, заменяя цифры словами ‘один’, ‘два’, ‘три’, ‘четыре’, ‘пять’. Также необходимо посчитать сумму цифр и записать их в самом конце файла. - Написать программу, которая выводит саму себя задом наперед
Полезные ссылки
- 📖 Циклы
Домашнее задание
-
Завершить практики, начатые на уроке.
-
Задача fizz-buzz:
У вас есть три числа, они вводятся из консоли. Первое число называется fizz, второе называется buzz. До третьего необходимо досчитать от единицы. Считая, надо выводить число. Если число кратно fizz - надо выводить F вместо числа. Если число кратно buzz - надо выводить B вместо числа. Если число кратно и fizz и buzz, надо выводить FB. И так - пока не будет достигнуто третье введенное число.
Пример условия и результата:
Введены числа 2, 5, 18
Вывод должен быть таким:
1 F 3 F B F 7 F 9 FB 11 F 13 F B F 17 F -
Написать fizz-buzz для 20 троек чисел, которые записаны в файл. Читаете из файла первую строку, берете из нее числа, считаете для них fizz-buzz и записуете в другой файл.