You are on page 1of 30

1.

1 Загальні питання
1) Трансляторы – это программы, устройства, переводящие информацию с языка понятного
человеку, на язык, понятный устройству.
Трансляторы бывают 2-х типов: компиляторы и интерпретаторы.
Интерпретатор последовательно читает предложение, переводит их на машинный язык и
выполняет.
Компиляторы переводят весь текст в машинный код, который в дальнейшем может быть
запущен на выполнение.
Компиляторы можно поделить на 2 вида: классический и кросплатфорные.
Результат компилятора – это exe файл. И может быть запущен в рамках ОС.
Кросплатфорные компиляторы переводят текст программы в некоторое промежуточное не
привязанное к компьютеру код программы (промежуточный код). Современные
компиляторы – это смесь классического и кросплатфорного принципа.

2) Любой язык программирования состоит из трех частей:

● Алфавит.

● Синтаксис.

● Семантика

Алфавит языка определяет перечень символов, которые допустимо использовать в


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

3) Паради́гма програмува́ння — це система ідей і понять, які визначають стиль


написання комп'ютерних програм, а також спосіб мислення програміста.
Парадигма програмування — спосіб концептуалізації, що визначає
організацію обчислень і структурування роботи, яку виконує комп'ютер[1].
Об'єктно-орієнтоване програмування (ООП; іноді об'єктозорієнто́ване
програмува́ння, об'єктоорієнто́ване програмува́ння) — одна з парадигм програмування, яка
розглядає програму як множину «об'єктів», що взаємодіють між собою. Основу ООП
складають чотири основні концепції: інкапсуляція, успадкування, поліморфізм та
абстракція. 
Основними серед існуючих парадигм програмування вважаються наступні:

 імперативне програмування;
 об'єктно-орієнтоване програмування;
 декларативне програмування.

4) Об'єкт в об'єктно-орієнтованому програмуванні (ООП) — ключове поняття об'єктно-


орієнтованих технологій проектування та програмування; втілення абстрактної
моделі окремої сутності (предмету або поняття), що має чітко виражене функціональне
призначення в деякій області, належить до визначеного класу та характеризується своїми
властивостями та поведінкою. Об'єкти є базовими елементами побудови програми —
програма в ООП розглядається як сукупність об'єктів, що знаходяться у визначених
відношеннях та обмінюються повідомленнями.

В об'єктно-орієнтованому програмуванні, клас — це спеціальна конструкція, яка


використовується для групування пов'язаних змінних та функцій. При цьому, згідно з
термінологією ООП, глобальні змінні класу (члени-змінні) називаються полями
даних(також властивостями або атрибутами), а члени-функції називають методами класу.
Створений та ініціалізований екземпляр класу називають об'єктом класу. На основі одного
класу можна створити безліч об'єктів, що відрізнятимуться один від одного
своїм станом (значеннями полів).

5) У об’єктно-орієнтованому програмуванні існують таки зв’язки між класами:


 агрегація та композиція
 асоціація
 спадкування
Спадкування класів – це дуже потужна можливість, яка дозволяє створювати похідні класи.
Один клас може успадковувати властивості та характеристики іншого класу. При цьому клас
який успадковує ці властивості називається дочірнім (похідним), а клас, який саме містить ці
властивості – батьківським (базовим). Таким чином буде зекономлено маса часу на
написання та налагодження коду нової програми. Об'єкти похідного класу вільно можуть
використовувати все, що створено і налагоджено в базовому класі. При цьому, є можливість
в похідний клас дописати необхідний код для удосконалення програми: додати нові
елементи, методи тощо. Базовий клас залишиться недоторканим.

Іншим основним видом відносин між класами та об'єктами є агрегація. Вона означає, що
один клас містить в собі агрегати (складових частин, підсистем) інших класів. Так
автомобіль складається з кузова, двигуна, трансмісії і т.п., а до складу приймально-
передавального пристрою входять передавач, приймач і антенно-фідерний пристрій.

Композиція є ще одним ставленням, родинною агрегації. Але якщо в агрегації агрегати


належать класу чи об'єкту, то в композиції існує більш слабкий зв'язок. Так, студенти з вузом
перебувають у відношенні композиції, тоді як факультети, які входять до складу вузу (тобто
є його невід'ємною частиною або агрегатами), пов'язані з нею відношенням агрегації.

Агрегація та композиція є підкласами класу відносин асоціації.


Если объекты одного класса ссылаются на один или более объектов другого класса, но ни в
ту, ни в другую сторону отношение между объектами не носит характера "владения", или
контейнеризации, такое отношение называют ассоциацией (association).

6) Иерархия класса состоит из одного базового и одного производного класса

7) Метаклассы – это классы, экземпляры которых являются классами. Если говорить в двух
словах, то метакласс – это «штуковина», создающая классы. Чтобы создавать объекты, мы
определяем классы, правильно? Но мы узнали, что классы в Python являются объектами. На
самом деле метаклассы – это то, что создает данные объекты. Довольно сложно объяснить.
Лучше приведем пример:

1 MyClass = MetaClass()
2 my_object = MyClass()
8) Три властивості характеризують об'єкти:

1. Унікальність: властивість об'єкта, яка відрізняє його від інших об'єктів.


2. Стан: описує дані, що зберігаються в об'єкті.
3. Поведінка: описує методи в інтерфейсі, через які може використовуватись об'єкт.
9) Поліморфізм – властивість, яка дозволяє одне і те саме ім’я використовувати для
вирішення декількох технічно різних задач, тобто основною метою поліморфізму є
використання одного імені для задання загальних класу дій. На практиці це значить
спроможність об’єктів вибирати внутрішній метод або процедуру, виходячи із типу даних,
прийнятих в повідомленні.
Приклад, об’єкт з імям “print” отримує повідомлення в якому виконуються дії по друку таких
типів данних, як двійкове ціле число, двійкове число з плаваючою комою і символьний
рядок. В залежності від того типу даних, які працюють в команді буде підібраний тип
(даних) формату для друку.
Перевагою поліморфізму є те, що:
- він допомагає зменшити складність програм
- дозволяє використання одного інтерфейсу для єдиного класу дій
а вибір конкретної дії передається компілятору. Таким чином, поліморфізм означає
присвоювання певній дії одної дії або позначення, яке спільно використовується об’єктами
різних типів. При цьому кожний об’єкт реалізує дії способом, що відповідає його типу.
10) Інкапсуляція – механізм, який поєднує дані та методи, що обробляють ці дані і захищає
і те і інше від зовнішнього впливу або не вірного використання. Коли і методи і данні
об’єднуються таким чином — створюється об’єкт.
В середині об’єкта дані і методи можуть мати різні ступені відкритості. Як правило відкриті
члени класу використ. Для того, що б забезпечити інтерфейс, що контролюється з його
закритою частиною.

