#3. Циклы. Файлы

Циклы for и while. Работа с файлами

enter image description here

План

  1. Циклы
    1. Цикл while
    2. Бесконечный цикл
    3. Операторы управления циклом
    4. Цикл for
    5. Функция range
    6. Функция enumerate
  2. Файлы

Циклы

Когда у программиста возникает необходимость повторить какое-то действие несколько раз, он пишет цикл.

В 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 впервые перестанет выполняться.

Бесконечный цикл

enter image description here

Бесконечный цикл — цикл, написанный таким образом, что условие выхода из него никогда не выполняется.
В программировании довольно часто используются бесконеные циклы. Просто есть ситуации, когда нет явного ограничения, и условие трудно проверить заранее.

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

Практика

  1. Написать программу, которая выводит сама себя.
  2. Создать c помощью цикла файл data.txt c таким содержимым:
    1
    2
    3
    4
    5
    
    Написать программу, которая открывает этот файл на чтение, построчно считывает из него данные и записывает строки в другой файл data_tr.txt, заменяя цифры словами ‘один’, ‘два’, ‘три’, ‘четыре’, ‘пять’. Также необходимо посчитать сумму цифр и записать их в самом конце файла.
  3. Написать программу, которая выводит саму себя задом наперед

Полезные ссылки

  1. 📖 Циклы

Домашнее задание

  1. Завершить практики, начатые на уроке.

  2. Задача 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

  3. Написать fizz-buzz для 20 троек чисел, которые записаны в файл. Читаете из файла первую строку, берете из нее числа, считаете для них fizz-buzz и записуете в другой файл.