Файлы, ввод-вывод и связь с ОС
Дисциплина оформления кода
Код чаще читают, чем пишут
Основная ссылка: pep-0008 — рекомендации к оформлению кода.
Анализаторы кода:
Статический анализ: pyflakes, …
Личные рекомендации
- В коротком коде ошибок меньше.
- Ширина строки ограничена шириной мозга.
- В нечитаемом коде ошибок нет: никто не знает, отчего он не работает.
- Комментарии описывают задачу, а не решение.
- Пробелы и пустые строки — вакуум, символы — атомы. Дышать вам.
Переписать код в 2 раза быстрее, чем написать, и в 22 раза быстрее, чем потом исправлять.
Рекомендации по превращению «кода на Basic» в «код на Python»
Конструкции языка
- Несколько однотипных операций в столбик ⇒ работа с последовательностью
- Например, множественное присваивание
- Простой цикл ⇒ циклический конструктор
- Несколько однотипных действий в коде ⇒ функция
- Несколько однотипных функций ⇒ общая функция (duck typing!)
- Пытаетесь различить свойства объектов из функции ⇒ дерево классов
- Несколько однотипных операций в столбик ⇒ работа с последовательностью
Модули
Все задачи уже решены, если не в стандартных модулях, то в Python Package Index
- Вам годится несколько модулей, не ленитесь и сравните API
- Лучше сделать 10 файлов, чем 1 большой
- Лучше сделать модуль, чем копировать файлы
- Лучше сделать пакет, чем модуль-переросток
Опубликовал модуль — спас бобра помог людям
Ввод/вывод
- Потоковый
Файловые объекты: open(), close(), read(), write(), readline() и итератор
Типизированные файлы: модуль struct.html
Сериализация: json.html и pickle.html
методы .dunp() и .load()
pickle умеет объекты!
json умеет не все hashable объекты в индексах
Индексированны доступ (БД): anydbm.html
dict-интерфейс
Спецфайлы: zipfile.html, json.html, configparser.html, …
Модули os и sys
Обращайте внимание на пометку Availability:
Обращайте внимание на пометку Deprecated
sys.html: Связь с системой: свойства самого python:
argv[]
exit()
stdin, stdout, stderr
getsizeof(), max…(), getrefcount()
ps1, ps2
- …
os.html: Связь с операционной системой и обеспечение (относительной) кроссплатформенности:
Системные и другие libc-вызовы
Параметры процесса: environ[], chdir()/getcwd(), идентификаторы и флаги
- Работа с файловым дескриптором вместо файлового объекта
- Создание/удаление/переименование различных файловых объектов; получение и изменение их свойств
Манипуляция с именами файловых объектов (os.path.html)
- Из используемого:
os.pipe(), os.tmpfile()
os.listdir(path)/os.makedirs(path[, mode])/os.removedirs(path)
os.stat(path), os.times()
os.urandom(n)
subprocess.html/subprocess32: Запуск подпроцессов — не слишком кроссплатформенная штука.
Д/З
- Прочитать:
Про файловые объекты в учебнике (inputoutput.html) и в документации
Про сериализацию в документации по pickle
- Опционально почитать документацию по всем упомянутым пакетам
Применить pylama (или pylint + falkes) к своему коду и помедитировать над выдачей
Задачи для EJudge не могут включать в себя работу с ОС или модулями, так что просто упражнения:
(MaxSubst) Подстрока максимальной длины из разных букв
Ввести строку и вывести ближайшую к началу подстроку максимальной длины, содержащую только различные символы.
qweqweASDFGHASDFGASasdfghas123
DFGASasdfgh
(GuessSigns) Вставить знаки в целочисленное выражение
Ввести последовательность натуральных чисел через пробел (не более 12), и вывести YES, если можно ли между этими числами вставить произвольные знаки сложения или вычитания и один знак "=", чтобы получилось равенство. Вывести NO, если нельзя. Унарные операции и пропуск знака не допускаются.
123 234 345 12
YES
(ConstructIt) Проверить, можно ли собрать агрегат согласно инструкции
Первая строка ввода — правило сборки агрегата вида «название_агрегата деталь1 деталь2 …», в ней сказано, из каких деталей можно собрать агрегат. Последующие строки ввода — либо аналогичные правила сборки деталей вида «деталь1 деталь2 …», либо состоят из одного слова «деталь» — в знак того, что такие детали есть на складе. Каждая деталь собирается не более, чем единственным способом. Последняя строка пустая. Вывести YES, если из деталей на складе можно собрать агрегат, и NO, если нельзя.
Choo qw er ty ui qw er ty er ty ui ty ui
YES
(SubModules) Ввести имя модуля и посчитать, сколько подмодулей в нём содержится
Ввести имя модуля и посчитать, столько подмодуелй он содержит (солько объектов модуля сами являются модулями). Если имя не соответствует никакому модулю, вывести -1.
os
5