Различия между версиями 1 и 2
Версия 1 от 2020-09-21 11:23:39
Размер: 5137
Редактор: FrBrGeorge
Комментарий:
Версия 2 от 2020-09-21 11:31:27
Размер: 5584
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 72: Строка 72:

== Вычислимые последовательности (введение) ==
== Множества ==
 * Реализация множеств как хеш-таблиц, линейный в среднем поиск
 * => хеширование только константных объектов!
 * Теоретико-множественные операции
 * множество — это последовательность
== Вычислимые последовательности (введение, можем не успеть) ==
Строка 76: Строка 80:
 * `enumerate()`
 * `sotred()` и `reversed()`
 * …

Последовательности, множества и цикл for

TODO это план прошлогодней лекции, поправить

Операции над объектами как совокупность методов

  • dir(объект), пространство имён, методы

    • int.__add__(100500,42) или даже (100500).__add__(42) как 100500*42

    • "строка".__len__() как len("строка")

    • и т. п.
  • понятие протокола
    • строгая типизация (__mul__() vs __rmul__()) и т. п.

Последовательность — это свойство объекта (нужные методы).

Цикл for

  • Общий вид:
       1 for имена in последовательность:
       2     тело
    
    • имена, а не только имя — распаковка, если элемент последовательности — тоже последовательность

    • break, continue и else:

  • примеры со строками и кортежами

Кстати,

  • В конструкции множественного связывания имена = последовательность последовательность любая

Индексируемые/неиндексируемые последовательности

Имеют метод последовательность.__getitem__(что-то), что означает последовательность[что-то]

Кортеж:

  • индексирование, +от конца
  • секционирование, шаг, умолчания, отсутствие границ
  • как на самом деле работает .__getitem__()

    • тип slice

  • .__getitem__(кортеж) — не работает :(

Cтрока (введение):

  • Подстрока строки — строка :)

Модифицируемые

Имеют метод .__setitem__() Список:

  • .setitem(число)

  • .setitem(slice)

    • вариант с шагом
  • циклическая cборка [выражение for имена in последовательность]

    • Что работает так:
         1   _=[]
         2   for имена in последовательность:
         3       _.append(выражение)
      
    • и даже [выражение for имена1 in последовательность1 for имена2 in последовательность2 …]:

         1   _=[]
         2   for имена1 in последовательность1:
         3       for имена2 in последовательность2:
         4           . . .
         5               _.append(выражение)
      
      то есть является декартовым произведением
  • Методы списков
  • Список как динамический массив, сложность модификации его начала (n) и конца (1)

    • список как стек, .append(), .pop()

    • сравнение с linked lists; есть ли разница в эффективности?
      • единственная выгода linked list — это константная сложность вставки/удаления произвольного элемента
      • но алгоритмов, требующих вставки/удаления произвольного элемента без предварительного поиска, кажется (?) нет, а поиск в обоих случаях линейный

Деки:

  • Ответ на предыдущий вопрос — очередь

  • from collectiond import deque

  • добавление в начало и в конец

Множества

  • Реализация множеств как хеш-таблиц, линейный в среднем поиск
  • => хеширование только константных объектов!

  • Теоретико-множественные операции
  • множество — это последовательность

Вычислимые последовательности (введение, можем не успеть)

Значения не хранятся, а вычисляются .__getitem__()-ом

  • range (индексируемая!)

  • enumerate()

  • sotred() и reversed()

Про Д/З

Почти весь ввод в Д/З делается с помощью eval(nput()):

  • input() вводит строку

  • eval() вычисляет эту строку, как если бы это было выражение python3

Д/З

  1. Прочитать и прощёлкать тьюториалпро цикл for)

LecturesCMC/PythonIntro2020/03_SequencesFor (последним исправлял пользователь FrBrGeorge 2020-09-26 00:07:55)