Различия между версиями 7 и 8
Версия 7 от 2017-07-31 13:56:46
Размер: 5807
Редактор: ArsenyMaslennikov
Комментарий:
Версия 8 от 2017-08-03 14:43:55
Размер: 6512
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 24: Строка 24:
  * если данные готовы: `struct`   * если данные «бинарные» и заранее готовы: `struct`
Строка 35: Строка 35:
 * {i} То же, что и выше, но с помощью struct  * {i} То же, что и выше, но с помощью `struct`
Строка 72: Строка 72:
Строка 80: Строка 81:
Строка 90: Строка 92:
  * {*} идентификаторы   * {i} хеш для идентификаторов:
   * не все буквы
   * некоторые буквы встречаются чаще других (в случае Python, есть ещё «_»)
Строка 104: Строка 108:
 Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов  Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов (он же «ассоциативный массив»)
Строка 108: Строка 112:
   * ...
   * globals()/locals()
   * «именные перечни», в которых роль индекса играют строки
   * «разреженные матрицы» — словари с небольшим количеством элементов
    * с любыми числовыми индексами
    * с индексами-векторами типа `Arr[(10,20,0)]`
   * `globals()`/`locals()`
Строка 113: Строка 120:
   * {*} `collections`
   * {*} тестирование хеш-функции: много входных данных и гистограмма
   {{{#!highlight python3
counter = {}
el = input()

while el:
    counter[el] = counter.get(el,0) + 1
    el = input()

print(counter)
}}}
   * `collections.defaultdict` и `collections.Counter`

Работа с файлами. Множества. Словари

Работа с файлами

  • Текстовые файлы
    • open(), read() / write() / close()

    • readlines(), он же сам файл, print(..., file=)

    • "b/t" — str или bytes

    • введение в with

  • {*} вводить числа до 0, записывать в файл только положительные

    •    1 # вводить целые числа до 0, записывать в файл только положительные
         2 
         3 f = open("data", "wt")
         4 n = int(input())
         5 while n:
         6     if (n > 0):
         7         print(n, file=f)
         8     n = int(input())
         9 f.close()
      
  • файлы с данными
    • если данные наши: сериализация/десериализация, pickle (json, xml, …)

      • dump[s]()/load[s]()

    • если данные «бинарные» и заранее готовы: struct

      • byte order :(

      • pack()/unpack()

  • {i} Если в командной строке программы пять (с argv[0] — 6) параметров, то это:

    1. имя выходного файла
    2. имя,
    3. фамилия
    4. возраст (целое число
    5. средний балл (вещественное)
      • .. тогда сериализовать эти данные в файл;
    6. а если параметр только один (argv[1]), это имя входного файла, десериализовать их оттуда и вывести
  • {i} То же, что и выше, но с помощью 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)
        
    • {i} хеш для идентификаторов:

      • не все буквы
      • некоторые буквы встречаются чаще других (в случае Python, есть ещё «_»)
    Множество — просто хеш-таблица
    • Задание, в т. ч. циклический конструктор
    • Операции над множествами, методы
    • Типичное использование
    • {*} каких букв не хватает

      •    1 # вводится два слова (через пробел)
           2 # выводится слово из тех букв первого, которых нет во втором
           3 
           4 a, b = input().split()
           5 print("".join(set(a)-set(b)))
        
    • {i} вводятся предложения, проверить, есть ли общее слово (регистр букв игнорировать)

    Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов (он же «ассоциативный массив»)
    • Задание, в т. ч. циклический конструктор
    • Операции над словарями, методы
    • Типичное использование:
      • «именные перечни», в которых роль индекса играют строки
      • «разреженные матрицы» — словари с небольшим количеством элементов
        • с любыми числовыми индексами
        • с индексами-векторами типа Arr[(10,20,0)]

      • globals()/locals()

      • именные параметры функции
    • Словари и счётчики
      • {*} ручная реализация счётчика

           1 counter = {}
           2 el = input()
           3 
           4 while el:
           5     counter[el] = counter.get(el,0) + 1
           6     el = input()
           7 
           8 print(counter)
        
      • collections.defaultdict и collections.Counter

    • {i} генератор файла с N случайными словами (N задаётся из командной строки), причём 1-е слово встречается ровно 1 раз, второе — 2 раза, …, N-е — N раз

    • {i} подсчёт слов в файле, гистограмма вида

      •    ########                                  word1
           #############################             word2
           ###################                       word3
           ...
      • ..где максимальная длина "#######" — 50 символов
    • {i} самое популярное слово длиной >3 в файле anna.txt

Python/Summer2017/2017-07-10 (последним исправлял пользователь FrBrGeorge 2017-08-08 11:02:11)