11)    Успадкування. Процес визначення класу на основі іншого класу. На новий (дочірній)


клас за замовчуванням поширюються всі визначення змінних екземпляра і методів із старого
(батьківського) класу, але можуть бути також визначені нові компоненти або
«перевизначені» визначення батьківських функцій і дано нові визначення. Прийнято
вважати, що клас А успадковує свої визначення від класу В, якщо клас А визначений на
основі класу В зазначеним способом.

12) Тем , что в Пайтоне отсутствует принцип инкапсуляции на деле. А так разница
заключается в :

13) Рекурсией называется такой способ организации обработки данных, при котором


программа (или функция) вызывает сама себя или непосредственно, или из других программ
(функций).Функция называется рекурсивной, если во время ее обработки возникает ее
повторный вызов, либо непосредственно, либо косвенно, путем цепочки вызовов других
функций.
Итерацией называется такой способ организации обработки данных, при котором некоторые
действия многократно повторяются, не приводя при этом к рекурсивным вызовам программ
(функций).

Рекурсию часто сравнивают с итерацией. Организация циклического процесса с помощью


рекурсии имеет свои преимущества и недостатки.

Можно выделить следующие взаимосвязанные преимущества рекурсии:


 естественность (натуральность) представления сложных, на первый взгляд,
алгоритмов;
 рекурсивный алгоритм более читабелен в сравнении с итерационным;
 для многих распространенных задач рекурсию более легко реализовать чем итерацию.
Рекурсия хорошо подходит для реализации алгоритмов обхода списков, деревьев,
анализаторов выражений, комбинаторных задач и т.д.
Недостатки рекурсии состоят в следующем:
 по сравнению с итерацией многоразовый вызов рекурсивной функции требует больше
времени. Это связано с тем, что при вызове рекурсивного метода его параметры
копируются в стек. При завершении вызова рекурсивной функции предыдущие значения
параметров вытягиваются из стека, что приводит к лишним операциям. Итерационный
алгоритм для той же задачи работает быстрее;
 если рекурсивная функция содержит большие объемы локальных внутренних
переменных и большое количество параметров, то использование рекурсии не является
эффективным. Это связано с тем, что для каждого рекурсивного вызова нужно делать
копии этих переменных и параметров. При большом количестве рекурсивных вызовов это
приведет к чрезмерному использованию памяти.

14) Алгоритм - это точное предписание, определяющее процесс перехода от исходных


данных к результату.
Основными свойствами алгоритмов являются:

 детерминированность (определенность). Предполагает получение однозначного


результата вычислительного процecca при заданных исходных данных. Благодаря
этому свойству процесс выполнения алгоритма носит механический характер;
 результативность. Указывает на наличие таких исходных данных, для которых
реализуемый по заданному алгоритму вычислительный процесс должен через
конечное число шагов остановиться и выдать искомый результат;
 массовость. Это свойство предполагает, что алгоритм должен быть пригоден для
решения всех задач данного типа;
 дискретность. Означает расчлененность определяемого алгоритмом вычислительного
процесса на отдельные этапы, возможность выполнения которых исполнителем
(компьютером) не вызывает сомнений;
 конечность. Каждое из действий и весь алгоритм в целом обязательно завершаются.

Программа – это алгоритм , записанный на языке программирования.

15) Синтаксический анализ, парсинг - это процесс сопоставления линейной


последовательности лексем (слов, фраз) языка с его формальной грамматикой. Результатом
обычно является дерево разбора (синтаксическое дерево). Обычно применяется совместно с
лексическим анализом. Синтаксический анализатор (парсер) - это программа или часть
программы, выполняющая синтаксический анализ, то есть распознавание входной
информации. При этом входные данные преобразуются к виду, пригодному для дальнейшей
обработки. Этот вид обычно представляет собой формальную модель входной информации
на языке последующего процесса обработки информации.

Семантический анализ является центральной фазой трансляции, связывающей 2 ее логические


части: анализ исходной программы и синтез объектной программы. На этапе семантического
анализа обрабатываются программные конструкции, распознанные синтаксическим анализатором. 

16) Примитивные типы данных – это базовые типы данных языка программирования. Их
ключевая особенность в том, что данные в них, в отличие от ссылочных типов,
располагаются непосредственно [“в переменной”.] на участке памяти компьютера в котором
находится переменная. Перечислим и опишем основные примитивные типы данных в
программировании.
Типы данных в Python
В Python типы данных можно разделить на встроенные в интерпретатор (built-in) и не
встроенные, которые можно использовать при импортировании соответствующих модулей.
К основным встроенным типам относятся:
None (неопределенное значение переменной)
Логические переменные (Boolean Type)
Числа (Numeric Type)
 int – целое число
 float – число с плавающей точкой
 complex – комплексное число
Списки (Sequence Type)
 list – список
 tuple – кортеж
 range – диапазон
Строки (Text Sequence Type )
 str
Бинарные списки (Binary Sequence Types)
 bytes – байты
 bytearray – массивы байт
 memoryview – специальные объекты для доступа к внутренним данным
объекта через protocol buffer
Множества (Set Types)
 set – множество
 frozenset – неизменяемое множество
Словари (Mapping Types)
 dict – словарь

Приведе́ние (преобразование) ти́па — в информатике преобразование значения


одного типа в значение другого типа.
Выделяют приведения типов:

 явные
 неявные
Явное приведение задаётся программистом в тексте программы с помощью:

 конструкции языка;
 функции, принимающей значение одного типа и возвращающей значение другого
типа.
Неявное приведение выполняется транслятором (компилятором или интерпретатором) по
правилам, описанным в стандарте языка. Стандарты большинства языков запрещают
неявные преобразования.
1.2 Python

1) Інтегроване середовище розробки (ІСР, англ. Integrated development environmentабо англ. IDE) —


комплексне програмне рішення для розробки програмного забезпечення. Зазвичай, складається з
редактора початкового коду, інструментів для автоматизації складання та відлагодження
програм. Більшість сучасних середовищ розробки мають можливість автодоповнення коду.
Модулі та пакети

Програмне забезпечення (застосунок або бібліотека) на Python оформлюється у вигляді модулів, які у


свою чергу можуть бути зібрані в пакунки. Модулі можуть розташовуватися як у каталогах, так і в ZIP-
архівах. Модулі можуть бути двох типів за своїм походженням: модулі, написані на «чистому» Python,
і модулі розширення (extension modules), написані на інших мовах програмування. Наприклад, в
стандартній бібліотеці є «чистий» модуль pickle і його аналог на Сі: cPickle. Модуль оформляється у
вигляді окремого файлу, а пакет — у вигляді окремого каталогу. Підключення модуля до програми
здійснюється оператором  import . Після імпорту модуль представлений окремим об'єктом, що дає
доступ до простору імен модуля. У ході виконання програми модуль можна перезавантажити
функцією  reload() .

