Работа с файлами. Множества. Словари
Работа с файлами
- Текстовые файлы
open(), read() / write() / close()
readlines(), он же сам файл, print(..., file=)
"b/t" — str или bytes
введение в with
вводить числа до 0, записывать в файл только положительные
- файлы с данными
если данные наши: сериализация/десериализация, pickle (json, xml, …)
dump[s]()/load[s]()
если данные «бинарные» и заранее готовы: struct
byte order
pack()/unpack()
Если в командной строке программы пять (с argv[0] — 6) параметров, то это:
- имя выходного файла
- имя,
- фамилия
- возраст (целое число
- средний балл (вещественное)
- .. тогда сериализовать эти данные в файл;
- а если параметр только один (argv[1]), это имя входного файла, десериализовать их оттуда и вывести
То же, что и выше, но с помощью struct
Словари и множества
- Задача хранения и индексирования
- сложных данных
- просто слишком больших данных
- +невосстановимое хеширование
- Свойства хеш-функции
- неоднозначность
- распределённость по ОЗ (на конкретных данных!)
- разброс для почти похожих
- невосстановимость объекта (сравнение без раскрытия)
- индексирование
- сортировка и поиск
a % b
int(sin(b)*1000)%100
hash(), какие объекты хешируются
- ...
если есть различные значения синуса, какой к ним хороший хеш?
1 # тестирование хеш-функции 2 3 import random 4 from math import * 5 6 def testhash(f, seq, N): 7 '''Применить числовую хеш-функцию f 8 ко всем элементам e последовательности seq 9 посчитать и вернуть список, сколько раз 10 f(e) == 0, 1, ... , N, где 0…N — ОЗ f() 11 ''' 12 hist = [0]*N 13 for e in seq: 14 hist[f(e)] += 1 15 return hist 16 17 def hash1(a): 18 return a%10 19 20 def hash2(a): 21 return int(sin(a)*1000)%10 22 23 PHI = (sqrt(5)-1)/2 24 PMAX = 10 25 26 def hash3(a): 27 return int(PMAX*(a*PHI%1)) 28 29 SEQSZ = 10000 30 31 #random.seed(100500) 32 seq = (random.randrange(10,100) for i in range(SEQSZ)) 33 hist = testhash(hash3, seq, 10) 34 print(hist,(max(hist)-min(hist))*100/SEQSZ)
хеш для идентификаторов:
- не все буквы
- некоторые буквы встречаются чаще других (в случае Python, есть ещё «_»)
- Задание, в т. ч. циклический конструктор
- Операции над множествами, методы
- Типичное использование
каких букв не хватает
вводятся предложения, проверить, есть ли общее слово (регистр букв игнорировать)
- Задание, в т. ч. циклический конструктор
- Операции над словарями, методы
- Типичное использование:
- «именные перечни», в которых роль индекса играют строки
- «разреженные матрицы» — словари с небольшим количеством элементов
- с любыми числовыми индексами
с индексами-векторами типа Arr[(10,20,0)]
globals()/locals()
- именные параметры функции
- Словари и счётчики
ручная реализация счётчика
collections.defaultdict и collections.Counter
генератор файла с N случайными словами (N задаётся из командной строки), причём 1-е слово встречается ровно 1 раз, второе — 2 раза, …, N-е — N раз
подсчёт слов в файле, гистограмма вида
######## word1 ############################# word2 ################### word3 ...
- ..где максимальная длина "#######" — 50 символов
самое популярное слово длиной >3 в файле LecturesVMSH/2012-01-18/anna.txt