Программа берёт числа не с клавиатуры, а из файла.
10 класс,
углублённый уровень — занятие восьмое.
Урок 16 плана: текстовые и двоичные файлы, файловая переменная, чтение из файла, запись в файл. На ЕГЭ так устроено задание 17: файл на десять тысяч чисел, руками не посчитать — только программой.
Данные набирает человек. Пять чисел — можно. Десять тысяч — нет.
Данные уже лежат на диске: их записал прибор, другая программа, составитель ЕГЭ. Программа читает их сама, сколько бы их ни было.
Символы и переводы строк. Открывается Блокнотом: 17.txt,
.py, .csv.
Байты в своём формате: картинка, архив, программа. Блокнот покажет мусор — читают их иначе.
f = open("17.txt")
k = 0
for line in f:
x = int(line)
if x % 3 == 0:
k = k + 1
print(k)
f — файловая переменная (указатель): не содержимое файла, а «закладка», которая помнит, докуда прочитано.
line — строка, то есть текст: "-17\n". Считать с ней нельзя —
сначала int(line), перевод строки int() отбросит сам.
Имя без пути — файл ищется в папке программы. Положите
17.txt рядом с .py.
f = open("data.txt")
n = int(f.readline())
s = 0
for i in range(n):
x = int(f.readline())
s = s + x
print(s)
| data.txt | кто прочитал |
|---|---|
| 3 | n |
| 10 | виток 1 |
| 20 | виток 2 |
| 5 | виток 3 |
| 100 | никто |
Напечатает 35. Закладка двигается сама: каждый
readline() берёт следующую строку.
А если вместо range(n) написать for line in f? Цикл
пойдёт со второй строки до конца файла — и прибавит 100.
В файлах ЕГЭ числа от −10000 до 10000. Какие оканчиваются на 7?
x % 10 == 7−17 % 10 == 3 — пропустит.
−13 % 10 == 7 — засчитает.
abs(x) % 10 == 7Последняя цифра — у модуля числа. Для −17 это 7, для −13 — 3.
Почему: в Python остаток от деления на 10 всегда от 0 до 9. −17 = 10 · (−2) + 3.
А x % 3 == 0 и x % 5 == 0 на отрицательных работают
верно: делимость от знака не зависит.
m = 0
for line in f:
x = int(line)
if abs(x) % 10 == 7:
if x > m:
m = x
Если все числа на 7 отрицательные — напечатает 0, которого в файле нет.
m = -10001
for line in f:
x = int(line)
if abs(x) % 10 == 7:
if x > m:
m = x
Старт меньше любого возможного числа: первое же подходящее его заменит.
Та же фраза, что в прошлой паре: «m — наибольшее из прочитанных подходящих» обязана быть верной до цикла.
f = open("17.txt")
prev = int(f.readline())
c = 0
for line in f:
x = int(line)
if (prev + x) % 3 == 0:
c = c + 1
prev = x
print(c)
| файл | пара (prev; x) | сумма |
|---|---|---|
| 4 | — | |
| 5 | (4; 5) | 9 ✓ |
| 7 | (5; 7) | 12 ✓ |
| 1 | (7; 1) | 8 |
Первое число читаем до цикла, в конце витка prev = x. Чисел
четыре — пар три.
prev = 0 добавит пару (0; 4). А если первое
число кратно 3 — эта лишняя пара засчитается.«Пары, где сумма больше наибольшего числа файла на 7». Пока файл не прочитан до конца, этого числа не знает никто.
f = open("17.txt")
M = -10001
for line in f: # первый проход: ищем M
...
f.close()
f = open("17.txt") # закладка снова в начале
prev = int(f.readline())
for line in f: # второй проход: пары
...
Без повторного open второй цикл не сделает ни одного витка:
закладка стоит в конце файла. Списков мы не знаем — и не нужно.
Серия — числа подряд, каждое строго больше предыдущего.
| x | cur | best |
|---|---|---|
| 4 | 1 | 1 |
| 1 | 1 | 1 |
| 5 | 2 | 2 |
| 9 | 3 | 3 |
| 2 | 1 | 3 |
| 2 | 1 | 3 |
| 8 | 2 | 3 |
cur — длина серии, которая кончается на текущем числе.
best — лучшая до сих пор.
best только при обрыве серии —
ошибка: серия в самом конце файла ничем не обрывается.>: при равной длине остаётся первая серия.f = open("data.txt")
g = open("out.txt", "w")
for line in f:
x = int(line)
if x > 0:
print(x, file=g)
g.close()
| Режим | Что делает |
|---|---|
"r" (по умолчанию) | чтение |
"w" | запись: старое содержимое стирается |
"a" | дописать в конец |
print(..., file=g) пишет строку не на экран, а в файл.
g.close() — чтобы всё записанное точно оказалось на диске.
| № | Файл | Программа |
|---|---|---|
| 1 | 1.txt | Отбор: сколько чисел оканчивается на 7 и наибольшее из них |
| 2 | 2.txt | Пары соседних: хотя бы одно кратно 5, сумма больше M — наибольшего числа на 7. Два прохода |
| 3 | 3.txt | Самая длинная возрастающая серия: длина и первое число |
zadanie1.py,
zadanie2.py, zadanie3.py.Проверка.bat → «Найти мои файлы» → «Проверить всё».open("1.txt"). Ошиблась
программа — оболочка положит в папку файл proverka-1.txt, на котором
это случилось.
Отметка: три задания — «5», два — «4», одно — «3». Попыток сколько угодно.
Сначала тренажёр, потом три программы.
Домашнее задание — на странице «Домашнее задание»: шесть типов задач на чтение программ с файлом, Python дома не нужен. В начале следующей пары — проверочная по этим же типам.