Anaсonda это:

Включает предустановленный Python 2.7 , 3.4. 3.5

+-150 предустановленных библиотек, и более 200-300 готовых к «легкой» установке библиотек


командой conda install name_lib

Включает в себя IDLE Spider 2

Conda бывает в двух версиях:

Анаконда — более 150 предустановленных пакетов (около 3 Гб) + более 250 пакетов, готовых к
установке командой conda install package_name

Миниконда — более 400 пакетов, готовых к установке командой conda install package_name

Spyder является частью модуля spyderlib для Python, основанного на PyQt4, pyflakes, rope и Sphinx,
предоставляющего мощные виджеты на PyQt4, такие как редактор кода, консоль Python
(встраиваемая в приложения), графический редактор переменных (в том числе списков, словарей и
массивов).

2.

Юнікод знімає старе обмеження на кодування символів лише одним байтом. Натомість
використовується 17 просторів, кожен з яких визначає 65,536 кодів і дає можливість описати
максимум 1 114 112 (17 * 216) різних символів. Basic Multilingual Plane (BMP) — Основна Багатомовна
Площина містить майже всі символи, які ви будете коли-небудь використовувати.
UTF-8 є системою кодування зі змінною довжиною кодування символів. Це означає, що для
кодування символів він використовує від 1 до 4 байт на символ. Так, перший байт UTF-8 можна
використовувати для кодування ASCII, що дає повну сумісність з кодами ASCII. Перекодування
кодів ASCII у кодах UTF-8 для латинських символів не збільшить розмір даних, бо для цього
використовується тільки один байт на символ. Для символів інших мов, де, наприклад, для кодування
треба використовувати два байти на символ, це кодування збільшує розмір даних на, приблизно,
50 % або більше.

3.

Іменування ідентифікаторів

Змінні є прикладом ідентифікаторів. В свою чергу ідентифікатори це імена які на щось вказують
(ідентифікують). Існують певні правила яким ти повинен слідувати при іменуванні ідентифікаторів:

1) Першим символом ідентифікатора має бути літера (символ з набору ASCII або Unicode-символ.
Байдуже у якому регістрі.) чи знак нижнього підкреслювання (underscore) — '_'.

2) Решта ідентифікатору може складатися з літер, чисел, або знаків нижнього підкреслювання.

3) Імена ідентифікаторів чутливі до регістру символів. Наприклад, myname і myName це не одне й теж
саме (це різні змінні).

4) Прикладом правильних імен ідентифікаторів є i, __my_name, name_23, a1b2_c3 і


resumÃÆâ€TMƒÂ©_count.

5) Приклад неправильних імен ідентифікаторів: 2things, this is spaced out, my-name,


"this_is_in_quotes".

4.

Python має багато вбудованих типів даних. Ось деякі найважливіші:

(Числа (Numbers)

Строка (String)

Список (List)

Кортеж (Tuple)

Словарь (Dictionary)

Сет (Set))

http://pythonicway.com/python-data-types

Логічні (Булеві) змінні приймають значеня  True  або  False .

Числа можуть бути цілими (1 і 2), з десятковими дробами (1.1 і 1.2), звичайними дробами (1/2 and
2/3), чи навіть комплексними.

Рядки є послідовностями символів Юнікоду (наприклад HTML документ)

Байти та масиви байтів (наприклад зображення в форматі JPEG)

Списки є впорядкованими послідовностями значень.

Кортежі є впорядкованими незмінними послідовностями значень.


Множини є невпорядкованими наборами значень.

Словники є невпорядкованими наборами пар ключ-значення.

Звичайно існує ще багато типів крім вищеперелічених. В Python все - об’єкт, тому є такі типи
як модуль, функція, клас, метод, файл і навіть відкомпільований код. Ви вже зустрічались з деякими
з них: модулі мали імена, функції мали докстрінґи. Ви дізнаєтесь про класи в розділі Класи та
ітератори, і про файли в розділі Файли.

Кортеж - це незмінюваний список. Він завжди залишається таким, яким його створили.

5.

Булевий тип
У булевому контексті можна використовувати фактично будь-які вирази

Булеві змінні приймають лише істинне чи хибне значення. Python має для цих значень дві відповідні
константи:  True та  False , які можна використовувати для присвоєння значень змінним. Окрім
констант, булеві значення можуть приймати вирази. А в деяких місцях (наприклад, в операторі  if )
Python навіть очікує того, що значення виразу можна буде привести до булевого типу. Такі місця
називаються булевими контекстами. Ви можете використати майже будь-який вираз в булевому
контексті, і Python намагатиметься визначити його істинність. Різні типи даних мають різні правила
щодо того, які значення є істинними, а які - хибними в булевому контексті. 

Числа
Числа класні. Їх так багато, що кожен зможе вибрати собі до вподоби скільки схоче. Python підтримує
як цілі, так і дробові числа. Вказувати тип числа явно не потрібно, Python сам визначить його за
наявністю чи відсутністю десяткової крапки.

Списки
Списки - це робоча кобилка мови Python. Коли я кажу "список", ви можете подумати "масив, розмір
якого я повинен задати наперед і який мусить містити елементи одного типу і т.д.". Не думайте так.
Списки набагато крутіші за масиви.

☞Список у Python - це як масив у Perl 5. У Perl 5 змінні, які містять масиви, завжди починаються з
символу  @ . У Python змінні можна називати як завгодно, а Python сам визначить тип.

☞Список у Python - це набагато більше, ніж масив в Java (хоча й може використовуватись як такий,
якщо це все, що вам потрібно від життя). Кращим аналогом міг би бути клас  ArrayList , який може
містити довільні об’єкти і динамічно розширюватись при додаванні нових елементів.

Кортежі
Кортеж - це незмінюваний список. Він завжди залишається таким, яким його створили.

Кортежі працюють швидше, ніж списки. Якщо вам потрібен незмінний набір значень і все що ви
будете робити - ітерувати по ньому, то використовуйте кортеж замість списку.

Ваш код стане безпечнішим, якщо ви захистите від запису дані, які не мусять змінюватись.

Деякі кортежі можуть використовуватись як ключі в словнику (кажучи конкретно - кортежі, які містять
лише незмінні елементи, тобто числа, рядки чи інші кортежі). Списки ніколи не можна
використовувати як ключі словника, тому що списки можуть змінюватись.
☞Кортежі можна перетворювати в списки, і навпаки. Вбудована функція  tuple()  отримує список і
повертає кортеж з такими ж елементами, а функція  list()  отримує кортеж і повертає
список.  tuple()  ніби "заморожує" список, а  list() "розморожує" кортеж.

