Professional Documents
Culture Documents
Екзамен Прога 1.1
Екзамен Прога 1.1
1 Загальні питання
1) Трансляторы – это программы, устройства, переводящие информацию с языка понятного
человеку, на язык, понятный устройству.
Трансляторы бывают 2-х типов: компиляторы и интерпретаторы.
Интерпретатор последовательно читает предложение, переводит их на машинный язык и
выполняет.
Компиляторы переводят весь текст в машинный код, который в дальнейшем может быть
запущен на выполнение.
Компиляторы можно поделить на 2 вида: классический и кросплатфорные.
Результат компилятора – это exe файл. И может быть запущен в рамках ОС.
Кросплатфорные компиляторы переводят текст программы в некоторое промежуточное не
привязанное к компьютеру код программы (промежуточный код). Современные
компиляторы – это смесь классического и кросплатфорного принципа.
● Алфавит.
● Синтаксис.
● Семантика
імперативне програмування;
об'єктно-орієнтоване програмування;
декларативне програмування.
Іншим основним видом відносин між класами та об'єктами є агрегація. Вона означає, що
один клас містить в собі агрегати (складових частин, підсистем) інших класів. Так
автомобіль складається з кузова, двигуна, трансмісії і т.п., а до складу приймально-
передавального пристрою входять передавач, приймач і антенно-фідерний пристрій.
7) Метаклассы – это классы, экземпляры которых являются классами. Если говорить в двух
словах, то метакласс – это «штуковина», создающая классы. Чтобы создавать объекты, мы
определяем классы, правильно? Но мы узнали, что классы в Python являются объектами. На
самом деле метаклассы – это то, что создает данные объекты. Довольно сложно объяснить.
Лучше приведем пример:
1 MyClass = MetaClass()
2 my_object = MyClass()
8) Три властивості характеризують об'єкти:
12) Тем , что в Пайтоне отсутствует принцип инкапсуляции на деле. А так разница
заключается в :
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
Anaсonda это:
Анаконда — более 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.
(Числа (Numbers)
Строка (String)
Список (List)
Кортеж (Tuple)
Словарь (Dictionary)
Сет (Set))
http://pythonicway.com/python-data-types
Числа можуть бути цілими (1 і 2), з десятковими дробами (1.1 і 1.2), звичайними дробами (1/2 and
2/3), чи навіть комплексними.
Звичайно існує ще багато типів крім вищеперелічених. В 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() "розморожує" кортеж.
Множини
Множини - це "сумки" з невпорядкованими унікальними значеннями. Множина може містити
значення будь-якого незмінюваного типу. Якщо маєте дві множини, то можете здійснювати над ними
звичні операції над множинами: об’єднання, перетин і різницю.
Словники
Словники - це невпорядковані набори пар "ключ - значення". Коли ви додаєте до словника новий
ключ, завжди також повинні додати туди і значення (яке можна буде змінити пізніше). Вони
оптимізовані для отримання значення, якщо ви знаєте відповідний ключ, але ніяк не навпаки.
None
None - спеціальна константа мови Python. Це значення, що позначає відсутність значення. None - це
не те ж саме що й False . None не 0 . При порівнянні з None будь-що, окрім None , завжди
поверне False .
None - єдине значення свого власного типу NoneType . Ви можете присвоїти значення None будь-
яку змінну, але не можете створити інші об'єкти класу NoneType . Всі змінні зі
значенням None дорівнюють одна одній.
6.
7.
Всякий раз, когда в программе используется некоторое имя, интерпретатор создает, изменяет или
отыскивает это имя в пространстве имен.
Имена появляются в тот момент, когда им впервые присваиваются некоторые значения, и прежде
чем имена смогут быть использованы, им необходимо присвоить значения. Поскольку имена не
объявляются заранее, интерпретатор Python по местоположению операции присваивания
связывает имя с конкретным пространством имен. Место, где выполняется присваивание,
определяет пространство имен, в котором будет находиться имя, а следовательно, и область его
видимости.
Имена, определяемые внутри инструкции def, видны только программному коду внутри инструкции
def. К этим именам нельзя обратиться за пределами функции.
Значения переменным могут быть присвоены в трех разных местах, соответствующих трем разным
областям видимости:
локальные
Простори імен слугують для розв'язання конфліктів імен у модульних програмах, що складаються з
декількох файлів.
8.
В Python вам не нужно объявлять тип переменной вручную (как, например в С++). Объявление
происходит автоматически (это называется динамическая типизация), когда вы присваиваете
значение переменной. Знак равенства ( = ) используется для присвоения значения переменной.
Операнд по левую сторону от знака равно ( = ) это имя переменной, операнд по правую сторону -
значение присвоенное этой переменной.
Например:
?
1 country = "Swiss" # Присвоить значение Swiss переменной под названием country
2 age = 23 # Присвоение значения 23 переменной age
3 print country
4 print age
При выполнении, данный код выведет:
1 Swiss
2 23
Множественное присвоение значений:
?
1 a=b=c=1
В данном создается объект со значением 1, и все 3 переменные указывают на область в памяти, в
которой он находится.
9.
Просто створюемо змінну , задам значення , якщо потрібно вивести її просто звертаємося до неї
string % value
Такой способ форматирования считается старым видимо потому, что заимствован из функции printf()
языка C, а в Python кроме него появились более продвинутые средства форматирования вывода.
Однако в ряде случаев использование оператора % бывает удобнее, чем использование строкового
метода format().
Следует отметить, что форматируются строки, а не вывод. На вывод передается уже сформированная
строка.
Аргументов в format() может быть больше, чем идентификаторов в строке. В таком случае
оставшиеся игнорируются.
10.
Функции – это многократно используемые фрагменты программы. Они позволяют дать имя
определённому блоку команд с тем, чтобы впоследствии запускать этот блок по указанному имени в
любом месте программы и сколь угодно много раз.
def sayHello():
# Конец функции
Синтаксический сахар
11.
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 __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.
>>> list('список')
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.
Размещение элементов массива в едином блоке памяти является ключевой особенностью массивов.
Такое размещение позволяет максимально эффективно получать доступ к любому наперёд
заданному элементу массива. Действительно, зная адрес массива — номер ячейки памяти, начиная
с которой в ней последовательно располагаются элементы массива, иными словами, зная адрес
элемента с индексом 0, и учитывая, что все элементы массива в силу их однотипности занимают в
памяти одинаковое количество ячеек, можно легко получить адрес элемента с любым заданным
индексом i. Для этого достаточно i раз выполнить смещение от начала массива на количество ячеек,
занимаемое одним элементом или, что то же самое, выполнить смещение от начала массива на
количество ячеек, равное произведению индекса требуемого элемента на количество ячеек,
занимаемое одним элементом (см. рис. 1). Выполнение подобных смещений реализуется с помощью
арифметических операций над указателями.
>>> i = 5
... print(i)
... i=i+2
...
9
11
13
Цикл for
Цикл for уже чуточку сложнее, чуть менее универсальный, но выполняется гораздо быстрее
цикла while. Этот цикл проходится по любому итерируемому объекту (например строке или
списку), и во время каждого прохода выполняет тело цикла.
>>>
...
hheelllloo wwoorrlldd
19 Оператор continue
Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или
while)
>>>
... if i == 'o':
... continue
...
hheellll wwrrlldd
Оператор break
Оператор break досрочно прерывает цикл.
>>>
... break
...
Hheelll
24. self - это ни в коем случае не зарезервированное слово. Это просто название
переменной.
Ну вот есть объект и вы хотите создать/изменить поле у этого объекта из метода этого
самого объекта.
class Human:
def __init__(self):
self.blood = 7000
02.def parent_method(self):
04.
05.class Parent2():
06.def parent_method(self):
08.
09.class Parent3():
10.def parent_method(self):
12.
14.def child_method(self):
16.
17.child=Child()
18.child.parent_method()
Якщо ж кожен метод батьківських класів назвати різними назвами, то на прикладі класу-нащадка
можна чітко побачити, що в класі нащадку успадковуються всі батьківські методи відразу трьох класів.
Виходить множинне спадкування.
01.class Parent():
02.def parent_method(self):
04.
05.class Parent2():
06.def parent_method2(self):
08.
09.class Parent3():
10.def parent_method3(self):
12.
14.def child_method(self):
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):
04.
05.class Parent2(Parent):
06.pass
07.
08.class Parent3(Parent):
09.def parent_method(self):
11.
12.class Child(Parent2, Parent3):
13.def child_method(self):
15.
16.parent2=Parent2()
17.parent2.parent_method()
18.child=Child()
19.child.parent_method()
20.print(Child.mro())
Пошук методів у батьківських классах відбувається зліва а право. При множинному спадкуванні якщо
певий метод що викликаэться выдсутый в класі нащадку то для його пошуку в ієархіїкласів також
використовується алгоритм С3 як і при одиничому спадкуванні.