Главная страница

конспекты по информатике. Конспект Антропова. Конспект Антропова


Скачать 83.04 Kb.
НазваниеКонспект Антропова
Анкорконспекты по информатике
Дата27.12.2021
Размер83.04 Kb.
Формат файлаdocx
Имя файлаКонспект Антропова.docx
ТипКонспект
#319451

Конспект Антропова:

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

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

Есть еще несколько важных понятий, которые нужно знать:

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

Единоразовое выполнение – это итерация

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 "", line 1, in

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 "", line 1, in

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


написать администратору сайта