Множини
Множини - це "сумки" з невпорядкованими унікальними значеннями. Множина може містити
значення будь-якого незмінюваного типу. Якщо маєте дві множини, то можете здійснювати над ними
звичні операції над множинами: об’єднання, перетин і різницю.

Словники
Словники - це невпорядковані набори пар "ключ - значення". Коли ви додаєте до словника новий
ключ, завжди також повинні додати туди і значення (яке можна буде змінити пізніше). Вони
оптимізовані для отримання значення, якщо ви знаєте відповідний ключ, але ніяк не навпаки.

☞Словник у Python - це як Perl 5. У Perl 5 змінні, що зберігають хеші, завжди починаються з


символу  % . У мові Python змінні можна називати довільним чином, Python запам’ятає їхній тип
самостійно.

None

None  - спеціальна константа мови Python. Це значення, що позначає відсутність значення.  None  - це
не те ж саме що й  False .  None  не  0 . При порівнянні з  None будь-що, окрім  None , завжди
поверне  False .

None  - єдине значення свого власного типу  NoneType . Ви можете присвоїти значення  None  будь-
яку змінну, але не можете створити інші об'єкти класу  NoneType . Всі змінні зі
значенням  None  дорівнюють одна одній.

6.

Змі́нна (англ. variable) — об'єкт програми, що має ім'я та значення.

В більшості мов програмування змінна характеризується певним типом, що дозволяє конкретизувати


поведінку програми з такою змінною, а в окремих мовах — класом пам'яті, який визначає місце в
пам'яті та час існування змінної. Зокрема у мовах програмування з жорстким контролем типів можна
визначати однойменні процедури та функції для різних аргументів різних типів.

В пітоні все виступає об’єктами

7.

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

Под термином область видимости подразумевается пространство имен для конкретного


идентификатора (имени).

В языке Python область видимости тесно связана с операциями присваивания.

Имена появляются в тот момент, когда им впервые присваиваются некоторые значения, и прежде
чем имена смогут быть использованы, им необходимо присвоить значения. Поскольку имена не
объявляются заранее, интерпретатор Python по местоположению операции присваивания
связывает имя с конкретным пространством имен. Место, где выполняется присваивание,
определяет пространство имен, в котором будет находиться имя, а следовательно, и область его
видимости.

По умолчанию все имена, значения которым присваиваются внутри функции, ассоциируются с


пространством имен этой функции. Это означает, что:

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

Имена, определяемые внутри инструкции def, не вступают в конфликт с именами, находящимися за


пределами инструкции def, даже если и там и там присутствуют одинаковые имена. Имя X, которому
присвоено значение за пределами данной инструкции def (например, в другой инструкции def или на
верхнем уровне модуля), полностью отлично от имени X, которому присвоено значение внутри
инструкции def.

В любом случае область видимости переменной (где она может использоваться) всегда


определяется местом, где ей было присвоено значение, и никакого отношения не имеет к месту,
откуда была вызвана функция или осуществлена операция изменения объекта.

Значения переменным могут быть присвоены в трех разных местах, соответствующих трем разным
областям видимости:

Если присваивание переменной выполняется внутри инструкции def, переменная


является локальной для этой функции.

Если присваивание производится в пределах объемлющей инструкции def, переменная


является нелокальной для этой функции.

Если присваивание производится за пределами всех инструкций def, она является глобальной для


всего файла.

Порядок сопоставления имен:

локальные

нелокальные (внутри объемлющей инструкции def)

глобальные (в пространстве имен модуля)

встроенные (предопределенные имена в модуле builtins)

Простір імен (namespace) — це іменована область пам’яті, що служить для оголошення унікальних


ідентифікаторів. Використання простору імен дає змогу обмежити доступ до логічно згрупуваних
оголошень.

Простори імен слугують для розв'язання конфліктів імен у модульних програмах, що складаються з
декількох файлів.

8.

Присвоение значения переменной:

В Python вам не нужно объявлять тип переменной вручную (как, например в С++). Объявление
происходит автоматически (это называется динамическая типизация), когда вы присваиваете
значение переменной. Знак равенства ( = ) используется для присвоения значения переменной.

Операнд по левую сторону от знака равно ( = ) это имя переменной, операнд по правую сторону -
значение присвоенное этой переменной.

Например:
?
1 country = "Swiss" # Присвоить значение Swiss переменной под названием country
2 age = 23 # Присвоение значения 23 переменной age
3 print country
4 print age
При выполнении, данный код выведет:

1 Swiss
2 23
Множественное присвоение значений:

В Python возможно присваивать одно значение нескольким переменным сразу. Например:

?
1 a=b=c=1
В данном создается объект со значением 1, и все 3 переменные указывают на область в памяти, в
которой он находится.

9.

Просто створюемо змінну , задам значення , якщо потрібно вивести її просто звертаємося до неї

Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким


образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в
строку слева от него:

string % value

Такой способ форматирования считается старым видимо потому, что заимствован из функции printf()
языка C, а в Python кроме него появились более продвинутые средства форматирования вывода.
Однако в ряде случаев использование оператора % бывает удобнее, чем использование строкового
метода format().

Следует отметить, что форматируются строки, а не вывод. На вывод передается уже сформированная
строка.

Строковый метод format() возвращает отформатированную версию строки, заменяя идентификаторы


в фигурных скобках. Идентификаторы могут быть позиционными, числовыми индексами, ключами
словарей, именами переменных.

Аргументов в format() может быть больше, чем идентификаторов в строке. В таком случае
оставшиеся игнорируются.

Идентификаторы могут быть либо индексами аргументов, либо ключами:

10.

Функции – это многократно используемые фрагменты программы. Они позволяют дать имя
определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в
любом месте программы и сколь угодно много раз.
def sayHello():

print('Привет, Мир!') # блок, принадлежащий функции

# Конец функции

sayHello() # вызов функции

sayHello() # ещё один вызов функции

Эта lambda-функция делает то же самое, что и обычная функция, определенная выше. Обратите


внимание на сокращенный синтаксис: список аргументов записывается без скобок и ключевое
слово return отсутствует (оно подразумевается, так как тело функции может содержать только одно
выражение). Кроме того, функция не имеет имени, но может быть вызвана через переменную,
которой она присвоена.

Вы можете использовать lambda-функцию даже не присваивая ее переменной. Это не самый


полезный пример, но он показывает, что lambda-функция может быть определена прямо в месте ее
использования.

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

square_rt = lambda x: math.sqrt(x)


Основную часть возможностей Python, которые демонстрирует лямбда можно увидеть в обратных
вызовах Tkinter

Синтаксический сахар

11.

