конспекты по информатике. Конспект Антропова. Конспект Антропова
Скачать 83.04 Kb.
|
Конспект Антропова: Важной частью структурного программированию помимо операторов условий считаются циклы. Они помогают автоматизировать последовательные задачи в программе, а именно: повторить выполнение определенных участков кода. Такая необходимость возникает достаточно часто, когда нужно сделать что-нибудь много раз, тем самым, циклы упрощают эту задачу. В программировании циклы позволяют повторять некоторое действие в зависимости от соблюдения заданного условия. Таким образом организуется исполнение многократной последовательности инструкций. Есть еще несколько важных понятий, которые нужно знать: Телом цикла называется та последовательность кода, которую нужно выполнить несколько раз. Единоразовое выполнение – это итерация 1). Цикл while While - один из самых универсальных циклов в Python, поэтому довольно медленный. Выполняет тело цикла до тех пор, пока условие цикла истинно. >>> i = 5 >>> while i < 15: ... print(i) ... i = i + 2 ... 5 7 9 11 13 2) Цикл for Цикл for сложнее, чуть менее универсальный, но выполняется гораздо быстрее цикла while. Этот цикл проходится по любому итерируемому объекту (например строке или списку), и во время каждого прохода выполняет тело цикла. Python содержит важные типы данных, которыми вы с высокой вероятностью будете использовать каждый день. Они называются списки, кортежи и словари >>> for i in 'hello world': ... print(i * 2, end='') ... hheelllloo wwoorrlldd Python содержит важные типы данных, которыми вы с высокой вероятностью будете использовать каждый день. Они называются списки, кортежи и словари 3)Списки Чтобы создать список используйте квадратные скобки или функцию list(): my_list1 = [] # Пустой список my_list2 = list() # Пустой список 1 2 my_list1 = [] # Пустой список my_list2 = list() # Пустой список Список сохраняет порядок элементов с которым создаётся или в котором элементы добавляются. Списки являются последовательностями и поддерживают доступ к элементам по индексу, другие свойства последовательностей будут описаны в следующих главах. Первый элемент списка находится под индексом 0, последний — на единицу меньше длины списка. >>> name = ["obi", "ike", "nwosu"] >>> name[0] 'obi' >>> name[1] 'ike' >>> name[2] 'nwosu' 1 2 3 4 5 6 7 >>> name = ["obi", "ike", "nwosu"] >>> name[0] 'obi' >>> name[1] 'ike' >>> name[2] 'nwosu' Метод append() добавляет элемент в список. >>> name = ["obi", "ike", "nwosu"] >>> name.append("nkem") >>> names ["obi", "ike", "nwosu", "nkem"] 1 2 3 4 >>> name = ["obi", "ike", "nwosu"] >>> name.append("nkem") >>> names ["obi", "ike", "nwosu", "nkem"] Метод insert() добавляет элемент в любое место списка. >>> name = ["obi", "ike", "nwosu"] >>> name.insert(1, "nkem") >>> names ["obi", "nkem", "ike", "nwosu"] 1 2 3 4 >>> name = ["obi", "ike", "nwosu"] >>> name.insert(1, "nkem") >>> names ["obi", "nkem", "ike", "nwosu"] Оператор + объединяет два и более списка. >>> name = ["obi", "ike", "nwosu"] >>> name1 = ["James"] >>> name + name1 ["obi", "ike", "nwosu", "James"] 1 2 3 4 >>> name = ["obi", "ike", "nwosu"] >>> name1 = ["James"] >>> name + name1 ["obi", "ike", "nwosu", "James"] Для просмотра всех методов списка запустите команду help(list). 4) Кортежи. Кортеж тоже является последовательностью и создается элементами разделёнными запятыми: >>> companies = "Google", "Microsoft", "Tesla" >>> companies ('Google', 'Microsoft', 'Tesla') 1 2 3 >>> companies = "Google", "Microsoft", "Tesla" >>> companies ('Google', 'Microsoft', 'Tesla') При определении непустого кортежа скобки не обязательны, но они становятся обязательными когда кортеж является частью большего выражения. Пустой кортеж создаётся пустой парой скобок: >>> companies = () >>> type(companies) 1 2 3 >>> companies = () >>> type(companies) При определении кортежа с одним элементом запятая за ним обязательна. >>> company = "Google", >>> type(company) >>> company = ("Google",) >>> type(company) 1 2 3 4 5 6 7 >>> company = "Google", >>> type(company) >>> company = ("Google",) >>> type(company) Пропуск запятой означает что задано обычное значение, не кортеж. >>> company = ("Google") >>> company 'Google' >>> type(company) 1 2 3 4 5 6 >>> company = ("Google") >>> company 'Google' >>> type(company) Кортежи индексируются как списки, но неизменямы. >>> companies = ("Google", "Microsoft", "Palantir") >>> companies[0] 'Google' >>> companies[0] = "Boeing" Traceback (most recent call last): File " TypeError: 'tuple' object does not support item assignment 1 2 3 4 5 6 7 >>> companies = ("Google", "Microsoft", "Palantir") >>> companies[0] 'Google' >>> companies[0] = "Boeing" Traceback (most recent call last): File " TypeError: 'tuple' object does not support item assignment В тоже время, если элементом кортежа является изменяемые объект, такой как список, то он может быть изменен. >>> companies = (["lockheedMartin", "Boeing"], ["Google", "Microsoft"]) >>> companies (['lockheedMartin', 'Boeing'], ['Google', 'Microsoft']) >>> companies[0].append("SpaceX") >>> companies (['lockheedMartin', 'Boeing', 'SpaceX'], ['Google', 'Microsoft']) 1 2 3 4 5 6 >>> companies = (["lockheedMartin", "Boeing"], ["Google", "Microsoft"]) >>> companies (['lockheedMartin', 'Boeing'], ['Google', 'Microsoft']) >>> companies[0].append("SpaceX") >>> companies (['lockheedMartin', 'Boeing', 'SpaceX'], ['Google', 'Microsoft' 5)Словари. Словарь в Python похож на ассоциативный массив или хеш-таблицу в других языках. Словари индексируются по неизменяемому ключу. Для создания словаря используются фигурные скобки {} или функция dict(). Словарь — неупорядоченное множество пар ключ-значение в которых ключ уникален. Пример инициализации словаря: ages = {"obi": 24, "nkem": 23, "Chris": 23 } 1 2 3 4 ages = {"obi": 24, "nkem": 23, "Chris": 23 } Основные операции словаря это сохранение значения по ключу и доступ к значению по ключу. Доступ к значению осуществляется через квадратные скобки: >>> ages["obi"] 24 1 2 >>> ages["obi"] 24 Словари изменяемы: значения связанные с ключами могут менятся, добавлятся и удалятся. Структуры данных Python не ограничиваются приведёнными в этом разделе. Например, модуль collections содержит очереди, деки и другие коллекции. В то же время структуры приведённые в этом разделе используются в большинстве приложений на Python. Используйте функцию help с параметром в виде названия типа данных для детального изучения типа. help(list) help(tuple) help(set) help(dict) 1 2 3 4 help(list) help(tuple) help(set) help(dict) 6) ООП Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. Класс — тип, описывающий устройство объектов. Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты. Python соответствует принципам объектно-ориентированного программирования. В python всё является объектами - и строки, и списки, и словари, и всё остальное. Но возможности ООП в python этим не ограничены. Программист может написать свой тип данных (класс), определить в нём свои методы. Это не является обязательным - мы можем пользоваться только встроенными объектами. Однако ООП полезно при долгосрочной разработке программы несколькими людьми, так как упрощает понимание кода. Внутри объекта инкапсулируется логика работы с относящейся к нему информацией. Объекты в программе взаимодействуют друг с другом, обмениваются запросами и ответами. При этом объекты одного типа сходным образом отвечают на одни и те же запросы. Объекты могут организовываться в более сложные структуры, например, включать другие объекты или наследовать от одного или нескольких объектов. Классы Создавать классы в Python очень просто: class SomeClass(object): # поля и методы класса SomeClass Классы-родители перечисляются в скобках через запятую: class SomeClass(ParentClass1, ParentClass2, …): # поля и методы класса SomeClass Свойства классов устанавливаются с помощью простого присваивания: class SomeClass(object): attr1 = 42 attr2 = "Hello, World" Методы объявляются как простые функции: class SomeClass(object): def method1(self, x): # код метода Обратите внимание на первый аргумент – self – общепринятое имя для ссылки на объект, в контексте которого вызывается метод. Этот параметр обязателен и отличает метод класса от обычной функции. Все пользовательские атрибуты сохраняются в атрибуте __dict__, который является словарем. Экземпляры классов Инстанцировать класс в Python тоже очень просто: class SomeClass(object): attr1 = 42 def method1(self, x): return 2*x obj = SomeClass() obj.method1(6) # 12 obj.attr1 # 42 Можно создавать разные инстансы одного класса с заранее заданными параметрами с помощью инициализатора (специальный метод __init__). Для примера возьмем класс Point (точка пространства), объекты которого должны иметь определенные координаты: class Point(object): def __init__(self, x, y, z): self.coord = (x, y, z) p = Point(13, 14, 15) p.coord # (13, 14, 15) Можно обойтись даже без определения атрибутов и методов: class SomeClass(object): pass Классы в Python могут динамически изменяться после определения: class SomeClass(object): pass def squareMethod(self, x): return x*x SomeClass.square = squareMethod obj = SomeClass() obj.square(5) # 25 Статические и классовые методы Для создания статических методов в Python предназначен декоратор @staticmethod. У них нет обязательных параметров-ссылок вроде self. Доступ к таким методам можно получить как из экземпляра класса, так и из самого класса: class SomeClass(object): @staticmethod def hello(): print("Hello, world") SomeClass.hello() # Hello, world obj = SomeClass() obj.hello() # Hello, world Еще есть так называемые методы классов. Они аналогичны методам экземпляров, но выполняются не в контексте объекта, а в контексте самого класса (классы – это тоже объекты). Такие методы создаются с помощью декоратора @classmethod и требуют обязательную ссылку на класс (cls). class SomeClass(object): @classmethod def hello(cls): print('Hello, класс {}'.format(cls.__name__)) SomeClass.hello() # Hello, класс SomeClass Жизненный цикл объекта Ещё есть еще и метод __new__, который непосредственно создает новый экземпляр класса. Первым параметром он принимает ссылку на сам класс: class SomeClass(object): def __new__(cls): print("new") return super(SomeClass, cls).__new__(cls) def __init__(self): print("init") obj = SomeClass(); # new # init Метод __new__ может быть очень полезен для решения ряда задач, например. class Singleton(object): obj = None # единственный экземпляр класса def __new__(cls, *args, **kwargs): if cls.obj is None: cls.obj = object.__new__(cls, *args, **kwargs) return cls.obj single = Singleton() single.attr = 42 newSingle = Singleton() newSingle.attr # 42 newSingle is single # true В Python вы можете поучаствовать не только в создании объекта, но и в его удалении. Специально для этого предназначен метод-деструктор __del__. class SomeClass(object): def __init__(self, name): self.name = name def __del__(self): print('удаляется объект {} класса SomeClass'.format(self.name)) obj = SomeClass("John"); del obj # удаляется объект John класса SomeClass На практике деструктор используется редко, в основном для тех ресурсов, которые требуют явного освобождения памяти при удалении объекта. Не следует совершать в нем сложные вычисления. Объект как функция Объект класса может имитировать стандартную функцию, то есть при желании его можно "вызвать" с параметрами. За эту возможность отвечает специальный метод __call__: class Multiplier: def __call__(self, x, y): return x*y multiply = Multiplier() multiply(19, 19) # 361 # то же самое multiply.__call__(19, 19) # 361 Можно работать с объектом как с коллекцией значений, определив для него интерфейс классического списка с помощью специальных методов: __getItem__ – реализация синтаксиса obj[key], получение значения по ключу; __setItem__ – установка значения для ключа; __delItem__ – удаление значения; __contains__ – проверка наличия значения. Принципы ООП на Python Все объекты в Python инкапсулируют внутри себя данные и методы работы с ними, предоставляя публичные интерфейсы для взаимодействия. Атрибут может быть объявлен приватным (внутренним) с помощью нижнего подчеркивания перед именем, но настоящего скрытия на самом деле не происходит – все на уровне соглашений. class SomeClass: def _private(self): print("Это внутренний метод объекта") obj = SomeClass() obj._private() # это внутренний метод объекта Если поставить перед именем атрибута два подчеркивания, к нему нельзя будет обратиться напрямую. Но все равно остается обходной путь: class SomeClass(): def __init__(self): self.__param = 42 # защищенный атрибут obj = SomeClass() obj.__param # AttributeError: 'SomeClass' object has no attribute '__param' obj._SomeClass__param # 42 Специальные свойства и методы класса, некоторые из которых вам уже знакомы, имеют двойные подчеркивания до и после имени. Кроме прямого доступа к атрибутам (obj.attrName), могут быть использованы специальные методы доступа (геттеры, сеттеры и деструкторы): class SomeClass(): def __init__(self, value): self._value = value def getvalue(self): # получение значения атрибута return self._value def setvalue(self, value): # установка значения атрибута self._value = value def delvalue(self): # удаление атрибута del self._value value = property(getvalue, setvalue, delvalue, "Свойство value") obj = SomeClass(42) print(obj.value) obj.value = 43 Такой подход очень удобен, если получение или установка значения атрибута требует сложной логики. Вместо того чтобы вручную создавать геттеры и сеттеры для каждого атрибута, можно перегрузить встроенные методы __getattr__, __setattr__ и __delattr__. Например, так можно перехватить обращение к свойствам и методам, которых в объекте не существует: class SomeClass(): attr1 = 42 def __getattr__(self, attr): return attr.upper() obj = SomeClass() obj.attr1 # 42 obj.attr2 # ATTR2 __getattribute__ перехватывает все обращения (в том числе и к существующим атрибутам): class SomeClass(): attr1 = 42 def __getattribute__(self, attr): return attr.upper() obj = SomeClass() obj.attr1 # ATTR1 obj.attr2 # ATTR2 Наследование Язык программирования Python реализует как стандартное одиночное наследование: class Mammal(): className = 'Mammal' class Dog(Mammal): species = 'Canis lupus' dog = Dog() dog.className # Mammal так и множественное: class Horse(): isHorse = True class Donkey(): isDonkey = True class Mule(Horse, Donkey): mule = Mule() mule.isHorse # True mule.isDonkey # True Полиморфизм Концепция полиморфизма – важная часть ООП на Python. Все методы в языке изначально виртуальные. Это значит, что дочерние классы могут их переопределять и решать одну и ту же задачу разными путями, а конкретная реализация будет выбрана только во время исполнения программы. class Mammal: def move(self): print('Двигается') class Hare(Mammal): def move(self): print('Прыгает') animal = Mammal() animal.move() # Двигается hare = Hare() hare.move() # Прыгает Впрочем, можно получить и доступ к методам класса-предка либо по прямому обращению, class Parent(): def __init__(self): print('Parent init') def method(self): print('Parent method') class Child(Parent): def __init__(self): Parent.__init__(self) def method(self): super(Child, self).method() child = Child() # Parent init child. method() # Parent method Одинаковый интерфейс с разной реализацией могут иметь и классы, не связанные родственными узами. В следующем примере код может одинаково удобно работать с классами English и French, так как они обладают одинаковым интерфейсом: class English: def greeting(self): print ("Hello") class French: def greeting(self): print ("Bonjour") def intro(language): language.greeting() john = English() gerard = French() intro(john) # Hello intro(gerard) # Bonjour |