From 078cb9ab94adc532b0f877713d653b9b65cc2065 Mon Sep 17 00:00:00 2001 From: "Artyom (StepanovAV)" Date: Sun, 14 Sep 2025 20:27:43 +0300 Subject: [PATCH] Added report files --- TEMA2/figure0.png | Bin 0 -> 27000 bytes TEMA2/report.md | 489 ++++++++++++++++++++++++++++++++++++++++++++++ TEMA2/report.py | 236 ++++++++++++++++++++++ TEMA2/task.md | 49 +++++ 4 files changed, 774 insertions(+) create mode 100644 TEMA2/figure0.png create mode 100644 TEMA2/report.md create mode 100644 TEMA2/report.py create mode 100644 TEMA2/task.md diff --git a/TEMA2/figure0.png b/TEMA2/figure0.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcac7a7bb76d1ea52a3f829d8e0bbd48852974b GIT binary patch literal 27000 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 LHQ5SjvycA)K>c7T literal 0 HcmV?d00001 diff --git a/TEMA2/report.md b/TEMA2/report.md new file mode 100644 index 0000000..1bae61b --- /dev/null +++ b/TEMA2/report.md @@ -0,0 +1,489 @@ +# Отчет по теме 2 + +Степанов Артём, А-02-23 + +## Базовые типы объектов + +### 1. Установка рабочего каталога. Создание рабочего протокола. + +В оболочке IDLE установил актуальный рабочий каталог, а затем в нём создал рабочий протокол. + +![Скриншот созданного рабочего протокола](figure0.png) + +### 2. Изучение простых объектов. + +Рассмотрел операции присваивания значения объектам-переменным, а также операции их вывода в консоль: + +```py +>>> f1 = 16; f2 = 3 +>>> f1, f2 + (16, 3) +>>> f1; f2 + 16 + 3 +``` + +Для того, чтобы узнать, какие объекты существуют в среде Python на данный момент, ипользовал функцию dir(): + +```py +>>> dir() + ['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'f1', 'f2'] +``` + +Использовал эту же функцию, но уже с объектом f1 в качестве переданного аргумента, чтобы получить его список атрибутов: + +```py +>>> dir(f1) + ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] +``` + +Определил классовую принадлежность объекта f2 с помощью функции type(): + +```py +>>> type(f2) + +``` +Удалил объекты f1 и f2 из оперативной памяти, а затем проверил их полное удаление с помощью функции dir(): + +```py +>>> del f1, f2 +>>> dir() + ['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] +``` + +### 3. Изучение правил наименования объектов в Python. + +Изучил правила наименования объектов на следующем примере: + +``` py +>>> gg1 = 1.6 # Значение в виде вещественного числа +>>> hh1 = "Строка" # Значение в виде символьной строки +>>> 73sr = 3 # Неправильное имя – начинается с цифры - будет диагностика + SyntaxError: invalid decimal literal +>>> and = 7 # Недопустимое имя – совпадает с ключевым словом - будет диагностика + SyntaxError: invalid syntax +``` + +### 4. Просмотр и сохранение ключевых слов объекта. + +Вывел в консоль список ключевых слов объекта, а затем сохранил данный список в переменную keywords: + +```py +>>> import keyword +>>> keyword.kwlist + ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] +>>> keywords = keyword.kwlist +>>> keywords + ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] +``` + +### 5. Изучение встроенных идентификаторов. + +Вывел в консоль список встроенных идентификаторов: + +``` py +>>> import builtins +>>> dir(builtins) + ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BaseExceptionGroup', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'ExceptionGroup', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] +``` + +В данном списке содержатся имена некоторых встроенных функций, работа которых, проверена ниже: + +```py +>>> abs(-100) # Взятие модуля аргумента + 100 +>>> len("Text") # Расчет длины объекта + 4 +>>> max(1, 2, 3) # Поиск максимального числа + 3 +>>> min(0, -5, 10) # Поиск минимального числа + -5 +>>> pow(2, 3) # При передаче 2 аргументов - возведение в степень, + 8 # При передаче 3 аргументов - возведение в степень и поиск остатка от деления +>>> round(2.75) # Округление до количества цифр после запятой, переданного во 2 аргументе + 3 +>>> sorted([3, 2, 5, 1, 4]) # Сортировка по возрастанию (при reverse = True - по убыванию) + [1, 2, 3, 4, 5] +>>> list(zip("abcdef", [1, 2, 3, 4])) # Попарное объединение элементов + [('a', 1), ('b', 2), ('c', 3), ('d', 4)] +``` +### 6. Проверка имён объектов на чувствительность к регистру. + +Убедился, что имена объектов в Python являются регистрочувствительными: + +```py +>>> Gg1 = 45 +>>> gg1 + Traceback (most recent call last): + File "", line 1, in + gg1 + NameError: name 'gg1' is not defined. Did you mean: 'Gg1'? +>>> Gg1 + 45 +``` + +### 7. Изучение простых типов объектов. + +#### 7.1. Изучение логического типа (bool). + +Пример создания объектов логического типа: + +```py +>>> bb1 = True; bb2 = False +>>> bb1;bb2 + True + False +>>> type(bb1) + +``` + +#### 7.2. Изучение остальных простых типов. + +Рассмотрел остальные простые типы, такие как int (целые числа), float (вещественные числа) и complex (комплексные числа): + +```py +>>> ii1 = 1234567890 +>>> ff1 = -8.9876e-12 # Экспоненциальная форма записи вещественного числа +>>> dv1 = 0b1101010 # Двоичное число +>>> vsm1 = 0o52765 # Восьмеричное число +>>> shest1 = 0x7109af6 # Шестнадцатеричное число +>>> type(dv1), type(vsm1), type(shest1) + (, , ) # Числа в различных системах счисления всё равно сохраняются как int +>>> cc1 = 2 - 3j +>>> a = 3.67; b = -0.45 +>>> cc2 = complex(a, b) # Комплексное число +``` + +#### 7.3. Изучение строкового типа (str). + +Строки символов можно заключать в одинарные или двойные кавычки: + +```py +>>> ss1 = "Это - строка символов" +>>> print(ss1) + Это - строка символов +``` + +Внутри строк могут присутствовать экранированные последовательности, начинающиеся со знака "\", что позволяет использовать в строках специальные символы: + +```py +>>> ss1a = "Это - \" строка символов \", \n \t выводимая на двух строках " +>>> print(ss1a) + Это - " строка символов ", + выводимая на двух строках +>>> ss1b = "Меня зовут: \n Степанов А. В." +>>> print(ss1b) + Меня зовут: + Степанов А. В. +``` + +С помощью тройных кавыче можно задавать многострочные строки, ввод которых будет продолжаться, пока вновь не будут введены тройные кавычки: + +```py +>>> mnogo="""Нетрудно заметить , что в результате операции + над числами разных типов получается число, + имеющее более сложный тип из тех, которые участвуют в операции.""" +>>> print(mnogo) + Нетрудно заметить , что в результате операции + над числами разных типов получается число, + имеющее более сложный тип из тех, которые участвуют в операции. +``` + +Символьные строки в Python индексируются, поэтому к определенным сиволам или последовательностям символов внутри них можно обращаться по индексам: + +```py +>>> ss1[0] # Это – символ «Э» + 'Э' +>>> ss1[8] # А это – символ «р» + 'р' +>>> ss1[-2] # А это – символ «о» (отсчет идет с конца строки) + 'о' +>>> ss1[6:9] # Это часть строки – символы с 6-го индекса по 8-й + 'стр' +>>> ss1[13:] # Это часть строки – с 13-го индекса и до конца + 'символов' +>>> ss1[:13] # Это часть строки – с начала и до 12-го индекса включительно + 'Это - строка ' +>>> ss1[5:-8] # Это часть строки – с 5-го индекса и до 8-го от конца + ' строка ' +>>> ss1[3:17:2] # Часть строки – с 3-го по 16-й индексы с шагом 2 + ' тоасм' +>>> ss1[17:3:-2] # Часть строки – с 3-го по 16-й индексы с обратным шагом 2 + 'омсаот ' +>>> ss1[-4:3:-2] # Часть строки – с 4-го с конца по 3-й с начала индексы с обратным шагом 2 + 'омсаот ' +>>> ss1[4] = "=" # Будет диагностика + Traceback (most recent call last): + File "", line 1, in + ss1[4] = "=" + TypeError: 'str' object does not support item assignment +>>> ss1 = ss1[:4] + "=" + ss1[5:] # Возможно, но будет переопределение строки + print(ss1) + Это = строка символов +``` + +Для закрепления изучения простых типов создал 4 разных объекта, после чего вывел их типы и значения в консоль: + +```py +>>> a = 1; b = 2.3; c = "text"; d = 1 + 1j +>>> [type(a), type(b), type(c), type(d)] # Вывод типов + [, , , ] +>>> a, b, c, d # Вывод значений + (1, 2.3, 'text', (1+1j)) +``` + +### 8. Изучение сложных типов объектов. + +#### 8.1. Изучение списков. + +Рассмотрел такой объект Python, как списки - упорядоченные по местоположению коллекции объектов произвольных типов, размер которых практически не ограничен: + +```py +>>> spis1 = [111, "Spisok", 5 - 9j] +>>> stup = [0,0,1,1,1,1,1,1,1] +>>> spis = [1, 2, 3, 4, + 5, 6, 7, + 8, 9, 10] +``` + +Списки в Python индексируются так же как и строки: + +```py +>>> spis1[-1] # Если индекс отрицательный, то он отсчитывается с конца, но не с 0, а с 1 + (5-9j) +>>> stup[-8::2] # Вывод элементов с 8-го индекса с конца с шагом 2 + [0, 1, 1, 1] +``` + +Элементы списков можно изменять: + +```py +>>> spis1[1] = "Список" +>>> print(spis1) + [111, 'Список', (5-9j)] +``` + +Методы объекта находятся в списке его атрибутов, поэтому для их просмотра нужно опять вводить функцию dir(), а описание какого-либо метода можно получить с помощью функции help(<название метода>): + +```py +>>> dir(spis1) + ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] +>>> len(spis1) # Расчет длины спсика + 3 +>>> help(spis1.append) + Help on built-in function append: + + append(object, /) method of builtins.list instance + Append object to the end of the list. +``` + +С помощью методов объектов-списков можно добавлять или удалять элементы: + +``` py +>>> spis1.append("New item") # В конец списка добавляется элемент "New item" +>>> print(spis1) + [111, 'Список', (5-9j), 'New item'] +>>> spis1 + ["Second new item"] # Конкатенация (Исходный список не изменился) + [111, 'Список', (5-9j), 'New item', 'Second new item'] +>>> spis1.append(ss1b) +>>> print(spis1) + [111, 'Список', (5-9j), 'New item', 'Меня зовут: \n Степанов А. В.'] +>>> spis1.pop(1) # Удаление элемента из списка с индексом - переданным аргументом + 'Список' +>>> spis1 + [111, (5-9j), 'New item', 'Second new item', 'Меня зовут: \n Степанов А. В.'] +``` + +Рассмотрел остальные методы объектов-списков: + +```py +>>> list = [1, 2, 3, 4] +>>> list.insert(1, 3) # Вставка второго аргумента на индекс, определяемый первым аргументом +>>> print(list) + [1, 3, 2, 3, 4] +>>> list.remove(3) # Удаление первого вхождения элемента, соответствующего переданному аргументу +>>> print(list) + [1, 2, 3, 4] +>>> list.extend(list[:2]) # Продление списка +>>> print(list) + [1, 2, 3, 4, 1, 2] +>>> list.sort() # Сортировка элементов списка +>>> print(list) + [1, 1, 2, 2, 3, 4] +>>> list.reverse() # Изменение порядка следования элементов списка на противоположный +>>> print(list) + [4, 3, 2, 2, 1, 1] +>>> list.copy() # Создание копии списка + [4, 3, 2, 2, 1, 1] +>>> list.count(2) # Подсчет вхождений в список для элемента, переданного в качестве аргумента + 2 +>>> list.index(3) # Вывод индекса в списке для элемента, соответствующего переданному аргументу + 1 +``` + +Списки также могут быть вложенными, то есть включать в себя другие списки: + +```py +>>> spis3 = [1, 2, 3] +>>> spis2 = [spis3, [4, 5, 6, 7]] +>>> spis2[0][1] = 78 +>>> print(spis2) + [[1, 78, 3], [4, 5, 6, 7]] +>>> print(spis3) + [1, 78, 3] +``` + +Создал свой объект-список с элементами разных типов (число, строка, логическое значение и список): + +```py +>>> spisok = [123, "Text", True, [1, 2 ,3]] +>>> print(spisok) + [123, 'Text', True, [1, 2, 3]] +``` + +#### 8.2. Изучение кортежей. + +Объекты-кортежи очень похожи на списки, но их нельзя изменять, также литерал кортежа заключается в круглые скобки, а не в квадратные как у списков. В примере ниже рассмотрены варианты создания кортежей и их 2 основных метода: + +```py +>>> kort1 = (222, "Kortezh", 77 + 8j) +>>> kort1 = kort1 + (1, 2) +>>> print(kort1) + (222, 'Kortezh', (77+8j), 1, 2) +>>> kort1 = kort1 + (ss1b,) +>>> print(kort1) + (222, 'Kortezh', (77+8j), 1, 2, 'Меня зовут: \n Степанов А. В.') +>>> kort2 = kort1[:2] + kort1[3:] +>>> print(kort2) + (222, 'Kortezh', 1, 2, 'Меня зовут: \n Степанов А. В.') +>>> kort1.index(2) + 4 +>>> kort1.count(222) + 1 +``` + +Так как кортежи нельзя изменять, то попытка присвоения нового значения элементу кортежа обернется ошибкой: + +```py +>>> kort1[2] = 90 + Traceback (most recent call last): + File "", line 1, in + kort1[2] = 90 + TypeError: 'tuple' object does not support item assignment +``` + +Создал свой объект-кортеж, в котором все элементы разного типа: + +```py +>>> kort3 = (123, "Text", [1, 2, 3], (1, 2, 3)) +>>> print(kort3) + (123, 'Text', [1, 2, 3], (1, 2, 3)) +``` + +#### 8.3. Изучение словарей. + +Объект-словарь представляет из себя набор пар «ключ-значение», причем в качестве ключей могут использоваться неизменяемые типы объектов, а в виде значений - объекты любых типов: + +```py +>>> dic1 = {"Saratov" : 145, "Orel" : 56, "Vologda" : 45} +>>> dic1["Orel"] # Обращение к элементам словаря осуществляется по ключам, а не по индексам + 56 +>>> dic1["Pskov"] = 78 # Добавление нового элемента в словарь +>>> print(dic1) + {'Saratov': 145, 'Orel': 56, 'Vologda': 45, 'Pskov': 78} +``` + +К ключам словаря можно обратиться с помощью метода keys(), а к значениям - с помощью метода values(): + +```py +>>> sorted(dic1.keys()) + ['Orel', 'Pskov', 'Saratov', 'Vologda'] +>>> sorted(dic1.values()) + [45, 56, 78, 145] +``` + +Элементы словаря также могут быть словарями: + +```py +>>> dic2 = {1 : "mean", 2 : "standart deviation", 3 : "correlation"} +>>> dic3 = {"statistics" : dic2, "POAS" : ["base", "elementary", "programming"]} +>>> dic3["statistics"][2] + 'standart deviation' +``` + +С помощью функции dict() можно создавать словарь из списка с элементами-кортежами: + +```py +>>> dic4 = dict([(1, ["A", "B", "C"]), (2, [4, 5]), ("Q", "Prim"), ("Stroka", ss1b)]) +>>> print(dic4) + {1: ['A', 'B', 'C'], 2: [4, 5], 'Q': 'Prim', 'Stroka': 'Меня зовут: \n Степанов А. В.'} +``` + +Также с помощью этой функции и функции zip() можно создавать словари и просто из двух списков: + +```py +>>> dic5 = dict(zip(["A", "B", "C", "Stroka"], [16, -3, 9, ss1b])) +>>> print(dic5) + {'A': 16, 'B': -3, 'C': 9, 'Stroka': 'Меня зовут: \n Степанов А. В.'} +``` + +Так как элементы словаря являются парами «ключ-значение», то каждому ключу должно соответствовать своё значение, поэтому, если при создании словаря число ключей не равно числу значений, то словарь создастся с количеством элементов, равным наименьшей из длин списка ключей или списка значений: + +```py +>>> cort = (1, 2, 3, 4, 5, 6, 7) +>>> spisok = ["A", "B", "C", "D", "E"] +>>> dictionary = dict(zip(cort, spisok)) +>>> print(dictionary) + {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'} +``` + +Пример словаря с описанием состава студентов, обучающихся на АВТИ: + +```py +>>> AVTI = {"Курс I" : [22, 23, 17, 24, 30, 29, 28, 25, 23, 0, 4, 31, 30, 33, 18, 12, 27], + "Курс II" : [18, 16, 12, 15, 29, 18, 21, 23, 13, 0, 4, 20, 31, 26, 16], + "Курс III" : [17, 12, 0, 6, 17, 15, 19, 19, 0, 0, 5, 17, 22, 18, 12], + "Курс IV" : [27, 16, 0, 13, 17, 15, 19, 20, 0, 0, 2, 15, 18, 16, 17]} +>>> print(AVTI["Курс III"][5]) + 15 +``` + +#### 8.4. Изучение объектов-множеств. + +Объекты-множества – это неупорядоченные совокупности неповторяющихся элементов неизменяемых типов. Пример создания такого объекта: + +```py +>>> mnoz1 = {"двигатель", "датчик", "линия связи", "датчик", "микропроцессор", "двигатель"} + # Дубликаты элементов в множестве удаляются автоматически +>>> print(mnoz1) + {'микропроцессор', 'линия связи', 'датчик', 'двигатель'} +``` + +Некоторые операции с множествами: + +```py +>>> len(mnoz1) # Определение числа элементов + 4 +>>> "датчик" in mnoz1 # Проверка наличия элемента в множестве + True +>>> mnoz1.add("реле") # Добавление элемента в множество +>>> print(mnoz1) + {'линия связи', 'двигатель', 'микропроцессор', 'реле', 'датчик'} +>>> mnoz1.remove("линия связи") # Удаление элемента из множества +>>> print(mnoz1) + {'двигатель', 'микропроцессор', 'реле', 'датчик'} +``` + +Придумал свой объект-множество с элементами разных типов и выполнил над ним некоторые операции: + +```py +>>> mnozhestvo = {123, "Text", (1, 2, 3)} +>>> mnozhestvo.add(100) +>>> mnozhestvo.remove(123) +>>> print(mnozhestvo) + {'Text', (1, 2, 3), 100} +``` + +### 9. Завершение работы со средой. + +Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE. diff --git a/TEMA2/report.py b/TEMA2/report.py new file mode 100644 index 0000000..f05775d --- /dev/null +++ b/TEMA2/report.py @@ -0,0 +1,236 @@ +# Протокол по Теме 2 Степанов Артём Владимирович + +#################### +print("\nИзучение простых объектов\n") +#################### + +f1 = 16; f2 = 3 +print("f1 = ", f1, "\nf2 = ", f2) + +print("dir(): \n", dir()) # Просмотр объектов, существующих в среде на данный момент +print("dir(f1): \n", dir(f1)) # Получение списка атрибутов объекта f1 +print("type(f2): \n", type(f2)) # Определение классовой принадлежности объекта f2 +del f1, f2 # Удаление объектов f1 и f2 из оперативной памяти +print("dir() after del: \n", dir()) + +#################### +print("\nИзучение правил наименования объектов\n") +#################### + +gg1 = 1.6 # Значение в виде вещественного числа +hh1 = "Строка" # Значение в виде символьной строки +#73sr = 3 # Неправильное имя – начинается с цифры - будет диагностика! +#and = 7 # Недопустимое имя – совпадает с ключевым словом - будет диагностика! +print("gg1 = ", gg1) +print("hh1 = ", hh1) +print("73sr = ОШИБКА") +print("and = ОШИБКА") + +#################### +print("\nПросмотр и сохранение ключевых слов объекта\n") +#################### + +import keyword +print("keyword.kwlist: \n", keyword.kwlist) +keywords = keyword.kwlist +print("keywords: \n", keywords) + +#################### +print("\nИзучение встроенных идентификаторов\n") +#################### + +import builtins +print("dir(builtins): \n", dir(builtins)) + +print("abs(-100): ", abs(-100)) +print("len(Text): ", len("Text")) +print("max(1, 2, 3): ", max(1, 2, 3)) +print("min(0, -5, 10): ", min(0, -5, 10)) +print("pow(2, 3): ", pow(2, 3)) +print("round(2.75): ", round(2.75)) +print("sorted([3, 2, 5, 1, 4]): ", sorted([3, 2, 5, 1, 4])) +print("list(zip(\"abcdef\", [1, 2, 3, 4])): ", list(zip("abcdef", [1, 2, 3, 4]))) + +#################### +print("\nПроверка имён на чувствительность к регистру\n") +#################### + +Gg1 = 45 +#print("gg1 = ", gg1) +print("Gg1 = ", Gg1) + +#################### +print("\nИзучение логического типа\n") +#################### + +bb1 = True; bb2 = False +print(bb1, bb2) +print("type(bb1): ", type(bb1)); + +#################### +print("\nИзучение остальных простых типов\n") +#################### + +ii1 = 1234567890 +print("ii1 = ", ii1) +ff1 = -8.9876e-12 # Экспоненциальная форма записи вещественного числа +print("ff1 = ", ff1) +dv1 = 0b1101010 # Двоичное число +print("dv1 = ", dv1) +vsm1 = 0o52765 # Восьмеричное число +print("vsm1 = ", vsm1) +shest1 = 0x7109af6 # Шестнадцатеричное число +print("shest1 = ", shest1) +print("type(dv1), type(vsm1), type(shest1) : \n", type(dv1), type(vsm1), type(shest1)) +cc1 = 2 - 3j +print("cc1 = ", cc1) +a = 3.67; b = -0.45 +cc2 = complex(a, b) # Комплексное число +print("cc2 = a - b*j = ", cc2) + +#################### +print("\nИзучение строкового типа\n") +#################### + +ss1 = "Это - строка символов" +print("ss1 = ", ss1) +ss1a = "Это - \" строка символов \", \n \t выводимая на двух строках " +print("ss1a = ", ss1a) + +ss1b = "Меня зовут: \n Степанов А. В." +print(ss1b) + +mnogo="""Нетрудно заметить , что в результате операции +над числами разных типов получается число, +имеющее более сложный тип из тех, которые участвуют в операции.""" +print(mnogo) +print(ss1[0]) # Это – символ «Э» +print(ss1[8]) # А это – символ «р» +print(ss1[-2]) # А это – символ «о» (отсчет идет с конца строки) +print(ss1[6:9]) # Это часть строки – символы с 6-го индекса по 8-й +print(ss1[13:]) # Это часть строки – с 13-го индекса и до конца +print(ss1[:13]) # Это часть строки – с начала и до 12-го индекса включительно +print(ss1[5:-8]) # Это часть строки – с 5-го индекса и до 8-го от конца +print(ss1[3:17:2]) # Часть строки – с 3-го по 16-й индексы с шагом 2 +print(ss1[17:3:-2]) # Часть строки – с 17-го по 3-й индексы с шагом 2 +print(ss1[-4:3:-2]) # Часть строки с 4-го с конца по 3-й с начала индексы с шагом 2 +#ss1[4] = "=" # Будет диагностика +ss1 = ss1[:4] + "=" + ss1[5:] # Возможно, но будет переопределение строки +print(ss1) +a = 1; b = 2.3; c = "text"; d = 1 + 1j +print("a = 1; b = 2.3; c = \"text\"; d = 1 + 1j") +print(type(a), type(b), type(c), type(d)) +print(a, b, c, d) + +#################### +print("\nИзучение списков\n") +#################### + +spis1 = [111, "Spisok", 5 - 9j] +stup = [0,0,1,1,1,1,1,1,1] +spis = [1, 2, 3, 4, + 5, 6, 7, + 8, 9, 10] +spis1[1] = "Список" +print("spis1 = ", spis1) +print("len(spis1): ", len(spis1)) +print("dir(spis1): \n", dir(spis1)) +help(spis1.append) +spis1.append("New item") +print("spis1.append(\"New item\"): ", spis1) +spis1 += ["Second new item"] +print("spis1 += [\"Second new item\"]: ", spis1) +spis1.append(ss1b) +print("spis1.append(ss1b): ", spis1) +spis1.pop(1) +print("spis1.pop(1): ", spis1) +list = [1, 2, 3, 4] +print("list = ", list) +list.insert(1, 3) +print("list.insert(1, 3): ", list) +list.remove(3) +print("list.remove(3): ", list) +list.extend(list[:2]) +print("list.extend(list[:2]): ", list) +list.sort() +print("list.sort(): ", list) +list.reverse() +print("list.reverse(): ", list) +print("list.copy(): ", list.copy()) +print("list.count(2): ", list.count(2)) +print("list.index(3): ", list.index(3)) +spis3 = [1, 2, 3] +print("spis3 = [1, 2, 3]") +spis2 = [spis3, [4, 5, 6, 7]] +print("spis2 = [spis3, [4, 5, 6, 7]]") +spis2[0][1] = 78 +print("spis2[0][1] = 78: ", spis2) +print("spis3 = ", spis3) +spisok = [123, "Text", True, [1, 2 ,3]] +print("spisok = [123, \"Text\", True, [1, 2 ,3]]: \nspisok: ", spisok) + +#################### +print("\nИзучение кортежей\n") +#################### + +kort1 = (222, "Kortezh", 77 + 8j) +kort1 = kort1 + (1, 2) +print("kort1 = kort1 + (1, 2): ", kort1) +kort1 = kort1 + (ss1b,) +print("kort1 = kort1 + (ss1b,): ", kort1) +kort2 = kort1[:2] + kort1[3:] +print("kort2 = kort1[:2] + kort1[3:]: ", kort2) +print("kort1.index(2): ", kort1.index(2)) +print("kort1.count(222): ", kort1.count(222)) +#kort1[2] = 90 +kort3 = (123, "Text", [1, 2, 3], (1, 2, 3)) +print("kort3 = ", kort3) + +#################### +print("\nИзучение словарей\n") +#################### + +dic1 = {"Saratov" : 145, "Orel" : 56, "Vologda" : 45} +print("dic1[\"Orel\"] = ", dic1["Orel"]) +dic1["Pskov"] = 78 +print("dic1 = ", dic1) +print("sorted(dic1.keys()): ", sorted(dic1.keys())) +print("sorted(dic1.values()): ", sorted(dic1.values())) +dic2 = {1 : "mean", 2 : "standart deviation", 3 : "correlation"} +dic3 = {"statistics" : dic2, "POAS" : ["base", "elementary", "programming"]} +print("dic3[\"statistics\"][2]: ", dic3["statistics"][2]) +dic4 = dict([(1, ["A", "B", "C"]), (2, [4, 5]), ("Q", "Prim"), ("Stroka", ss1b)]) +print("dic4 = ", dic4) +dic5 = dict(zip(["A", "B", "C", "Stroka"], [16, -3, 9, ss1b])) +print("dic5 = ", dic5) + +cort = (1, 2, 3, 4, 5, 6, 7) +spisok = ["A", "B", "C", "D", "E"] +dictionary = dict(zip(cort, spisok)) +print("dictionary = dict(zip(cort, spisok)) = ", dictionary) + +AVTI = {"Курс I" : [22, 23, 17, 24, 30, 29, 28, 25, 23, 0, 4, 31, 30, 33, 18, 12, 27], + "Курс II" : [18, 16, 12, 15, 29, 18, 21, 23, 13, 0, 4, 20, 31, 26, 16], + "Курс III" : [17, 12, 0, 6, 17, 15, 19, 19, 0, 0, 5, 17, 22, 18, 12], + "Курс IV" : [27, 16, 0, 13, 17, 15, 19, 20, 0, 0, 2, 15, 18, 16, 17]} +print("AVTI[\"Курс III\"][5] = ", AVTI["Курс III"][5]) + +#################### +print("\nИзучение объектов-множеств\n") +#################### + +mnoz1 = {"двигатель", "датчик", "линия связи", "датчик", "микропроцессор", "двигатель"} +print("mnoz1 = ", mnoz1) +print("len(mnoz1): ", len(mnoz1)) +print("\"датчик\" in mnoz1: ", "датчик" in mnoz1) +mnoz1.add("реле") +print("mnoz1.add(\"реле\"): ", mnoz1) +mnoz1.remove("линия связи") +print("mnoz1.remove(\"линия связи\"): ", mnoz1) + +mnozhestvo = {123, "Text", (1, 2, 3)} +mnozhestvo.add(100) +mnozhestvo.remove(123) +print("mnozhestvo = ", mnozhestvo) +{'Text', (1, 2, 3), 100} + diff --git a/TEMA2/task.md b/TEMA2/task.md new file mode 100644 index 0000000..0e878e6 --- /dev/null +++ b/TEMA2/task.md @@ -0,0 +1,49 @@ +# Общее контрольное задание по теме 2 + +Степанов Артём, А-02-23 + +## Задание + +Реализовать, записать в текстовый файл и проанализировать результаты последовательности инструкций, выполняющих следующие действия: +* Создать переменную с именем familia и со значением - символьной строкой – своей фамилией в латинской транскрипции. +* Создать переменную со значением, совпадающим с первой буквой из familia. +* Создать переменную с именем sp_kw со значением – списком всей ключевых слов языка Python. +* Удалите из списка sp_kw значение 'nonlocal'. Выводом списка в командном окне IDLE убедитесь, что это значение удалено из списка. +* Создайте кортеж kort_nam с именами: вашим и еще 3-х студентов из вашей группы. Напишите инструкцию, позволяющую убедиться, что тип переменной – это tuple. +* Напишите инструкцию, добавляющую в kort_nam имена еще двух студентов. +* Напишите инструкцию, позволяющую определить, сколько раз в кортеже присутствуют студенты с именем «Дима». +* Создайте словарь dict_bas, в котором ключами являются русские названия типов переменных, использованных в предыдущих операторах, а значениями – ранее созданные переменные, соответствующие этим типам. + + +## Решение + +```py +>>> familia = "Artyom" +>>> firstLetter = familia[0] +>>> print(firstLetter) + A +>>> import keyword +>>> sp_kw = keyword.kwlist +>>> print(sp_kw) + ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] +>>> sp_kw.remove("nonlocal") +>>> print(sp_kw) + ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] +>>> kort_nam = ("Artyom", "Dima", "Alyona", "Yuriy") +>>> type(kort_nam) + +>>> kort_nam += ("Denis", "Lena") +>>> print(kort_nam) + ('Artyom', 'Dima', 'Alyona', 'Yuriy', 'Denis', 'Lena') +>>> kort_nam.count("Dima") + 1 +>>> for key in dict_bas.keys(): + print(key, ":\n\t", dict_bas[key]) + + Строка : + ['Artyom', 'A'] + Список : + ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] + Кортеж : + ('Artyom', 'Dima', 'Alyona', 'Yuriy', 'Denis', 'Lena') +``` \ No newline at end of file