В Python параметр *args используется для передачи списка аргументов переменной длины без
указания ключевого слова. Стоит отметить, что звездочка (*) является важным элементом параметра,
так как слово args – установленная условная идиома.
Параметр **kwargs передаёт функции словарь аргументов переменной длины с ключевым словом.
Примечание: Опять же, звездочки (**) важны, поскольку без них kwargs используется в
документации.
Как и *args, **kwargs может принимать любое количество аргументов. Однако **kwargs отличается
от *args тем, что требует присваивать ключевое слово.

12. Генераторы и итераторы представляют собой инструменты, которые, как правило,


используются для поточной обработки данных. В уроке рассмотрим концепцию итераторов
в Python, научимся создавать свои итераторы и разберемся как работать с генераторами.
Итераторы в языке Python
Во многих современных языках программирования используют такие сущности как итераторы.
Основное их назначение – это упрощение навигации по элементам объекта, который, как
правило, представляет собой некоторую коллекцию (список, словарь и т.п.). Язык Python, в этом
случае, не исключение и в нем тоже есть поддержка итераторов. Итератор представляет собой
объект перечислитель, который для данного объекта выдает следующий элемент, либо бросает
исключение, если элементов больше нет.
Основное место использования итераторов – это цикл for. Если вы перебираете элементы в
некотором списке или символы в строке с помощью цикла for, то ,фактически, это означает, что
при каждой итерации цикла происходит обращение к итератору, содержащемуся в строке/списке,
с требованием выдать следующий элемент, если элементов в объекте больше нет, то итератор
генерирует исключение, обрабатываемое в рамках цикла for незаметно для пользователя.
Приведем несколько примеров, которые помогут лучше понять эту концепцию. Для начала
выведем элементы произвольного списка на экран.
>>> num_list = [1, 2, 3, 4, 5]
>>> for i in num_list:
print(i)
1
2
3
4
5
Как уже было сказано, объекты, элементы которых можно перебирать в цикле for, содержат в
себе объект итератор, для того, чтобы его получить необходимо использовать функцию iter(), а
для извлечения следующего элемента из итератора – функцию next().
>>> itr = iter(num_list)
>>> print(next(itr))
1
>>> print(next(itr))
2
>>> print(next(itr))
3
>>> print(next(itr))
4
>>> print(next(itr))
5
>>> print(next(itr))
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
print(next(itr))
StopIteration
Как видно из приведенного выше примера вызов функции next(itr) каждый раз возвращает
следующий элемент из списка, а когда эти элементы заканчиваются, генерируется
исключение StopIteration.
Создание собственных итераторов
Если нужно обойти элементы внутри объекта вашего собственного класса, необходимо
построить свой итератор. Создадим класс, объект которого будет итератором, выдающим
определенное количество единиц, которое пользователь задает при создании объекта. Такой
класс будет содержать конструктор, принимающий на вход количество единиц и
метод __next__(), без него экземпляры данного класса не будут итераторами.
class SimpleIterator:
def __init__(self, limit):
self.limit = limit
self.counter = 0

def __next__(self):
if self.counter < self.limit:
self.counter += 1
return 1
else:
raise StopIteration

s_iter1 = SimpleIterator(3)
print(next(s_iter1))
print(next(s_iter1))
print(next(s_iter1))
print(next(s_iter1))
В нашем примере при четвертом вызове функции next() будет выброшено
исключение StopIteration. Если мы хотим, чтобы с данным объектом можно было работать в
цикле for, то в класс SimpleIterator нужно добавить метод __iter__(), который возвращает
итератор, в данном случае этот метод должен возвращать self.
class SimpleIterator:
def __iter__(self):
return self

def __init__(self, limit):


self.limit = limit
self.counter = 0

def __next__(self):
if self.counter < self.limit:
self.counter += 1
return 1
else:
raise StopIteration

s_iter2 = SimpleIterator(5)
for i in s_iter2:
print(i)

Генераторы
Генераторы позволяют значительно упростить работу по конструированию итераторов. В
предыдущих примерах, для построения итератора и работы с ним, мы создавали отдельный
класс. Генератор – это функция, которая будучи вызванной в функции next() возвращает
следующий объект согласно алгоритму ее работы. Вместо ключевого слова return в генераторе
используется yield. Проще всего работу генератор посмотреть на примере. Напишем функцию,
которая генерирует необходимое нам количество единиц.
def simple_generator(val):
while val > 0:
val -= 1
yield 1

gen_iter = simple_generator(5)
print(next(gen_iter))
print(next(gen_iter))
print(next(gen_iter))
print(next(gen_iter))
print(next(gen_iter))
print(next(gen_iter))
Данная функция будет работать точно также, как класс SimpleIterator из предыдущего примера.
Ключевым моментом для понимания работы генераторов является то, при вызове yield функция
не прекращает свою работу, а “замораживается” до очередной итерации, запускаемой
функцией next(). Если вы в своем генераторе, где-то используете ключевое слово return, то
дойдя до этого места будет выброшено исключение StopIteration, а если после ключевого
слова return поместить какую-либо информацию, то она будет добавлена к
описанию StopIteration.

13 Списки в Python - упорядоченные изменяемые коллекции объектов произвольных типов


(почти как массив, но типы могут отличаться).
Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами.
Например, можно обработать любой итерируемый объект (например, строку) встроенной
функцией list:
>>>
>>> list('список')

['с', 'п', 'и', 'с', 'о', 'к']

Кортеж (tuple) в Python — это последовательность неизменяемых объектов. Кортежи очень


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

1 >>> tup1 =('physics','chemistry',1997,2000);

2 >>> tup2 =(1,2,3,4,5);

3 >>> tup3 ="a","b","c","d";

Пустой кортеж создаётся указанием пустых скобок:

1 >>> tup1 = ();

14 головою відміністю списка від масиву є те що в списках


можна зберігати данні різного типу , а в масиві лише одного
типу. Також в списку можна вставити ще один список. Щодо
зберігання у пам’яті , то слід зауважити що воа зберігаеться в
оперативій пам’яті виділяючи під себе певну кількість
комірок. Массив хранит свои элементы в смежных ячейках памяти.
Массив — это упорядоченный набор (коллекция) однотипных объектов, размещаемых
в едином блоке памяти последовательно друг за другом. Однотипные объекты, входящие в состав
массива, называют элементами массива. Каждому элементу массива соответствует порядковый номер
— индекс. Индексация элементов начинается с нуля: начальный (первый) элемент массива имеет
индекс 0, следующий за ним (второй) — индекс 1, следующий за вторым (третий) — индекс 2 и т. д.
Последний элемент массива из k элементов имеет индекс k  – 1.

Рис. 1. Массив из k элементов

