From 834de63476ceb660039ce9227c53d1047cd5c599 Mon Sep 17 00:00:00 2001 From: Artyom Date: Sat, 27 Sep 2025 20:13:37 +0300 Subject: [PATCH] Added report files --- TEMA3/figure0.png | Bin 0 -> 25721 bytes TEMA3/report.md | 772 ++++++++++++++++++++++++++++++++++++++++++++++ TEMA3/report.py | 0 TEMA3/task.md | 58 ++++ 4 files changed, 830 insertions(+) create mode 100644 TEMA3/figure0.png create mode 100644 TEMA3/report.md create mode 100644 TEMA3/report.py create mode 100644 TEMA3/task.md diff --git a/TEMA3/figure0.png b/TEMA3/figure0.png new file mode 100644 index 0000000000000000000000000000000000000000..30d4d535136937fbb575e2132fb2d7657e98f500 GIT binary patch literal 25721 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 bynT4oL4WS)E&ev|pXI11Xv$a0S_S_Xdeti} literal 0 HcmV?d00001 diff --git a/TEMA3/report.md b/TEMA3/report.md new file mode 100644 index 0000000..111cfa3 --- /dev/null +++ b/TEMA3/report.md @@ -0,0 +1,772 @@ +# Отчет по теме 3 + +Степанов Артём, А-02-23 + +## Операции с объектами + +### 1. Установка рабочего каталога. Создание рабочего протокола. + +В оболочке IDLE установил актуальный рабочий каталог, а затем в нём создал рабочий протокол. + +![Скриншот созданного рабочего протокола](figure0.png) + +### 2. Преобразование простых базовых типов объектов. + +#### 2.1. Преобразование в логический тип. + +Функция __bool()__ позволяет преобразовывать переданные ей объекты в логический тип. + +```py +>>> logiz1 = bool(56) # Любое целое число, кроме 0, преобразуется в True +>>> logiz1 + True +>>> logiz2 = bool(0) # 0 преобразуется в False +>>> logiz2 + False +>>> logiz3 = bool("Beta") # Непустая строка преобразуется в True +>>> logiz3 + True +>>> logiz4 = bool("") # Пустая строка преобразуется в False +>>> logiz4 + False +``` + +#### 2.2. Преобразование объекта в число. + +Функция __int()__ позволяет преобразовывать переданные ей объекты в целое десятичное число. + +```py +>>> tt1 = int(198.9) # Отбрасывается дробная часть +>>> tt1 + 198 +>>> tt2 = int("-76") # Число – в строке символов, система по умолчанию - десятичная +>>> tt2 + -76 +>>> tt3 = int("B", 16) # Число в шестнадцатеричной системе счисления +>>> tt3 + 11 +>>> tt4 = int("71", 8) # Число в восьмеричной системе счисления +>>> tt4 + 57 +>>> tt5 = int("98.76") # Число, передающееся в виде строки, должно быть целым + Traceback (most recent call last): + File "", line 1, in + tt5 = int("98.76") + ValueError: invalid literal for int() with base 10: '98.76' +``` + +Функция __float()__ позволяет преобразовывать переданные ей объекты в вещественное число. + +```py +>>> flt1 = float(789) # Преобразование целого числа в вещественное +>>> flt1 + 789.0 +>>> flt2 = float(-6.78e2) +>>> flt2 + -678.0 +>>> flt3 = float("Infinity") # В функцию float() можно передавать строки со значениями inf и NaN +>>> flt3 + inf +>>> flt4 = float("-inf") # Значения inf и NaN являются нерегистрочувствительными +>>> flt4 + -inf +``` + +#### 2.3. Преобразование десятичных чисел в другие систем счисления. + +Функции __bin()__, __oct()__ и __hex()__ позволяют преобразовать переданные ей десятичные числа в двоичную, восьмеричную и шестнадцатеричную системы счисления соответственно. + +```py +>>> hh = 123 +>>> dv1 = bin(hh) +>>> dv1 + '0b1111011' +>>> vos1 = oct(hh) +>>> vos1 + '0o173' +>>> shs1 = hex(hh) +>>> shs1 + '0x7b' +>>> int(dv1, 2) # Обратное преобразование из двоичной системы счисления + 123 +>>> int(vos1, 8) # Обратное преобразование из восьмеричной системы счисления + 123 +>>> int(shs1, 16) # Обратное преобразование из шестнадцатеричной системы счисления + 123 +``` + +### 3. Изучение преобразования более сложных базовых типов объектов. + +#### 3.1. Преобразование в строку символов. + +Функция __str()__ позволяет преобразовывать переданные ей объекты в строку символов. + +```py +>>> strk1 = str(23.6) # Преобразование вещественного числа в строку символов +>>> strk1 + '23.6' +>>> strk2 = str(logiz3) # Преобразование логической переменной в строку символов +>>> strk2 + 'True' +>>> strk3 = str(["A", "B", "C"]) # Преобразование списка в строку символов +>>> strk3 + "['A', 'B', 'C']" +>>> strk4 = str(("A", "B", "C")) # Преобразование кортежа в строку символов +>>> strk4 + "('A', 'B', 'C')" +>>> strk5 = str({"A" : 1, "B" : 2, "C" : 9}) # Преобразование словаря в строку символов +>>> strk5 + "{'A': 1, 'B': 2, 'C': 9}" +``` + +#### 3.2. Преобразование в список. + +Функция __list()__ позволяет преобразовывать переданные ей объекты в список. + +```py +>>> spis1 = list("Строка символов") # Преобразование строки символов в список +>>> spis1 + ['С', 'т', 'р', 'о', 'к', 'а', ' ', 'с', 'и', 'м', 'в', 'о', 'л', 'о', 'в'] +>>> spis2 = list((124, 236, -15, 908)) # Преобразование кортежа в список +>>> spis2 + [124, 236, -15, 908] +>>> spis3 = list({"A" : 1, "B" : 2, "C" : 9}) # Преобразование словаря в список +>>> spis3 + ['A', 'B', 'C'] +``` + +#### 3.3. Преобразование в кортеж. + +Функция __tuple()__ позволяет преобразовывать переданные ей объекты в кортеж. + +```py +>>> kort7 = tuple("Строка символов") # Преобразование строки символов в кортеж +>>> kort7 + ('С', 'т', 'р', 'о', 'к', 'а', ' ', 'с', 'и', 'м', 'в', 'о', 'л', 'о', 'в') +>>> kort8 = tuple(spis2) # Преобразование списка в кортеж +>>> kort8 + (124, 236, -15, 908) +>>> kort9 = tuple({"A" : 1, "B" : 2, "C" : 3}) # Преобразование словаря в кортеж +>>> kort9 + ('A', 'B', 'C') +``` + +#### 3.4. Удаление объектов. + +С помощью функции __del__ можно удалить объекты из оперативной памяти. + +```py +>>> del strk5, kort8 +>>> dir() + ['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'dv1', 'flt1', 'flt2', 'flt3', 'flt4', 'hh', 'kort7', 'kort9', 'logiz1', 'logiz2', 'logiz3', 'logiz4', 'shs1', 'spis1', 'spis2', 'spis3', 'spisi3', 'spsi3', 'strk1', 'strk2', 'strk3', 'strk4', 'tt1', 'tt2', 'tt3', 'tt4', 'vos1'] +``` + +#### 3.5. Использование операций с приведением типов на практике + +```py +>>> fullName = "StepanovAV" +>>> spisok = list(fullName) # Преобразование строки символов в список +>>> spisok + ['S', 't', 'e', 'p', 'a', 'n', 'o', 'v', 'A', 'V'] +>>> kortezh = tuple(spisok) # Преобразование списка в кортеж +>>> kortezh + ('S', 't', 'e', 'p', 'a', 'n', 'o', 'v', 'A', 'V') +>>> stroka = str(kortezh) # Преобразование кортежа в строку символов +>>> stroka + "('S', 't', 'e', 'p', 'a', 'n', 'o', 'v', 'A', 'V')" +``` + +### 4. Арифметические операции. + +#### 4.1. Сложение и вычитание. + +```py +>>> 12 + 7 + 90 # Сложение целых чисел + 109 +>>> 5.689e-1 - 0.456 # Вычитание вещественных чисел + 0.11289999999999994 +>>> 23.6 + 54 # Сложение вещественного и целого чисел + 77.6 +>>> 14 - 56.7 + 89 # Сложение и вычитание целых и вещественных чисел + 46.3 +``` + +#### 4.2. Умножение. + +```py +>>> -6.7 * 12 # Умножение вещественного и целого чисел + -80.4 +``` + +#### 4.3. Деление. + +```py +>>> -234.5 / 6 # Деление вещественного и целого чисел + -39.083333333333336 +>>> a = 178 / 45 # Деление целых чисел, но результат всё равно вещественное число +>>> a + 3.9555555555555557 +>>> type(a) + +``` + +#### 4.4. Деление с округлением вниз. + +```py +>>> b = 178 // 45 # 3.956 округляется вниз, т.е. до 3 +>>> b + 3 +>>> type(b) + +>>> c = -24.6 // 12.1 # -2.033 округляется вниз, т.е. до -3 +>>> c + -3.0 +>>> type(c) + +>>> 12 // 6.5 + 1.0 +>>> 12.0 // 5 + 2.0 +``` + +#### 4.5. Получение остатка от деления. + +```py +>>> 148 % 33 # Остаток от деления двух целых чисел + 16 +>>> 12.6 % 3.8 # Остаток от деления двух вещественных чисел + 1.2000000000000002 +>>> 12 % 6.5 + 5.5 +>>> 12.0 % 5 + 2.0 +``` + +#### 4.6. Возведение в степень. + +```py +>>> 14 ** 3 + 2744 +>>> e = 2.7 ** 3.6 +>>> e + 35.719843790663525 +>>> 12 ** 6.5 + 10343751.997175492 +>>> 12.0 ** 5 + 248832.0 +``` + +#### 4.7 Операции с комплексными числами + +```py +>>> z1 = 1 + 1j +>>> z2 = 2 + 2j +>>> z1 + z2 + (3+3j) +>>> z1 - z2 + (-1-1j) +>>> z1 * z2 + 4j +>>> z1 / z2 + (0.5+0j) +>>> z1 ** 2 + 2j +>>> z1 // 2 # Операция целочисленного деления неприменима к комплексным числам + Traceback (most recent call last): + File "", line 1, in + z1 // 2 + TypeError: unsupported operand type(s) for //: 'complex' and 'int' +>>> z1 % z2 # Операция получения остатка от деления также неприменима к комплексным числам + Traceback (most recent call last): + Fle "", line 1, in + z1 % z2 + TypeError: unsupported operand type(s) for %: 'complex' and 'complex' +``` + +При проведении арифметических операций над числами разных типов, получается число, имеющее более сложный тип из использованных при его получении. + +### 5. Операции с двоичными представлениями целых чисел. + +#### 5.1. Двоичная инверсия. + +При использовании двоичной инверсии значение каждого бита в двоичном представлении числа меняется на противоположное. + +```py +>>> dv1 = 9 +>>> bin(dv1) + '0b1001' +>>> dv2 = ~dv1 +>>> dv2 + -10 +>>> bin(dv2) + '-0b1010' +``` + +#### 5.2. Двоичное «И». + +Двоичное «И» - логическое умножение, побитовое совпадение двоичных представлений чисел. + +```py +>>> 7 & 9 # 0111 & 1001 = 0001 + 1 +>>> bin(7) + '0b111' +>>> bin(9) + '0b1001' +>>> 7 & 8 # 0111 & 1000 = 0000 + 0 +>>> bin(8) + '0b1000' +``` + +#### 5.3. Двоичное «ИЛИ». + +Двоичное «ИЛИ» - логическое сложение, побитовое совпадение двоичных представлений чисел, в котором 0 получается, только если оба сравниваемых разряда равны 0. + +```py +>>> 7 | 9 # 0111 | 1001 = 1111 + 15 +>>> bin(7) + '0b111' +>>> bin(9) + '0b1001' +>>> bin(15) + '0b1111' +>>> 7 | 8 # 0111 | 1000 = 1111 + 15 +>>> bin(8) + '0b1000' +>>> 14 | 5 # 1110 & 0101 = 1111 + 15 +>>> bin(14) + '0b1110' +>>> bin(5) + '0b101' +``` + +#### 5.4. Двоичное «исключающее ИЛИ». + +Двоичное «исключающее ИЛИ» - побитовое совпадение двоичных представлений чисел, в котором 0 получается, только если оба сравниваемых разряда имеют одинаковые значения. + +```py +>>> 14 ^ 5 # 1110 ^ 0101 = 1011 + 11 +>>> bin(14) + '0b1110' +>>> bin(5) + '0b101' +>>> bin(11) + '0b1011' +``` + +#### 5.5. Поразрядный сдвиг. + +Поразрядный сдвиг двоичного представления числа на заданное количество шагов осуществляется с помощью операторов __<<__ и __>>__. + +```py +>>> h = 14 +>>> bin(h) + '0b1110' +>>> g = h << 2 # Сдвиг на два разряда влево (добавление двух 0 в конец двоичного представления числа) +>>> bin(g) + '0b111000' +>>> g1 = h >> 1 # Сдвиг на один разряд вправо (удаление первой цифры двоичного представления числа) +>>> bin(g1) + '0b111' +>>> g2 = h >> 2 # Сдвиг на два разряда вправо (удаление двух первых цифр двоичного представления числа) + +>>> bin(g2) + '0b11' +``` + +#### 5.6 Использование операций с двоичным представлением чисел на практике + +```py +>>> a = 0b111000111 +>>> a + 455 +>>> b = 0b100100100 +>>> b + 292 +>>> ~a # Двоичная инверсия + -456 +>>> bin(~a) + '-0b111001000' +>>> a & b # Двоичное «И» + 260 +>>> bin(a & b) + '0b100000100' +>>> a | b # Двоичное «ИЛИ + 487 +>>> bin(a | b) + '0b111100111' +>>> a ^ b # Двоичное «исключающее ИЛИ» + 227 +>>> bin(a ^ b) + '0b11100011' +>>> a >> 3 # Поразрядный сдвиг + 56 +>>> bin(a >> 3) + '0b111000' +``` + +### 6. Операции при работе с последовательностями. + +#### 6.1. Объединение последовательностей. + +Конкатенация - операция объединения(склеивания) двух и более последовательностей одного типа. + +```py +>>> "Система " + "регулирования" # Конкатенация двух строк символов + 'Система регулирования' +>>> ["abc", "de", "fg"] + ["hi", "jkl"] # Конкатенация двух списков + ['abc', 'de', 'fg', 'hi', 'jkl'] +>>> ("abc", "de", "fg") + ("hi", "jkl") # Конкатенация двух кортежей + ('abc', 'de', 'fg', 'hi', 'jkl') +``` + +#### 6.2. Повторение. + +С помощью оператора __*__ в Python можно повторять объект заданное количество раз. + +```py +>>> "ля-" * 5 # Повторение строки 5 раз + 'ля-ля-ля-ля-ля-' +>>> ["ку", "-"] * 3 # Повторение списка 3 раза + ['ку', '-', 'ку', '-', 'ку', '-'] +>>> ("кис", "-") * 4 # Повторение кортежа 4 раза + ('кис', '-', 'кис', '-', 'кис', '-', 'кис', '-') +>>> signal1 = [0] * 3 + [1] * 99 +>>> signal1 + [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +>>> signal2 = (0,) * 3 + (1,) * 5 + (0,) * 7 +>>> signal2 + (0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0) +``` + +#### 6.3. Проверка наличия элемента в последовательности. + +Наличие элемента в последовательность можно проверить с помощью оператора __in__. + +```py +>>> stroka = "Система автоматического управления" +>>> "автомат" in stroka # Наличие подстроки в строке + True +>>> "ку" in ["ку", "-"] * 3 # Наличие контекста в списке + True +>>> "ля-" in ("abc", "de", "fg", "hi", "jkl") # Наличие контекста в кортеже + False +``` + +#### 6.4. Подстановка значений в строку. + +В строку символов можно подставлять заданные значения с помощью оператора __%__. + +```py +>>> stroka = "Температура = %g %s %g" +>>> stroka % (16, "меньше", 25) + 'Температура = 16 меньше 25' +>>> stroka = "Температура = %(zn1)g %(sravn)s %(zn2)g" +>>> stroka % {"zn1" : 16, "sravn" : "меньше", "zn2" : 25} + 'Температура = 16 меньше 25' +``` + +### 7. Оператор присваивания. + +#### 7.1. Обычное присваивание значения переменной. + +Оператор присваивания __=__ позволяет задать определенное значение переменной. + +```py +>>> zz = -12 +>>> zz + -12 +``` + +#### 7.2. Увеличение/уменьшение значения переменной на заданную величину. + +Операторы __+=__ и __-=__ позволяют увеличить или уменьшить значение переменной на заданную величину соответственно. + +```py +>>> zz += 5 # Увеличение значения на 5 +>>> zz + -7 +>>> zz -= 3 # Уменьшение значения на 3 +>>> zz + -10 +>>> stroka = "Система" +>>> stroka += " регулирования" # Конкатенация строк символов через оператор += +>>> stroka + 'Система регулирования' +``` + +#### 7.3. Умножение/деление значения переменной на заданную величину. + +Операторы __/=__ и __*=__ позволяют разделить или умножить значение переменной на заданную величину соответственно. + +```py +>>> zz /= 2 # Деление значения на 2 +>>> zz + -5.0 +>>> zz *= 5 # Умножение значения на 5 +>>> zz + -25.0 +>>> stroka = "ABC " +>>> stroka *= 3 # Повторение строки символов 3 раза +>>> stroka + 'ABC ABC ABC ' +``` + +#### 7.4. Дополнительные сокращенные арифметические операции. + +В Python также существуют дополнительные сокращенные арифметические операции: +* __//__ - целочисленное деление, +* __%__ - получение остатка от деления, +* __**__ - возведение в степень. + +```py +>>> a = 14 +>>> a //= 5 # Целочисленное деление +>>> a + 2 +>>> b = 13 +>>> b %= 6 # Получение остатка от деления +>>> b + 1 +>>> c = 2 +>>> c **= 4 # Возведение в степень +>>> c + 16 +``` + +#### 7.5. Множественное присваивание. + +Присваивать определенные значения можно сразу нескольким переменным за раз. + +```py +>>> w = v = 10 +>>> w, v + (10, 10) +>>> n1, n2, n3 = (11, -3, "all") +>>> n1, n2, n3 + (11, -3, 'all') +>>> n1, n2, n3 = "11 -3 all".split(" ") +>>> n1, n2, n3 + ('11', '-3', 'all') +>>> n1, n2, n3 = [11, -3, "all"] +>>> n1, n2, n3 + (11, -3, 'all') +>>> n1, n2, n3 = {1 : 11, 2 : -3, 3 : "all"} +>>> n1, n2, n3 + (1, 2, 3) +>>> n1, n2, n3 = {11, -3, "all"} +>>> n1, n2, n3 + (11, 'all', -3) +``` + +### 8. Логические операции. + +#### 8.1. Основные логические операции. + +```py +>>> w == v # Операция равенства + True +>>> w != v # Операция неравенства + False +>>> w += 1 +>>> w < v # Операция меньше + False +>>> w > v # Операция больше + True +>>> w <= v # Операция меньше или равно + False +>>> w >= v # Операция больше или равно + True +``` + +#### 8.2. Проверка наличия элемента в последовательности или сложном объекте. + +Наличие элемента в сложном объекте также можно проверить с помощью оператора __in__. + +```py +>>> mnoz1 = {"pen", "book", "pen", "iPhone", "table", "book"} +>>> "book" in mnoz1 # Проверка наличия элемента в множестве + True +>>> "cap" in mnoz1 + False +>>> dic1 = {"Saratov" : 145, "Orel" : 56, "Vologda" : 45} +>>> "Vologda" in dic1 # Проверка наличия ключа в словаре + True +>>> "Pskov" in dic1 + False +>>> 56 in dic1.values() # Проверка наличия значения в словаре + True +>>> dct1 = {"Institut" : ["AVTI", "IEE", "IBB"], "Depart" : ["UII", "PM", "VMSS", "MM"], "gruppa" : ["A-01-15", "A-02-15"]} +>>> "UII" in dct1["Depart"] # # Проверка наличия значения в словаре по ключу + True +>>> dct1["Depart"][1] == "MM" # Сранение значения словаря по ключу + False +``` + +#### 8.3. Создание больших логических выражений. + +С помощью соединительных слов __and__, __or__ и __not__ можно создавать большие логические выражения. + +```py +>>> a = 17 +>>> b = -6 +>>> (a >= b) and ("book" in mnoz1) and not ("Pskov" in dic1) + True +>>> (a % 2 == 1) and (("cap" in mnoz1) or (145 in dic1.values())) + True +>>> not (b < 0) or (len(mnoz1)== 4) + True +``` + +#### 8.4. Ссылки переменных на один и тот же объект. + +Сравнивать ссылки на объект можно с помощью оператора __is__. + +```py +>>> w = v = 10 +>>> w is v + True +>>> w1 = ["A", "B"] +>>> v1 = ["A", "B"] +>>> w1 is v1 + False +``` + +В последнем случае результатом сравнения является False, т.к. переменные создавались по отдельности, хоть их знаечния и полностью совпадают, а значит они хранятся в разных ячейках память, следовательно ссылки на них будут разными. + +### 9. Изучение методов объектов. + +#### 9.1. Методы для работы со строками. + +Для работы со строками существуют различные методы, использование которых рассмотрено ниже. + +```py +>>> stroka = "Микропроцессорная система управления" +>>> stroka.find("пр") # Поиск первого вхождения подстроки в строку + 5 +>>> stroka.count("с") # Подсчет вхождений подстроки в строку + 4 +>>> stroka.replace(" у", " автоматического у") # Замена всех вхождений подстроки в строку + 'Микропроцессорная система автоматического управления' +>>> spis22 = stroka.split(" ") # Разделение строки на список подстрок по определенному разделителю +>>> spis22 + ['Микропроцессорная', 'система', 'управления'] +>>> stroka.upper() # Перевод строки в верхний регистр + 'МИКРОПРОЦЕССОРНАЯ СИСТЕМА УПРАВЛЕНИЯ' +>>> stroka3 = " ".join(spis22) # Создание строки из списка построк с некоторым разделителем +>>> stroka3 + 'Микропроцессорная система управления' +>>> stroka3.partition("с") # Создание кортежа с результатом первого вхождения подстроки в строку + ('Микропроце', 'с', 'сорная система управления') +>>> stroka3.rpartition("с") # Создание кортежа с результатом последнего вхождения подстроки в строку + ('Микропроцессорная си', 'с', 'тема управления') +``` + +Метод __format()__ используется для форматирования строк по следующему принципу: +1. Если в форматированной строке не указан порядок вставки элементов, то они войдут в неё в порядке их передачи в метод, +2. Если в форматированной строке указан порядок вставки элементов, то они войдут в неё в с таким же порядком, +3. Если в форматированной строке поименно указаны позиции вставки элементов, то они войдут в неё в соответствии с ними. +```py +>>> strk1 = "Момент времени {}, значение {}" +>>> strk1.format(1, 89.7) # Случай 1 + 'Момент времени 1, значение 89.7' +>>> strk2 = "Момент времени {1}, значение = {0} : {2}" +>>> strk2.format(36.7, 2, "норма") # Случай 2 + 'Момент времени 2, значение = 36.7 : норма' +>>> strk3 = "Момент времени {num}, значение = {znch}" +>>> strk3.format(znch = 89.7, num = 2) # Случай 3 + 'Момент времени 2, значение = 89.7' +``` + +#### 9.2. Методы для работы со списками. + +Для работы со списками тоже существуют различные методы, принцип работы которых представлен ниже. + +```py +>>> spsk = [1, 2, 3, 4, 5, 6, 7] +>>> spsk.pop(2) # Удаление элемента по индексу из списка, с возвращением его значения + 3 +>>> spsk + [1, 2, 4, 5, 6, 7] +>>> spsk.append("c") # Добавление элемента в конец списка +>>> spsk + [1, 2, 4, 5, 6, 7, 'c'] +>>> spsk.insert(2, "a") # Добавление элемента на определенную позицию в списке +>>> spsk + [1, 2, 'a', 4, 5, 6, 7, 'c'] +>>> spsk.count("a") # Подсчет количества соответствующих элементов в списке + 1 +``` + +#### 9.3. Методы для работы с кортежами. + +Для работы с кортежами существует два основных метода, применение которых представлено ниже. + +```py +>>> kortezh = (1, 2, 3, 4, 5, 6, 7) +>>> dir(kortezh) + ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index'] +>>> kortezh.count(3) # Подсчет количества соответствующих элементов в кортеже + 1 +>>> kortezh.index(2) # Вычисление индекса переданного элемента, если он есть в кортеже + 1 +``` + +#### 9.4. Методы для работы с словарями и множествами. + +Методы для работы со словарями рассмотрены в примере ниже. + +```py +>>> dictionary = {"A" : 1, "B" : 2, "C" : 3, "D" : 4, "E" : 5} +>>> dictionary.get("D") # Получение значения из словаря по соответствующему ему ключу + 4 +>>> dictionary.items() # Получение списка кортежей всех пар ключ-значений в словаре + dict_items([('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5)]) +>>> dictionary.keys() # Получение списка всех ключей в словаре + dict_keys(['A', 'B', 'C', 'D', 'E']) +>>> dictionary.values() # Получение списка всех значений в словаре + dict_values([1, 2, 3, 4, 5]) +>>> dictionary.pop("C") # Удаление определенной пары ключ-значение из словаря по переданному ключу + 3 +>>> dictionary + {'A': 1, 'B': 2, 'D': 4, 'E': 5} +>>> dictionary.popitem() # Удаление последней пары ключ-значение из словаря + ('E', 5) +>>> dictionary + {'A': 1, 'B': 2, 'D': 4} +>>> dictionary.update({"A" : 5}) # Обновление словаря новыми значениями +>>> dictionary + {'A': 5, 'B': 2, 'D': 4} +>>> dictionary.clear() # Очистка словаря +>>> dictionary + {} +``` + +Методы для работы с множествами отчасти схожи с методами словарей, однако среди них также есть и уникальные методы. + +```py +>>> mnozhestvo = {"Apple", "Orange", "Peach", "Pear"} +>>> mnozhestvo.add("Banana") # Добавление элемента в множество +>>> mnozhestvo + {'Apple', 'Orange', 'Peach', 'Banana', 'Pear'} +>>> mnozhestvo2 = mnozhestvo.copy() # Копирование множества +>>> mnozhestvo2 + {'Apple', 'Peach', 'Orange', 'Banana', 'Pear'} +>>> mnozhestvo2.remove("Apple") # Удаление элемента из множества +>>> mnozhestvo2 + {'Peach', 'Orange', 'Banana', 'Pear'} +>>> mnozhestvo.difference(mnozhestvo2) # Сравнение двух множеств по содержимому, возвращает разницу + {'Apple'} +>>> mnozhestvo2.clear() # Очистка множества +>>> mnozhestvo2 + set() +``` + +### 10. Завершение работы со средой. + +Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE. diff --git a/TEMA3/report.py b/TEMA3/report.py new file mode 100644 index 0000000..e69de29 diff --git a/TEMA3/task.md b/TEMA3/task.md new file mode 100644 index 0000000..9aaee16 --- /dev/null +++ b/TEMA3/task.md @@ -0,0 +1,58 @@ +# Общее контрольное задание по теме 3 + +Степанов Артём, А-02-23 + +## Задание + +Реализовать, записать в текстовый файл и проанализировать результаты последовательности инструкций, выполняющих следующие действия: +* Преобразовать восьмеричное значение 45 в целое число. +* Создать объект-словарь D со значениями {"усиление":23, "запаздывание":12, "постоянная времени":78} и затем осуществить его преобразование в два списка: ключей и значений, а затем – эти два списка преобразовать в один кортеж. Чем отличается кортеж от списка? +* Напишите и выполните единое выражение, осуществляющее деление числа 1768 на 24.8 с округлением вниз, с определением после этого остатка от деления получившегося значения на 3 и затем возведения результата в степень 2.4. +* Напишите и выполните единое выражение, последовательно осуществляющее следующие операции: двоичное И для чисел 13 и 27, инверсия полученного значения, двоичное исключающее ИЛИ для полученного значения и числа 14, сдвиг полученного значения на два разряда влево. +* Создать список с 4 одинаковыми элементами 'колебат' и написать оператор проверки наличия комбинации символов 'аткол' в результате конкатенации второго и третьего элементов этого списка. +* Определить список методов, доступных у ранее созданного словаря D. Поочередно использовать его методы keys и values, определить, что можно получить с применением этих методов. +* Создать объект - символьную строку с текстом данного предложения. Из символьной строки создать список, элементами которого будут отдельные слова из созданной строки. Заменить в списке элемент «-» на «,». Удалить из списка элемент со значением «данного». Отобразить получившийся список. + +## Решение + +```py +>>> znch = int("45", 8) +>>> znch + 37 +>>> D = { + "усиление" : 23, + "запаздывание" : 12, + "постоянная времени" : 78 + } +>>> D_keys, D_values = list(D.keys()), list(D.values()) +>>> D_keys + ['усиление', 'запаздывание', 'постоянная времени'] +>>> D_values + [23, 12, 78] +>>> D_tuple = tuple(zip(D_keys, D_values)) # Кортеж, в отличие от списка, является неизменяемым объектом +>>> D_tuple + (('усиление', 23), ('запаздывание', 12), ('постоянная времени', 78)) +>>> ((1768 // 24.8) % 3) ** 2.4 + 5.278031643091577 +>>> (~(13 & 27) ^ 14) << 2 + -32 +>>> list1 = ["колебат",] * 4 +>>> list1 + ['колебат', 'колебат', 'колебат', 'колебат'] +>>> "аткол" in list1[1] + list1[2] + True +>>> dir(D) + ['__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__ior__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__ror__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] +>>> D.keys() + dict_keys(['усиление', 'запаздывание', 'постоянная времени']) # Список ключей словаря +>>> D.values() + dict_values([23, 12, 78]) # Список значений словаря +>>> string = "Создать объект - символьную строку с текстом данного предложения." +>>> string_list = string.split(" ") +>>> string_list[string_list.index("-")] = "," +>>> string_list + ['Создать', 'объект', ',', 'символьную', 'строку', 'с', 'текстом', 'данного', 'предложения.'] +>>> string_list.remove("данного") +>>> string_list + ['Создать', 'объект', ',', 'символьную', 'строку', 'с', 'текстом', 'предложения.'] +``` \ No newline at end of file