Введение в классы

Разбор ДЗ

Поиск простого шаблона в строке

Ввести строку, содержащую произвольные символы (кроме символа «@»). Затем ввести строку-шаблон, которая может содержать символы @. Проверить, содержится ли в исходной строке подстрока, совпадающая со строкой-шаблоном везде, кроме символов @; на месте @ в исходной строке должен стоять ровно один произвольный символ. Вывести позицию в строке, с которой начинается эта подстрока или -1, если её там нет.

   1 S = input()
   2 P = input()
   3 patt = []
   4 n = 0
   5 # Составим список «обязательных» шаблонов
   6 # + с какой позиции они начинаются
   7 for w in P.split('@'):
   8     if w:
   9         patt.append((n,w))
  10         n += len(w)
  11     n += 1
  12 # Сопоставим все шаблоны с подстроками, начиная с позиции i
  13 for i in range(len(S)-len(P)+1):
  14     for k,w in patt:
  15         if S[i+k:i+k+len(w)] != w:
  16             # Шаблон не совпал
  17             break
  18     else:   # Все шаблоны совпали!
  19         print(i)
  20         break
  21 else:       # Ни один шаблон не совпал
  22     if patt or len(P)>len(S):
  23         print(-1)
  24     else:   # Да их и не было, а было только  немного '@' 
  25         print(0)

Мы можем использовать словари в качестве организатора пространства имен. Как известно, функция может иметь произвольное количество параметров.

2.png

Любое количество параметров не распаковывается. Мы экономим имена. Можно функции передать именные параметры.

3.png

Иногда именные параметры могут работать как позиционные. Именные параметры моно явно задавать при вызове функции.

4.png

Меньше параметров передать не можем, так как два параметра – позиционные.

Замечание: позиционные параметры передаются функции в виде кортежа, а именные в виде словарей.

Напишем функцию, которая может вызывать сколь угодно именных параметров.

5.png

В следующем примере мы увидим, что не нужно покрывать все именные параметры. Вместо того, что бы явно указывать какой параметр что связывает, мы составляем словарь.

6.png

Еще один пример.

7.png

Замечание: в старой версии Python не фиксируется порядок элементов множества.

Поговорим о том, как на самом деле устроено пространство имен.

Мы уже говорили про пространство имен и знаем, что любой объект – это пространство имен. Мы можем составить свой собственный объект, внутрь которого положить свои методы и поля.

8.png

Помним, что import module - это только его выполнение. При import выполняется вход и все объекты залипают в каком-то пространстве имен.

9.png

Следующая программа запущена как программа, а не импортирована как модуль.

10.png

Способ создать пустое пространство имен – создать класс.

У класса C ничего не будет кроме системных методов, но он является динамическим пространством имен. Туда можно положить все, что хотим.

11.png

Если мы хотим, что бы группа объектов и функций не лезла в namespace, то делаем так, как показано ниже (создаем класс, в котором появляются два дополнительных поля).

12.png

Мы хотим, что бы класс получал экземпляр класса. Видны намеки на то, что dict, int, list – это все классы.

13.png

Метод type вывел тип и с помощью int мы преобразовали строку в число.

Тип объекта – это конструктор экземпляра класса.

Можно перебить значения.

14.png

Когда добавляем в класс поле, мы видим это поле через имя класса или через экземпляр класса. Если поле перебить, то создается поле объекта.

Сделаем тоже самое для функции.

15.png

Когда мы смотрим на функцию через экземпляр класса, то она показывает, что это не функция, а метод.

16.png

Функция, которая выводит все свои параметры.

17.png

Оказывается, что у этого метода на один параметр больше.

Первый параметр – это ссылка на сам объект. Это нужно для того, что бы можно было обращаться к собственным полям.

Создадим файл.

18.png

Сделаем генератор, который убирает строки, начинающиеся с подчеркивания.

19.png

Хотелось бы создать механизм наблюдения namespace самого объекта. Для этого нужно придумать специальный метод, который вызывается всякий раз, когда конструируется экземпляр класса.

Экземпляр класса набиваем какими угодно полями.

При создании экземпляра класса передаем туда один параметр.

Все поля класса – это специальные поля.

20.png

LecturesCMC/PythonIntro2017/08_Classes/Conspect (последним исправлял пользователь FrBrGeorge 2017-11-17 09:09:41)