Размещение элементов массива в едином блоке памяти является ключевой особенностью массивов.
Такое размещение позволяет максимально эффективно получать доступ к любому наперёд
заданному элементу массива. Действительно, зная адрес массива — номер ячейки памяти, начиная
с которой в ней последовательно располагаются элементы массива, иными словами, зная адрес
элемента с индексом 0, и учитывая, что все элементы массива в силу их однотипности занимают в
памяти одинаковое количество ячеек, можно легко получить адрес элемента с любым заданным
индексом i. Для этого достаточно i раз выполнить смещение от начала массива на количество ячеек,
занимаемое одним элементом или, что то же самое, выполнить смещение от начала массива на
количество ячеек, равное произведению индекса требуемого элемента на количество ячеек,
занимаемое одним элементом (см. рис. 1). Выполнение подобных смещений реализуется с помощью
арифметических операций над указателями.

15Модуль — це файл, що складається з описів функцій та інструкцій Пайтона. Назва


файла є назвою модуля, до якої додається розширення  .py . Всередині модуля його
назва доступна через значення глобальної змінної  __name__ . Ми імпортуємо (‘import’)
частинки з нього, або все що у ньому є, в інші програми, і використовуємо його змінні,
функції та класи.
Щоб імпортнути змінні, функції та класи наприклад з модуля ‘moduletest.py’ в іншу
програму, яку ми створюємо, ми використовуємо оператор ‘import’. Наприклад, щоб
імпортнути сам модуль ‘moduletest.py’, у нашу головну програму, ми використаємо
оператор ‘import’ наступним чином:
Python

1 # це головна програма наша - mainprogam.py

2 # імпортуємо інший модуль, під назвою moduletest

3 import moduletest

Вище наведений приклад працюватиме у випадку, якщо модуль ‘moduletest.py’


лежить у ті й же ж папочці, де ми маємо нашу основну програму (назвемо її
‘mainprogram.py’), або також, якщо цей модуль є дефолтним, вбудованим у саму
мову Пітон. 

16 C одной стороны, пакеты Python  —  это Py-приложения, дополнения или утилиты,


которые можно установить из внешнего репозитория: Github, Bitbucket, Google Code или
официального Python Package Index. На сервере пакеты хранятся в .zip и .tar архивах,
либо в дополнительной упаковке  —  «яйцах» (.egg,  старый формат)  или «колесах»
(.whl). В составе пакета, как правило, есть сценарий установки setup.py, который хранит
сведения о зависимостях —  других пакетах и модулях, без которых пакет работать не
будет.

С другой стороны, если речь об архитектуре Python-приложения, пакет —  это каталог,


внутри которого файл  __init__.py и, опционально, другие каталоги и файлы .py. Так
большую Python-программу разбивают на пакеты и модули. Модуль —  файл с
исходным кодом, который можно использовать в других приложениях: как «заготовку»
для будущих проектов или как часть библиотеки/фреймворка. Но к теме статьи это
прямого отношения не имеет, поэтому дальше мы будем говорить только о пакетах из
репозиториев.

Чтобы за секунды устанавливать пакеты со всеми зависимостями,


используют менеджер пакетов pip или модуль easy_install. В большинстве случаев
рекомендуется использовать pip. И только если у вас есть инфраструктура на пакетах
.egg, которые pip не открывает, нужен easy_install.

17) Типи алгоритмів


    Є 4-ри типи алгоритмів:
    -прості;
    -розгалужені;
    -циклічні;
    -універсальні;     
    Простими є такі команди: виконати, встати, іти, вміти тощо. Якщо алгоритм складається лише з
послідовності простих команд то його називають простим, або лінійним. Приклад: "Алгоритм Ранок":
    Встати о 6.30 годині. 
    Виконати гімн. вправи. 
    Умитися. 
    Поснідати. 
    Вийти з дому о 7.30 годині.

    Якщо в алгоритмі, окрім простих команд, є команда, яка містить умову, то такий алгоритм
називається розгалуженим. Умови в інформатиці називаються логічним виразом. Приклад: 

"Алгоритм Вечір":   

     Повернутися з коледжу додому після занять.

     Пообідати.Якщо погода хороша, то попрацювати в саду, інакше піти в бібліотеку, взяти книжку,
повернутися додому.

    Зробити домашнє завдання.

    Повечеряти.

    Якщо є цікава телепередача, то подивитися телевізор, інакше почитати книжку.

    Лягти спати.

    Циклічні алгоритми. Циклом називають процес повторення дій. Циклічні


алгоритми забезпечують повторне виконання деяких команд скінчену кількість разів. Приклад: 

    Алгоритм коледж

    Іти на першу пару.

    Доки не закінчилися заняття іти на наступну пару.

    Іти додому.

    Універсальні алгоритми – це такі які містять в собі вище перечисленні такі алгоритми.

20 Декоратор в Python – это функция, которая принимает другую функцию в качестве


аргумента. Декоратормодифицирует или повышает принятую функцию и выдает измененную. Это
значит, что когда вы вызываете декорированную функцию, вы получите функцию, которая может
иметь небольшие отличия, в виде дополнительных функций, совмещенных с базовым определением.
32 ) Функция property() возвращает специальный объект дескриптора :

>>> property()

<property object at 0x10ff07940>

Этот объект имеет дополнительные методы:

>>> property().getter

<built-in method getter of property object at 0x10ff07998>

>>> property().setter

<built-in method setter of property object at 0x10ff07940>

>>> property().deleter

<built-in method deleter of property object at 0x10ff07998>

Они также действуют как декораторы. Они возвращают новый объект свойства:

>>> property().getter(None)

<property object at 0x10ff079f0>

который является копией старого объекта, но с заменой одной из функций.

Помните, что синтаксис @decorator - это просто синтаксический сахар; синтаксис:

@property

def foo(self): return self._foo

действительно означает то же самое, что

def foo(self): return self._foo

foo = property(foo)

so foo функция заменяется на property(foo), что мы видели выше, это специальный


объект. Затем, когда вы используете @foo.setter(), то, что вы делаете, это вызов
метода property().setter, который я показал вам выше, который возвращает новую
копию свойства, но на этот раз с заменой функции setter на декорированный метод.

Следующая последовательность также создает свойство full-on, используя эти методы


декоратора.

Сначала мы создаем некоторые функции и объект property только с помощью getter:

>>> def getter(self): print 'Get!'

...

>>> def setter(self, value): print 'Set to {!r}!'.format(value)

...

>>> def deleter(self): print 'Delete!'

...
>>> prop = property(getter)

>>> prop.fget is getter

True

>>> prop.fset is None

True

>>> prop.fdel is None

True

Далее мы используем метод .setter() для добавления сеттера:

>>> prop = prop.setter(setter)

>>> prop.fget is getter

True

>>> prop.fset is setter

True

>>> prop.fdel is None

True

В последнее время мы добавляем дебетер с помощью метода .deleter():

>>> prop = prop.deleter(deleter)

>>> prop.fget is getter

True

>>> prop.fset is setter

True

>>> prop.fdel is deleter

True

И последнее, но не менее важное: объект property действует как объект дескриптора ,


