Введение в классы
Разбор ДЗ
Поиск простого шаблона в строке
Ввести строку, содержащую произвольные символы (кроме символа «@»). Затем ввести строку-шаблон, которая может содержать символы @. Проверить, содержится ли в исходной строке подстрока, совпадающая со строкой-шаблоном везде, кроме символов @; на месте @ в исходной строке должен стоять ровно один произвольный символ. Вывести позицию в строке, с которой начинается эта подстрока или -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)
Мы можем использовать словари в качестве организатора пространства имен. Как известно, функция может иметь произвольное количество параметров.
Любое количество параметров не распаковывается. Мы экономим имена. Можно функции передать именные параметры.
Иногда именные параметры могут работать как позиционные. Именные параметры можно явно задавать при вызове функции.
Меньше параметров передать не можем, так как два параметра – позиционные.
Замечание: позиционные параметры передаются функции в виде кортежа, а именные в виде словарей.
Напишем функцию, которая может вызывать сколь угодно именных параметров.
В следующем примере мы увидим, что не нужно покрывать все именные параметры. Вместо того, что бы явно указывать какой параметр что связывает, мы составляем словарь.
Еще один пример.
Замечание: в старой версии Python не фиксируется порядок элементов множества.
Поговорим о том, как на самом деле устроено пространство имен.
Мы уже говорили про пространство имен и знаем, что любой объект – это пространство имен. Мы можем составить свой собственный объект, внутрь которого положить свои методы и поля.
Помним, что import module - это только его выполнение. При import выполняется вход и все объекты залипают в каком-то пространстве имен.
Следующая программа запущена как программа, а не импортирована как модуль.
Способ создать пустое пространство имен – создать класс.
У класса C ничего не будет кроме системных методов, но он является динамическим пространством имен. Туда можно положить все, что хотим.
Если мы хотим, что бы группа объектов и функций не лезла в namespace, то делаем так, как показано ниже (создаем класс, в котором появляются два дополнительных поля).
Мы хотим, что бы класс получал экземпляр класса. Видны намеки на то, что dict, int, list – это все классы.
Метод type вывел тип и с помощью int мы преобразовали строку в число.
Тип объекта – это конструктор экземпляра класса.
Можно перебить значения.
Когда добавляем в класс поле, мы видим это поле через имя класса или через экземпляр класса. Если поле перебить, то создается поле объекта.
Сделаем тоже самое для функции.
Когда мы смотрим на функцию через экземпляр класса, то она показывает, что это не функция, а метод.
Функция, которая выводит все свои параметры.
Оказывается, что у этого метода на один параметр больше.
Первый параметр – это ссылка на сам объект. Это нужно для того, что бы можно было обращаться к собственным полям.
Создадим файл.
Сделаем генератор, который убирает строки, начинающиеся с подчеркивания.
Хотелось бы создать механизм наблюдения namespace самого объекта. Для этого нужно придумать специальный метод, который вызывается всякий раз, когда конструируется экземпляр класса.
Экземпляр класса набиваем какими угодно полями.
При создании экземпляра класса передаем туда один параметр.
Все поля класса – это специальные поля.