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.
В Python параметр *args используется для передачи списка аргументов переменной длины без
указания ключевого слова. Стоит отметить, что звездочка (*) является важным элементом параметра,
так как слово args – установленная условная идиома.
Параметр **kwargs передаёт функции словарь аргументов переменной длины с ключевым словом.
Примечание: Опять же, звездочки (**) важны, поскольку без них kwargs используется в
документации.
Как и *args, **kwargs может принимать любое количество аргументов. Однако **kwargs отличается
от *args тем, что требует присваивать ключевое слово.
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.
1 >>> tup1 =('physics','chemistry',1997,2000);
2 >>> tup2 =(1,2,3,4,5);
3 >>> tup3 ="a","b","c","d";
1 >>> tup1 = ();
Размещение элементов массива в едином блоке памяти является ключевой особенностью массивов.
Такое размещение позволяет максимально эффективно получать доступ к любому наперёд
заданному элементу массива. Действительно, зная адрес массива — номер ячейки памяти, начиная
с которой в ней последовательно располагаются элементы массива, иными словами, зная адрес
элемента с индексом 0, и учитывая, что все элементы массива в силу их однотипности занимают в
памяти одинаковое количество ячеек, можно легко получить адрес элемента с любым заданным
индексом i. Для этого достаточно i раз выполнить смещение от начала массива на количество ячеек,
занимаемое одним элементом или, что то же самое, выполнить смещение от начала массива на
количество ячеек, равное произведению индекса требуемого элемента на количество ячеек,
занимаемое одним элементом (см. рис. 1). Выполнение подобных смещений реализуется с помощью
арифметических операций над указателями.
3 import moduletest
Якщо в алгоритмі, окрім простих команд, є команда, яка містить умову, то такий алгоритм
називається розгалуженим. Умови в інформатиці називаються логічним виразом. Приклад:
"Алгоритм Вечір":
Пообідати.Якщо погода хороша, то попрацювати в саду, інакше піти в бібліотеку, взяти книжку,
повернутися додому.
Повечеряти.
Лягти спати.
Алгоритм коледж
Іти додому.
Універсальні алгоритми – це такі які містять в собі вище перечисленні такі алгоритми.
>>> property()
>>> property().getter
>>> property().setter
>>> property().deleter
Они также действуют как декораторы. Они возвращают новый объект свойства:
>>> property().getter(None)
@property
foo = property(foo)
...
...
...
>>> prop = property(getter)
True
True
True
True
True
True
True
True
True
...
Get!
Set to 'bar'!
>>> prop.__delete__(Foo())
Delete!
class Property(object):
"Emulate PyProperty_Type() in Objects/descrobject.c"
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
1 tom.__age = 43
1 print(tom.__age)
Однако все же нам может потребоваться устанавливать возраст пользователя из вне. Для
этого создаются свойства. Используя одно свойство, мы можем получить значение
атрибута:
1 def get_age(self):
2 return self.__age
22) У класі обов’язково атрибути та методи. Атрибути це змінні які входять до класу, а
методи – це функції, які щось виконують.
24) Метод - это функция, которая принимает экземпляр класса как свой первый
параметр. Методы являются членами классов. Атрибут это переменная которой мы
оперируем в класе. Функція під назвою __init__ запускається, коли ми створюємо екземпляр
(приклад, зразок) класу. Через ключове слово ‘self’ ми звертаємося до методів та атрибутів
класу будучи всередині класу. Ви можете бачити, що слово ‘self’ є першим параметром у
кожній функції класу. Кожна функція чи змінна оголошена на першому рівні вкладення у
визначенні класу автоматично “запихається” у ‘self’. Тому, щоб далі в коді класу можна було
доступитися до змінних та функцій класу, ми використовуємо ‘self’ слово, після якого також
ставимо крапку, щоб отримати потрібну змінну чи функцію з класу. Наприклад:
self.variable_name поверне на значення атрибуту класу під назвою ‘variable_name’.
29) Полиморфизм - разное поведение одного и того же метода в разных классах. Например,
мы можем сложить два числа, и можем сложить две строки. При этом получим разный
результат, так как числа и строки являются разными классами.
>>>
>>> 1 + 1
'11'
>>> i = 5
... print(i)
... i=i+2
...
5
11
13
Цикл for
Цикл for уже чуточку сложнее, чуть менее универсальный, но выполняется гораздо быстрее
цикла while. Этот цикл проходится по любому итерируемому объекту (например строке или
списку), и во время каждого прохода выполняет тело цикла.
>>>
...
hheelllloo wwoorrlldd
19 Оператор continue
Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или
while)
>>>
... if i == 'o':
... continue
...
hheellll wwrrlldd
Оператор break
Оператор break досрочно прерывает цикл.
>>>
... if i == 'o':
... 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):
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 як і при одиничому спадкуванні.
28) В Python есть метод super(), который обычно применяется к объектам.
Его главная задача это возможность использования в классе потомке, методов
класса-родителя.
class A(object):
def __init__(self):
Семантические ошибки –ошибки так же называемые как логические. Возникают когда программа
работает но не дает нужного результата.
3. Исключения – это тип данных Пайтона. Они необходимы для того что бы сообщить об
ошибках:
try:
k=1/0
exept zeroDivisionError :
k=0
print(k)
4.Профилирование кода- это попытка найти узкие места в коде. Оно может найти самое долгое
выполнение участка кода. (Модуль сProfile, cProfile.run())
1.События – процесс когда человек что то делает для запуска программы.Есть 3 типа действий:
root=Tk()
root.mainloop()
3.Виджет это то что видит пользователь. Самые популярные из них это button,label,entry.
Entry – однострочное текстовое поле которое служит для ввода информации пользователем .
4. pack()- автоматически размещает виджеты в род.окне. Имеет параметры : side, fill, expand.
grid()- размещает виджеты в сетке. Основные параметры : row/column, rowspan/columnspan.
5. Tk()- является абсолютным корнем приложения , это первый виджет который необходимо
создать, и графический интерфейс будет закрыт когда он будет уничтожен.
Toplevel()- окно в приложении, закрытие окна закроет все дочерние виджеты в этом окне
но не выключит программу.
Создание: window=tk.Toplevel()
7.mainloop()- обьекта Tk запускает гланый цикл обработки событий , что приводит к отображению
окна на экран.
Инкапсуляция
Инкапсуляция — ограничение доступа к составляющим объект компонентам
(методам и переменным). Инкапсуляция делает некоторые из компонент
доступными только внутри класса.
Инкапсуляция в Python работает лишь на уровне соглашения между
программистами о том, какие атрибуты являются общедоступными, а какие —
внутренними.
Одиночное подчеркивание в начале имени атрибута говорит о том, что переменная
или метод не предназначен для использования вне методов класса, однако атрибут
доступен по этому имени.
class A:
def _private(self):
>>> a = A()
>>> a._private()
...
>>> b = B()
>>> b.__private()
Однако полностью это не защищает, так как атрибут всё равно остаётся доступным
под именем _ИмяКласса__ИмяАтрибута:
>>>
>>> b._B__private()
Наследование
Наследование подразумевает то, что дочерний класс содержит все атрибуты
родительского класса, при этом некоторые из них могут быть переопределены или
добавлены в дочернем. Например, мы можем создать свой класс, похожий
на словарь:
>>>
...
>>> a = dict(a=1, b=2)
Класс Mydict ведёт себя точно так же, как и словарь, за исключением того, что метод
get по умолчанию возвращает не None, а 0.
>>>
>>> b['c'] = 4
>>> print(b)
>>> print(a.get('v'))
None
>>> print(b.get('v'))