поэтому он имеет .__get__(), .__set__() и .__delete__(), чтобы подключиться к атрибуту
экземпляра, получить, установить и удалить:

>>> class Foo(object): pass

...

>>> prop.__get__(Foo(), Foo)

Get!

>>> prop.__set__(Foo(), 'bar')

Set to 'bar'!

>>> prop.__delete__(Foo())
Delete!

В дескрипторе Howto используется чистая реализация образца python типа property():

class Property(object):
"Emulate PyProperty_Type() in Objects/descrobject.c"

def __init__(self, fget=None, fset=None, fdel=None, doc=None):


self.fget = fget
self.fset = fset
self.fdel = fdel
if doc is None and fget is not None:
doc = fget.__doc__
self.__doc__ = doc

def __get__(self, obj, objtype=None):


if obj is None:
return self
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(obj)

def __set__(self, obj, value):


if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)

def __delete__(self, obj):


if self.fdel is None:
raise AttributeError("can't delete attribute")
self.fdel(obj)

def getter(self, fget):


return type(self)(fget, self.fset, self.fdel, self.__doc__)

def setter(self, fset):


return type(self)(self.fget, fset, self.fdel, self.__doc__)

def deleter(self, fdel):


return type(self)(self.fget, self.fset, fdel, self.__doc__)

21 Инкапсуляция является фундаментальной концепцией объектно-ориентированного


программирования. Она предотвращает прямой доступ к атрибутам объект из
вызывающего кода.

Касательно инкапсуляции непосредственно в языке программирования Python скрыть


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

Изменим выше определенный класс, определив в нем свойства:

1 class Person:
2     def __init__(self, name):
3         self.__name = name      # устанавливаем имя
4         self.__age = 1          # устанавливаем возраст
5  
6     def set_age(self, age):
7         if age in range(1, 100):
8             self.__age = age
9         else:
10             print("Недопустимый возраст")
11  
12     def get_age(self):
13         return self.__age
14          
15     def get_name(self):
16         return self.__name
17  
18     def display_info(self):
19         print("Имя:", self.__name, "\tВозраст:", self.__age)
20          
21 tom = Person("Tom")
22  
23 tom.__age = 43              # Атрибут age не изменится
24 tom.display_info()          # Имя: Tom  Возраст: 1
25 tom.set_age(-3486)          # Недопустимый возраст
26 tom.set_age(25)
27 tom.display_info()          # Имя: Tom  Возраст: 25

Для создания приватного атрибута в начале его наименования ставится двойной


прочерк: self.__name. К такому атрибуту мы сможем обратиться только из того же класса.
Но не сможем обратиться вне этого класса. Например, присвоение значения этому
атрибуту ничего не даст:

1 tom.__age = 43 

А попытка получить его значение приведет к ошибке выполнения:

1 print(tom.__age)

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

1 def get_age(self):
2     return self.__age

Данный метод еще часто называют геттер или аксессор.

Для изменения возраста определено другое свойство:

1 def set_age(self, value):


2     if value in range(1, 100):
3         self.__age = value
4     else:
5         print("Недопустимый возраст")

Здесь мы уже можем решить в зависимости от условий, надо ли переустанавливать


возраст. Данный метод еще называют сеттер или мьютейтор (mutator).
Необязательно создавать для каждого приватного атрибута подобную пару свойств. Так, в
примере выше имя человека мы можем установить только из конструктора. А для
получение определен метод get_name.

22) У класі обов’язково атрибути та методи. Атрибути це змінні які входять до класу, а
методи – це функції, які щось виконують.

24) Метод - это функция, которая принимает экземпляр класса как свой первый
параметр. Методы являются членами классов. Атрибут это переменная которой мы
оперируем в класе. Функція під назвою __init__ запускається, коли ми створюємо екземпляр
(приклад, зразок) класу. Через ключове слово ‘self’ ми звертаємося до методів та атрибутів
класу будучи всередині класу. Ви можете бачити, що слово ‘self’ є першим параметром у
кожній функції класу. Кожна функція чи змінна оголошена на першому рівні вкладення у
визначенні класу автоматично “запихається” у ‘self’. Тому, щоб далі в коді класу можна було
доступитися до змінних та функцій класу, ми використовуємо ‘self’ слово, після якого також
ставимо крапку, щоб отримати потрібну змінну чи функцію з класу. Наприклад:
self.variable_name поверне на значення атрибуту класу під назвою ‘variable_name’.

29) Полиморфизм - разное поведение одного и того же метода в разных классах. Например,
мы можем сложить два числа, и можем сложить две строки. При этом получим разный
результат, так как числа и строки являются разными классами.
>>>

>>> 1 + 1

>>> "1" + "1"

'11'

18 While - один из самых универсальных циклов в Python, поэтому довольно медленный.


Выполняет тело цикла до тех пор, пока условие цикла истинно.

>>> i = 5

>>> while i < 15:

... print(i)

... i=i+2

...
5

11

13

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

>>> for i in 'hello world':

... print(i * 2, end='')

...

hheelllloo wwoorrlldd

19 Оператор continue
Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или
while)
>>>

>>> for i in 'hello world':

... if i == 'o':

... continue

... print(i * 2, end='')

...

hheellll wwrrlldd
Оператор break
Оператор break досрочно прерывает цикл.
>>>

>>> for i in 'hello world':

... if i == 'o':

... break

... print(i * 2, end='')

...

Hheelll

24. self - это ни в коем случае не зарезервированное слово. Это просто название
переменной.

В методах класса первый параметр функции по соглашению именуют self, и это ссылка


на сам объект этого класса. Но это именно соглашение. Вы вольны называть параметры
как угодно.

Зачем это нужно?

Ну вот есть объект и вы хотите создать/изменить поле у этого объекта из метода этого
самого объекта. 

class Human:
def __init__(self):
self.blood = 7000

def add_blood(self, volume):


self.blood += volume

27 Множинне успадкування — спадкування в класі-нащадку атрибутів відразу декількох батьківських


класів.
Лінеаризація в Python — це черговість, при якій проводиться пошук зазначеного атрибута спочатку в
класах-нащадків, а потім і в батьківських класах.
Розглянемо прості приклади множинного спадкоємства і лінеаризації в Python-3.
Множинне успадкування і лінеаризація при даному процесі в Python 3 показана на прикладах нижче.
При вказівці методів з однаковою назвою у різних класів і різним вмістом успадковується в класі-
нащадку той, клас якого прописаний першим при множинному спадкуванні (в круглих дужках після
назви класу-нащадка). Це просто перевірити на прикладі нижче, змінюючи послідовність
розташування батьківських класів для наслідування у дочірнього класу Child.
Множинне успадкування в Python 3
01.class Parent():

02.def parent_method(self):

03.print("First parent class")

04. 

05.class Parent2():

06.def parent_method(self):

07.print("Second parent class")

08. 

09.class Parent3():

10.def parent_method(self):

11.print("Third parent class")

12. 

13.class Child(Parent2, Parent, Parent3):

14.def child_method(self):

15.print("The child method")

16. 

17.child=Child()

18.child.parent_method()

Якщо ж кожен метод батьківських класів назвати різними назвами, то на прикладі класу-нащадка
можна чітко побачити, що в класі нащадку успадковуються всі батьківські методи відразу трьох класів.
Виходить множинне спадкування.
01.class Parent():

02.def parent_method(self):

03.print("First parent class")

04. 

05.class Parent2():

06.def parent_method2(self):

07.print("Second parent class")

08. 

09.class Parent3():

10.def parent_method3(self):

11.print("Third parent class")

12. 

13.class Child(Parent2, Parent, Parent3):

14.def child_method(self):

15.print("The child method")


16. 

17.child=Child()

18.child.parent_method()

19.child.parent_method2()

20.child.parent_method3()

Лінеаризація в Python-3
Лінеаризація в Python-3 дещо відрізняється від даного процесу в Python-2. У третій версії MRO
(Method Resolution Order) в спадкуванні класу-нащадка дотримується порядок проходження
батьківських класів, що було і в їх черговості при його оголошенні. Спочатку пошук ведеться в
першому оголошеному класі-батьку, потім в другому і так далі. Наочно це побачити можна в прикладі
нижче. Другий батьківський клас успадковує метод першого, а клас-нащадок успадковує другий і
третій батьківський клас. При виклику класу нащадка метод він візьме третього класу. А при виклику
другого класу, виведеться метод першого.
Така лінеаризація будується для класів нового типу.
print(Child.mro()) виведе інформацію як відбувалася лінеаризація, її черговість. Спочатку метод, до
якого звертаються, шукається в класі-нащадку, а потім в батьківських класах в порядку черги.
view source

print?

01.class Parent():

02.def parent_method(self):

03.print("First parent class")

04. 

05.class Parent2(Parent):

06.pass

07. 

08.class Parent3(Parent):

09.def parent_method(self):

10.print("Third parent class")

11. 

12.class Child(Parent2, Parent3):

13.def child_method(self):

14.print("The child method")

15. 

16.parent2=Parent2()

17.parent2.parent_method()

18.child=Child()

19.child.parent_method()

20.print(Child.mro())
Пошук методів у батьківських классах відбувається зліва а право. При множинному спадкуванні якщо
певий метод що викликаэться выдсутый в класі нащадку то для його пошуку в ієархіїкласів також
використовується алгоритм С3 як і при одиничому спадкуванні.
28) В Python есть метод super(), который обычно применяется к объектам.
Его главная задача это возможность использования в классе потомке, методов
класса-родителя. 
class A(object):

    def __init__(self):

        print(u'конструктор класса A')


class B(A): 
    def __init__(self):
        print(u'конструктор класса B')
super(B,self).__init__()

.Тестирование ПО – проверка соответствия между реальным и ожидаемым поведением


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

Синтаксические ошибки – ошибки которые замечает интерпретатор.

Семантические ошибки –ошибки так же называемые как логические. Возникают когда программа
работает но не дает нужного результата.

3. Исключения – это тип данных Пайтона. Они необходимы для того что бы сообщить об
ошибках:

try:

k=1/0

exept zeroDivisionError :

k=0

print(k)
4.Профилирование кода- это попытка найти узкие места в коде. Оно может найти самое долгое
выполнение участка кода. (Модуль сProfile, cProfile.run())

1.События – процесс когда человек что то делает для запуска программы.Есть 3 типа действий:

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

2.Графический интерфейс создается с помощью класса Tk()

from tkinter import*

root=Tk()

root.mainloop()

3.Виджет это то что видит пользователь. Самые популярные из них это button,label,entry.

Button –кнопка которая выполняет определенные действия при нажатии

Label- отображает текст в окне служит для информационных целей.

Entry – однострочное текстовое поле которое служит для ввода информации пользователем .

4. pack()- автоматически размещает виджеты в род.окне. Имеет параметры : side, fill, expand.
grid()- размещает виджеты в сетке. Основные параметры : row/column, rowspan/columnspan.

place()- позволяет размещать виджеты в указаных координатах с указанными размерами.


Основые параметры: x,y, height, width.

5. Tk()- является абсолютным корнем приложения , это первый виджет который необходимо
создать, и графический интерфейс будет закрыт когда он будет уничтожен.

Toplevel()- окно в приложении, закрытие окна закроет все дочерние виджеты в этом окне

но не выключит программу.

Создание: window=tk.Toplevel()

6.Метод bind() связывает между собой виджет , событие и действие.

Например : виджет-кнопка, событие-клик по ней ЛКМ, действие-отправка сообщения.

7.mainloop()- обьекта Tk запускает гланый цикл обработки событий , что приводит к отображению
окна на экран.

Инкапсуляция
Инкапсуляция — ограничение доступа к составляющим объект компонентам
(методам и переменным). Инкапсуляция делает некоторые из компонент
доступными только внутри класса.
Инкапсуляция в Python работает лишь на уровне соглашения между
программистами о том, какие атрибуты являются общедоступными, а какие —
внутренними.
Одиночное подчеркивание в начале имени атрибута говорит о том, что переменная
или метод не предназначен для использования вне методов класса, однако атрибут
доступен по этому имени.

class A:

def _private(self):

print("Это приватный метод!")

>>> a = A()

>>> a._private()

Это приватный метод!

Двойное подчеркивание в начале имени атрибута даёт большую защиту: атрибут


становится недоступным по этому имени.
>>>
>>> class B:

... def __private(self):

... print("Это приватный метод!")

...

>>> b = B()

>>> b.__private()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: 'B' object has no attribute '__private'

Однако полностью это не защищает, так как атрибут всё равно остаётся доступным
под именем _ИмяКласса__ИмяАтрибута:
>>>

>>> b._B__private()

Это приватный метод!

Наследование
Наследование подразумевает то, что дочерний класс содержит все атрибуты
родительского класса, при этом некоторые из них могут быть переопределены или
добавлены в дочернем. Например, мы можем создать свой класс, похожий
на словарь:
>>>

>>> class Mydict(dict):

... def get(self, key, default = 0):

... return dict.get(self, key, default)

...
>>> a = dict(a=1, b=2)

>>> b = Mydict(a=1, b=2)

Класс Mydict ведёт себя точно так же, как и словарь, за исключением того, что метод
get по умолчанию возвращает не None, а 0.
>>>

>>> b['c'] = 4

>>> print(b)

{'a': 1, 'c': 4, 'b': 2}

>>> print(a.get('v'))

None

>>> print(b.get('v'))

You might also like