From 7ea96ca644a036d9c6fddd81d46a7c1c6534b35d Mon Sep 17 00:00:00 2001 From: TerekhovFV Date: Fri, 26 Sep 2025 09:58:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEMA2/control_task.py | 29 + TEMA2/images/control_task.png | Bin 0 -> 39729 bytes TEMA2/report.md | 1034 ++++++++++++++++----------------- 3 files changed, 539 insertions(+), 524 deletions(-) create mode 100644 TEMA2/control_task.py create mode 100644 TEMA2/images/control_task.png diff --git a/TEMA2/control_task.py b/TEMA2/control_task.py new file mode 100644 index 0000000..9ddec24 --- /dev/null +++ b/TEMA2/control_task.py @@ -0,0 +1,29 @@ +import keyword + +familia = "Terekhov" +first_letter = familia[0] + +sp_kw = list(keyword.kwlist) + +kort_nam = ("Фёдор", "Дима", "Вадим", "Екатерина") +is_tuple = (type(kort_nam) is tuple) +kort_nam = kort_nam + ("Павел", "Иван") +count_dima = kort_nam.count("Дима") + +dict_bas = { + "строка": familia, + "символ (строка из 1 буквы)": first_letter, + "список": sp_kw, + "кортеж": kort_nam, + "логический": is_tuple, +} + +print(f"familia = {familia}") +print(f"first_letter = {first_letter}") +print(f"sp_kw (без 'nonlocal') содержит {len(sp_kw)} ключевых слов") +print(f"Проверка типа kort_nam — tuple: {is_tuple}") +print(f"kort_nam = {kort_nam}") +print(f"Количество вхождений 'Дима' в kort_nam: {count_dima}") +print("dict_bas (ключи → значение):") +for k in dict_bas: + print(f" {k}: {dict_bas[k]}") diff --git a/TEMA2/images/control_task.png b/TEMA2/images/control_task.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ebd0112692d360bf64c93023d58ce408a843b GIT binary patch literal 39729 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 literal 0 HcmV?d00001 diff --git a/TEMA2/report.md b/TEMA2/report.md index 3681141..885139f 100644 --- a/TEMA2/report.md +++ b/TEMA2/report.md @@ -1,735 +1,721 @@ # Отчет по теме 2 Терехов Фёдор Валерьевич, А-01-23 - + ## 1. Изучение простых объектов. -1. _"Для того, чтобы узнать, какое значение имеет переменная, достаточно перечислить их имена в строке, разделяя их знаком «,» (запятая) или «;» (точка с запятой)."_ +1. _"Для того, чтобы узнать, какое значение имеет переменная, достаточно перечислить их имена в строке, разделяя их знаком «,» (запятая) или «;» (точка с запятой)."_ ->f1=16; f2=3 ->print("Значения переменных через запятую:") ->print(f1, f2) -> ->print("\nЗначения переменных через точку с запятой:") ->print(f1); print(f2) +> f1=16; f2=3 +> print("Значения переменных через запятую:") +> print(f1, f2) +> +> print("\nЗначения переменных через точку с запятой:") +> print(f1); print(f2) -Ответ программы: -![Task 1.1](images/Task1_1.png) +Ответ программы:![Task 1.1](images/Task1_1.png) -2. _"Для того, чтобы узнать, какие объекты уже существуют в данный момент в среде Python (в пространстве имен), используйте функцию dir без аргументов."_ +2. _"Для того, чтобы узнать, какие объекты уже существуют в данный момент в среде Python (в пространстве имен), используйте функцию dir без аргументов."_ ->print("\nСуществующие объекты в пространстве имен:") ->print(dir()) +> print("\nСуществующие объекты в пространстве имен:") +> print(dir()) -Ответ программы: -![Task 1.2](images/Task1_2.png) +Ответ программы:![Task 1.2](images/Task1_2.png) -3. _"Для получения списка атрибутов любого объекта используйте ту же функцию dir(), с аргументами – именами интересующих объектов"_ +3. _"Для получения списка атрибутов любого объекта используйте ту же функцию dir(), с аргументами – именами интересующих объектов"_ ->print("\nАтрибуты объекта f1:") ->print(dir(f1)) -> ->print("\nАтрибуты объекта f2:") ->print(dir(f2)) +> print("\nАтрибуты объекта f1:") +> print(dir(f1)) +> +> print("\nАтрибуты объекта f2:") +> print(dir(f2)) -Ответ программы: -![Task 1.3](images/Task1_3.png) +Ответ программы:![Task 1.3](images/Task1_3.png) -4. _"Для определения классовой принадлежности любого объекта следует использовать функцию type()."_ +4. _"Для определения классовой принадлежности любого объекта следует использовать функцию type()."_ ->print(f"\nТип f1: {type(f1)}") #f перед текстом обозначает строку, переменные пишутся в {} ->print(f"Тип f2: {type(f2)}") +> print(f"\nТип f1: {type(f1)}") #f перед текстом обозначает строку, переменные пишутся в {} +> print(f"Тип f2: {type(f2)}") -Ответ программы: -![Task 1.4](images/Task1_4.png) +Ответ программы:![Task 1.4](images/Task1_4.png) 5. _"Для удаления объекта или его части из оперативной памяти используйте инструкцию del."_ ->print("\nУдаляем объекты f1 и f2...") ->del f1, f2 -> ->print("\nСуществующие объекты в пространстве имен ПОСЛЕ удаления:") ->print(dir()) -> ->print("\nПопытка обратиться к удаленным объектам:") ->print(f1) +> print("\nУдаляем объекты f1 и f2...") +> del f1, f2 +> +> print("\nСуществующие объекты в пространстве имен ПОСЛЕ удаления:") +> print(dir()) +> +> print("\nПопытка обратиться к удаленным объектам:") +> print(f1) -Ответ программы: -![Task 1.5](images/Task1_5.png) - -## 2. Изучение правил именования объектов в Python. -_"Правила именования: - • имена должны состоять из латинских букв, цифр и символов подчеркивания; - • имена должны начинаться с латинской буквы (иногда могут начинаться с символа подчеркивания, но это – особый вид переменных); - • имена не должны совпадать с ключевыми словами и встроенными идентификаторами языка Python; - • большие и малые буквы в именах различаются (имена – чувствительные к регистру)!"_ - ->gg1=1.6 #значение в виде вещественного числа ->hh1='Строка' #значение в виде символьной строки ->73sr=3 #неправильное имя – начинается с цифры - будет диагностика! ->and=7 #недопустимое имя – совпадает с ключевым словом - будет диагностика! +Ответ программы: +![Task 1.5](images/Task1_5.png) -Ответ программы: -![Task 2.1](images/Task2_1.png) -![Task 2.2](images/Task2_2.png) - -## 3. Вывод списка ключевых слов с помощью инструкции import keyword && keyword.kwlist ->import keyword -> ->print("Список ключевых слов Python:") ->print(keyword.kwlist) -![Task 3.1](images/Task3_1.png) -Сохранение списка в переменной: ->keywords_list = keyword.kwlist ->print("\nСохранение в виде списка:") ->print(keywords_list) -![Task 3.2](images/Task3_2.png) - -## 4. Вывод списка встроенных идентификаторов с помощью инструкций import builtins && dir(builtins) ->import builtins -> ->print("Список встроенных идентификаторов Python:") ->builtins_list = dir(builtins) ->print(builtins_list) +## 2. Изучение правил именования объектов в Python. -![Task 4.1](images/Task4_1.png) +_"Правила именования: +• имена должны состоять из латинских букв, цифр и символов подчеркивания; +• имена должны начинаться с латинской буквы (иногда могут начинаться с символа подчеркивания, но это – особый вид переменных); +• имена не должны совпадать с ключевыми словами и встроенными идентификаторами языка Python; +• большие и малые буквы в именах различаются (имена – чувствительные к регистру)!"_ ->print("Справка по функциям:") ->print("\n1. Функция abs():") ->help(abs) +> gg1=1.6 #значение в виде вещественного числа +> hh1='Строка' #значение в виде символьной строки +> 73sr=3 #неправильное имя – начинается с цифры - будет диагностика! +> and=7 #недопустимое имя – совпадает с ключевым словом - будет диагностика! -![Task 4.2.1](images/Task4_2_1.png) +Ответ программы: +![Task 2.1](images/Task2_1.png) +![Task 2.2](images/Task2_2.png) ->print("\n2. Функция len():") ->help(len) +## 3. Вывод списка ключевых слов с помощью инструкции import keyword && keyword.kwlist -![Task 4.2.2](images/Task4_2_2.png) +> import keyword +> +> print("Список ключевых слов Python:") +> print(keyword.kwlist) +> ![Task 3.1](images/Task3_1.png) +> Сохранение списка в переменной: +> keywords_list = keyword.kwlist +> print("\nСохранение в виде списка:") +> print(keywords_list) +> ![Task 3.2](images/Task3_2.png) ->print("\n3. Функция max():") ->help(max) +## 4. Вывод списка встроенных идентификаторов с помощью инструкций import builtins && dir(builtins) -![Task 4.2.3](images/Task4_2_3.png) +> import builtins +> +> print("Список встроенных идентификаторов Python:") +> builtins_list = dir(builtins) +> print(builtins_list) ->print("\n4. Функция min():") ->help(min) +![Task 4.1](images/Task4_1.png) -![Task 4.2.4](images/Task4_2_4.png) +> print("Справка по функциям:") +> print("\n1. Функция abs():") +> help(abs) ->print("\n5. Функция pow():") ->help(pow) +![Task 4.2.1](images/Task4_2_1.png) -![Task 4.2.5](images/Task4_2_5.png) +> print("\n2. Функция len():") +> help(len) ->print("\n6. Функция round():") ->help(round) +![Task 4.2.2](images/Task4_2_2.png) -![Task 4.2.6](images/Task4_2_6.png) +> print("\n3. Функция max():") +> help(max) ->print("\n7. Функция sorted():") ->help(sorted) +![Task 4.2.3](images/Task4_2_3.png) -![Task 4.2.7](images/Task4_2_7.png) +> print("\n4. Функция min():") +> help(min) ->print("\n8. Функция sum():") ->help(sum) +![Task 4.2.4](images/Task4_2_4.png) -![Task 4.2.8](images/Task4_2_8.png) +> print("\n5. Функция pow():") +> help(pow) ->print("\n9. Функция zip():") ->help(zip) +![Task 4.2.5](images/Task4_2_5.png) -![Task 4.2.9](images/Task4_2_9.png) - -## 5. Малые и большие буквы в именах объектов различаются. ->Gg1=45 ->print(Gg1) ->print(gg1) +> print("\n6. Функция round():") +> help(round) -Ответ программы: -![Task 5](images/Task5.png) - -## 6. Изучение простых базовых типов объектов: логический (bool), целый (int), вещественный (float), комплексный (complex), строка символов (str). +![Task 4.2.6](images/Task4_2_6.png) -### 6.1. Числовые типы. -1. Логический тип. +> print("\n7. Функция sorted():") +> help(sorted) ->bb1=True ->bb2=False ->print(f"bb1 = {bb1}") ->print(f"bb2 = {bb2}") ->print(f"Класс объекта: {type(bb1)}") +![Task 4.2.7](images/Task4_2_7.png) -Ответ программы: -![Task 6.1.1](images/Task6_1_1.png) +> print("\n8. Функция sum():") +> help(sum) -2. Целочисленный тип. +![Task 4.2.8](images/Task4_2_8.png) ->ii1=-1234567890 ->print(f"\nii1 = {ii1}") ->print(f"Класс объекта: {type(ii1)}") +> print("\n9. Функция zip():") +> help(zip) -Ответ программы: -![Task 6.1.2](images/Task6_1_2.png) +![Task 4.2.9](images/Task4_2_9.png) -3. Экспоненциальная форма записи вещественного числа. +## 5. Малые и большие буквы в именах объектов различаются. ->ff1=-8.9876e-12 ->print(f"\nff1 = {ff1}") ->print(f"Класс объекта: {type(ff1)}") +> Gg1=45 +> print(Gg1) +> print(gg1) -Ответ программы: -![Task 6.1.3](images/Task6_1_3.png) +Ответ программы: +![Task 5](images/Task5.png) -4. Двоичное число. ->dv1=0b1101010 ->print(f"\ndv1 = {dv1}") ->print(f"Класс объекта: {type(dv1)}") +## 6. Изучение простых базовых типов объектов: логический (bool), целый (int), вещественный (float), комплексный (complex), строка символов (str). -Ответ программы: -![Task 6.1.4](images/Task6_1_4.png) +### 6.1. Числовые типы. -5. Восьмеричное число. +1. Логический тип. ->vsm1=0o52765 ->print(f"\nvsm1 = {vsm1}") ->print(f"Класс объекта: {type(vsm1)}") +> bb1=True +> bb2=False +> print(f"bb1 = {bb1}") +> print(f"bb2 = {bb2}") +> print(f"Класс объекта: {type(bb1)}") -Ответ программы: -![Task 6.1.5](images/Task6_1_5.png) +Ответ программы:![Task 6.1.1](images/Task6_1_1.png) -6. Шестнадцатеричное число. +2. Целочисленный тип. ->shest1=0x7109af6 ->print(f"\nshest1 = {shest1}") ->print(f"Класс объекта: {type(shest1)}") +> ii1=-1234567890 +> print(f"\nii1 = {ii1}") +> print(f"Класс объекта: {type(ii1)}") -Ответ программы: -![Task 6.1.6](images/Task6_1_6.png) +Ответ программы:![Task 6.1.2](images/Task6_1_2.png) -7. Комплексное число. +3. Экспоненциальная форма записи вещественного числа. ->cc1=2-3j ->print(f"\ncc1 = {cc1}") ->print(f"Класс объекта: {type(cc1)}") +> ff1=-8.9876e-12 +> print(f"\nff1 = {ff1}") +> print(f"Класс объекта: {type(ff1)}") -Ответ программы: -![Task 6.1.7](images/Task6_1_7.png) +Ответ программы:![Task 6.1.3](images/Task6_1_3.png) -8. Вещественное число. +4. Двоичное число. ->a=3.67 ->b=-0.45 ->print(f"\na = {a}") ->print(f"b = {b}") ->print(f"Класс объекта a: {type(a)}") ->print(f"Класс объекта b: {type(b)}") +> dv1=0b1101010 +> print(f"\ndv1 = {dv1}") +> print(f"Класс объекта: {type(dv1)}") -Ответ программы: -![Task 6.1.8](images/Task6_1_8.png) +Ответ программы:![Task 6.1.4](images/Task6_1_4.png) -9. Альтернативный способ задания комплексного числа. +5. Восьмеричное число. ->cc2=complex(a,b) ->print(f"\ncc2 = {cc2}") ->print(f"Класс объекта cc2: {type(cc2)}") +> vsm1=0o52765 +> print(f"\nvsm1 = {vsm1}") +> print(f"Класс объекта: {type(vsm1)}") -Ответ программы: -![Task 6.1.9](images/Task6_1_9.png) +Ответ программы:![Task 6.1.5](images/Task6_1_5.png) -### 6.2. Строки. +6. Шестнадцатеричное число. +> shest1=0x7109af6 +> print(f"\nshest1 = {shest1}") +> print(f"Класс объекта: {type(shest1)}") -1. *Строки можно заключать в апострофы или в двойные кавычки. Внутри строки символов можно использовать, так называемые, «экранированные последовательности, начинающиеся со знака «\»(обратный слеш), например, \\, \', \", \t, \n и другие.* +Ответ программы:![Task 6.1.6](images/Task6_1_6.png) ->ss1='Это - строка символов' ->print(f"{ss1}\n") ->ss1a="Это - \" строка символов \", \n \t выводимая на двух строках" ->print(ss1a) +7. Комплексное число. -Ответ программы: -![Task 6.2.1](images/Task6_2_1.png) +> cc1=2-3j +> print(f"\ncc1 = {cc1}") +> print(f"Класс объекта: {type(cc1)}") -2. *Создайте строку по шаблону. Выведите получившуюся строку на экран.* +Ответ программы:![Task 6.1.7](images/Task6_1_7.png) ->ss1b= 'Меня зовут: \n TerekhovFV' ->print(ss1b) +8. Вещественное число. -Ответ программы: -![Task 6.2.2](images/Task6_2_2.png) +> a=3.67 +> b=-0.45 +> print(f"\na = {a}") +> print(f"b = {b}") +> print(f"Класс объекта a: {type(a)}") +> print(f"Класс объекта b: {type(b)}") -3. *Многострочные строки можно задавать в виде значения объекта с использованием тройных кавычек. При вводе такой строки символ приглашения в начале строки не появится, пока не будет вновь введены тройные кавычки.* +Ответ программы:![Task 6.1.8](images/Task6_1_8.png) ->mnogo="""Нетрудно заметить , что в результате операции ->над числами разных типов получается число, ->имеющее более сложный тип из тех, которые участвуют в операции.""" ->print(mnogo) +9. Альтернативный способ задания комплексного числа. -Ответ программы: -![Task 6.2.3](images/Task6_2_3.png) +> cc2=complex(a,b) +> print(f"\ncc2 = {cc2}") +> print(f"Класс объекта cc2: {type(cc2)}") -4. *Можно обращаться к частям строки символов с использованием индексов символов по их порядку в строке. При этом надо учитывать, что нумерация символов начинается с 0. При знаке «-»(минус) отсчёт от конца строки.* +Ответ программы: +![Task 6.1.9](images/Task6_1_9.png) ->print(ss1[0]) ->print(ss1[8]) ->print(ss1[-2]) +### 6.2. Строки. -Ответ программы: -![Task 6.2.4](images/Task6_2_4.png) +1. *Строки можно заключать в апострофы или в двойные кавычки. Внутри строки символов можно использовать, так называемые, «экранированные последовательности, начинающиеся со знака «\»(обратный слеш), например, \\, \', \", \t, \n и другие.* -5. *Операция «разрезания» или «создания среза», создающая новый объект. В срезе указываются не позиции элементов, а их индексы и что указываемая правая граница в срез не включается.* +> ss1='Это - строка символов' +> print(f"{ss1}\n") +> ss1a="Это - \" строка символов \", \n \t выводимая на двух строках" +> print(ss1a) ->print(ss1[6:9]) #Это часть строки – символы с 6-го индекса по 8-й (9-й не включается!) ->print(ss1[13:]) #Это часть строки – с 13-го индекса и до конца ->print(ss1[:13]) #Это часть строки – с начала и до 12-го индекса включительно ->print(ss1[5:-8]) #Это часть строки – с 5-го индекса и до 8-го от конца ->print(ss1[3:17:2]) #Часть строки – с 3-го по 16-й индексы с шагом 2 +Ответ программы:![Task 6.2.1](images/Task6_2_1.png) -Ответ программы: -![Task 6.2.5](images/Task6_2_5.png) +2. *Создайте строку по шаблону. Выведите получившуюся строку на экран.* -*При отрицательном значении шага* +> ss1b= 'Меня зовут: \n TerekhovFV' +> print(ss1b) ->print(ss1[17:3:-2]) +Ответ программы:![Task 6.2.2](images/Task6_2_2.png) -Ответ программы: -![Task 6.2.5.1](images/Task6_2_5_1.png) +3. *Многострочные строки можно задавать в виде значения объекта с использованием тройных кавычек. При вводе такой строки символ приглашения в начале строки не появится, пока не будет вновь введены тройные кавычки.* -*Если "17" заменить на "-4", то получим такой же результат.* +> mnogo="""Нетрудно заметить , что в результате операции +> над числами разных типов получается число, +> имеющее более сложный тип из тех, которые участвуют в операции.""" +> print(mnogo) ->print(ss1[-4:3:-2]) +Ответ программы:![Task 6.2.3](images/Task6_2_3.png) -Ответ программы: -![Task 6.2.5.2](images/Task6_2_5_1.png) +4. *Можно обращаться к частям строки символов с использованием индексов символов по их порядку в строке. При этом надо учитывать, что нумерация символов начинается с 0. При знаке «-»(минус) отсчёт от конца строки.* +> print(ss1[0]) +> print(ss1[8]) +> print(ss1[-2]) -6. *Строка является неизменяемым объектом. Однако, можно это сделать по-другому, переопределив строку.* +Ответ программы:![Task 6.2.4](images/Task6_2_4.png) ->ss1[4]='=' +5. *Операция «разрезания» или «создания среза», создающая новый объект. В срезе указываются не позиции элементов, а их индексы и что указываемая правая граница в срез не включается.* -Ответ программы: -![Task 6.2.6.1](images/Task6_2_6_1.png) +> print(ss1[6:9]) #Это часть строки – символы с 6-го индекса по 8-й (9-й не включается!) +> print(ss1[13:]) #Это часть строки – с 13-го индекса и до конца +> print(ss1[:13]) #Это часть строки – с начала и до 12-го индекса включительно +> print(ss1[5:-8]) #Это часть строки – с 5-го индекса и до 8-го от конца +> print(ss1[3:17:2]) #Часть строки – с 3-го по 16-й индексы с шагом 2 ->ss1=ss1[:4]+'='+ss1[5:] ->print(ss1) +Ответ программы: +![Task 6.2.5](images/Task6_2_5.png) -Ответ программы: -![Task 6.2.6.2](images/Task6_2_6_2.png) +*При отрицательном значении шага* -7. *С использованием ранее созданной строки ss1b попробуйте создать объекты с разными срезами исходной строки.* +> print(ss1[17:3:-2]) ->print(ss1b[-10:]) -> ->print("\n") ->ss1b="My name is "+ ss1b[-10:] ->print(ss1b) +Ответ программы: +![Task 6.2.5.1](images/Task6_2_5_1.png) -Ответ программы: -![Task 6.2.7](images/Task6_2_7.png) - -8. *Самостоятельно придумайте значения и создайте объекты разных типов. После этого отобразите типы и значения созданных объектов.* - ->целое_число = 42 ->вещественное_число = 3.14159 ->комплексное_число = 2 + 3j ->строка = "Привет, мир!" ->многострочная_строка = """Это ->многострочная ->строка""" ->логическое_значение = True ->print(целое_число) ->print(вещественное_число) ->print(комплексное_число) ->print(строка) ->print(многострочная_строка) +*Если "17" заменить на "-4", то получим такой же результат.* -Ответ программы: -![Task 6.2.8](images/Task6_2_8.png) - +> print(ss1[-4:3:-2]) -## 7. Изучение более сложных типов объектов: списки (list), кортежи (tuple), словари (dict), множества (set). +Ответ программы:![Task 6.2.5.2](images/Task6_2_5_1.png) -### 7.1. Список. +6. *Строка является неизменяемым объектом. Однако, можно это сделать по-другому, переопределив строку.* -1. *Список – это последовательность: упорядоченная по местоположению коллекция объектов произвольных типов, размер которых практически не ограничен. В отличие от символьных строк, списки являются изменяемыми последовательностями, т.е. их элементы могут изменяться с помощью операций присваивания.* +> ss1[4]='=' ->spis1=[111,'Spisok',5-9j] ->print(spis1) +Ответ программы:![Task 6.2.6.1](images/Task6_2_6_1.png) -Ответ программы: -![Task 7.1.1.](images/Task7_1_1.png) +> ss1=ss1[:4]+'='+ss1[5:] +> print(ss1) -2. *Cписок, содержащий последовательность отсчетов сигнала в виде «единичной ступеньки».* +Ответ программы:![Task 6.2.6.2](images/Task6_2_6_2.png) ->stup=[0,0,1,1,1,1,1,1,1] ->print(stup) +7. *С использованием ранее созданной строки ss1b попробуйте создать объекты с разными срезами исходной строки.* -Ответ программы: -![Task 7.1.2.](images/Task7_1_2.png) +> print(ss1b[-10:]) +> +> print("\n") +> ss1b="My name is "+ ss1b[-10:] +> print(ss1b) -3. *Список можно вводить на нескольких строках. При этом список будет считаться незавершенным, пока не будет введена закрывающая квадратная скобка.* +Ответ программы:![Task 6.2.7](images/Task6_2_7.png) ->spis=[1,2,3,4, - 5,6,7, - 8,9,10] ->print(spis) +8. *Самостоятельно придумайте значения и создайте объекты разных типов. После этого отобразите типы и значения созданных объектов.* -Ответ программы: -![Task 7.1.3.](images/Task7_1_3.png) +> целое_число = 42 +> вещественное_число = 3.14159 +> комплексное_число = 2 + 3j +> строка = "Привет, мир!" +> многострочная_строка = """Это +> многострочная +> строка""" +> логическое_значение = True +> print(целое_число) +> print(вещественное_число) +> print(комплексное_число) +> print(строка) +> print(многострочная_строка) -4. *При работе с элементами списка можно использовать индексы точно так же, как это делали с элементами символьной строки.* +Ответ программы: +![Task 6.2.8](images/Task6_2_8.png) ->print(stup[-8::2]) +## 7. Изучение более сложных типов объектов: списки (list), кортежи (tuple), словари (dict), множества (set). -Ответ программы: -![Task 7.1.4.](images/Task7_1_4.png) +### 7.1. Список. ->spis1[1]='Список' ->print(spis1) +1. *Список – это последовательность: упорядоченная по местоположению коллекция объектов произвольных типов, размер которых практически не ограничен. В отличие от символьных строк, списки являются изменяемыми последовательностями, т.е. их элементы могут изменяться с помощью операций присваивания.* -Ответ программы: -![Task 7.1.5.](images/Task7_1_5.png) +> spis1=[111,'Spisok',5-9j] +> print(spis1) -5. *Текущее число элементов в списке можно узнать с помощью функции len().* +Ответ программы:![Task 7.1.1.](images/Task7_1_1.png) ->print(len(spis1)) +2. *Cписок, содержащий последовательность отсчетов сигнала в виде «единичной ступеньки».* -Ответ программы: -![Task 7.1.6.](images/Task7_1_6.png) +> stup=[0,0,1,1,1,1,1,1,1] +> print(stup) -6. *Описание метода можно вывести с помощью функции help().* +Ответ программы:![Task 7.1.2.](images/Task7_1_2.png) ->help(spis1.append) +3. *Список можно вводить на нескольких строках. При этом список будет считаться незавершенным, пока не будет введена закрывающая квадратная скобка.* -Ответ программы: -![Task 7.1.7.](images/Task7_1_7.png) +> spis=[1,2,3,4, +> 5,6,7, +> 8,9,10] +> print(spis) -7. *С помощью методов объектов-списков можно добавлять и удалять элементы.* +Ответ программы:![Task 7.1.3.](images/Task7_1_3.png) ->spis1.append('New item1') ->spis1=spis1+["New item2"] ->spis1=spis1+[ss1b] ->print(spis1) +4. *При работе с элементами списка можно использовать индексы точно так же, как это делали с элементами символьной строки.* -Ответ программы: -![Task 7.1.8.](images/Task7_1_8.png) +> print(stup[-8::2]) -8. *Также могут использоваться методы insert, remove, extend, clear, sort, reverse, copy, count, index.* +Ответ программы:![Task 7.1.4.](images/Task7_1_4.png) ->#Создадим список для экспериментов ->fruits = ["яблоко", "банан", "апельсин", "киви", "банан", "манго"] ->print("Исходный список:", fruits) ->print() -> ->#1. append() - добавление элемента в конец ->fruits.append("виноград") ->print("1. После append('виноград'):", fruits) -> ->#2. insert() - вставка элемента по индексу ->fruits.insert(2, "лимон") ->print("2. После insert(2, 'лимон'):", fruits) -> ->#3. extend() - расширение списка другим списком ->more_fruits = ["груша", "персик"] ->fruits.extend(more_fruits) ->print("3. После extend(['груша', 'персик']):", fruits) -> ->#4. remove() - удаление первого найденного элемента по значению ->fruits.remove("банан") ->print("4. После remove('банан'):", fruits) -> ->#5. pop() - удаление элемента по индексу (и возврат значения) ->removed_fruit = fruits.pop(1) ->print("5. После pop(3):", fruits) ->print(" Удаленный элемент:", removed_fruit) -> ->#6. clear() - полная очистка списка (создадим копию для демонстрации) ->fruits_copy = fruits.copy() ->fruits_copy.clear() ->print("6. После clear() копии:", fruits_copy) -> ->#7. index() - поиск индекса элемента ->index_kiwi = fruits.index("киви") ->print("7. Индекс элемента 'киви':", index_kiwi) -> ->#8. count() - подсчет количества элементов ->count_banana = fruits.count("банан") ->print("8. Количество 'банан' в списке:", count_banana) -> ->#9. sort() - сортировка списка ->fruits.sort() ->print("9. После sort() (по алфавиту):", fruits) -> ->#10. reverse() - обратный порядок элементов ->fruits.reverse() ->print("10. После reverse():", fruits) -> ->#11. copy() - создание копии списка ->fruits_copy2 = fruits.copy() ->fruits_copy2.append("ананас") ->print("11. Оригинал после copy():", fruits) ->print(" Копия после append('ананас'):", fruits_copy2) -> ->#12. Дополнительно: len() - длина списка ->print("12. Длина списка:", len(fruits)) -> ->#13. Дополнительно: проверка наличия элемента ->print("13. 'яблоко' в списке?", "яблоко" in fruits) ->print(" 'арбуз' в списке?", "арбуз" in fruits) +> spis1[1]='Список' +> print(spis1) -Ответ программы: -![Task 7.1.9.](images/Task7_1_9.png) +Ответ программы:![Task 7.1.5.](images/Task7_1_5.png) -9. *Списки могут быть вложенными.* +5. *Текущее число элементов в списке можно узнать с помощью функции len().* ->spis2=[spis1,[4,5,6,7]] ->print(spis2) +> print(len(spis1)) -Ответ программы: -![Task 7.1.10.](images/Task7_1_10.png) +Ответ программы:![Task 7.1.6.](images/Task7_1_6.png) -10. *Обращение к элементам вложенного списка.* +6. *Описание метода можно вывести с помощью функции help().* ->print(spis2[0][1]) +> help(spis1.append) -Ответ программы: -![Task 7.1.11.](images/Task7_1_11.png) +Ответ программы:![Task 7.1.7.](images/Task7_1_7.png) -11. *Изменение элемента вложенного списка.* +7. *С помощью методов объектов-списков можно добавлять и удалять элементы.* ->spis2[0][1]=78 ->print(spis2[0][1]) +> spis1.append('New item1') +> spis1=spis1+["New item2"] +> spis1=spis1+[ss1b] +> print(spis1) -Ответ программы: -![Task 7.1.12.](images/Task7_1_12.png) - -12. *Объект-список, элементами которого будут объекты разных типов.* - ->разнообразный_список = [ - 42, # целое число - "Привет, мир!", # строка - True, # логическое значение - 3.14159, # вещественное число - ["вложенный", "список", 123], # вложенный список - {"ключ": "значение"}, # словарь - None, # специальное значение - complex(2, 3), # комплексное число - False # еще одно логическое значение ->] ->print(разнообразный_список) +Ответ программы:![Task 7.1.8.](images/Task7_1_8.png) -Ответ программы: -![Task 7.1.13.](images/Task7_1_13.png) - +8. *Также могут использоваться методы insert, remove, extend, clear, sort, reverse, copy, count, index.* -### 7.2. Кортеж. +> #Создадим список для экспериментов +> fruits = ["яблоко", "банан", "апельсин", "киви", "банан", "манго"] +> print("Исходный список:", fruits) +> print() +> +> #1. append() - добавление элемента в конец +> fruits.append("виноград") +> print("1. После append('виноград'):", fruits) +> +> #2. insert() - вставка элемента по индексу +> fruits.insert(2, "лимон") +> print("2. После insert(2, 'лимон'):", fruits) +> +> #3. extend() - расширение списка другим списком +> more_fruits = ["груша", "персик"] +> fruits.extend(more_fruits) +> print("3. После extend(['груша', 'персик']):", fruits) +> +> #4. remove() - удаление первого найденного элемента по значению +> fruits.remove("банан") +> print("4. После remove('банан'):", fruits) +> +> #5. pop() - удаление элемента по индексу (и возврат значения) +> removed_fruit = fruits.pop(1) +> print("5. После pop(3):", fruits) +> print(" Удаленный элемент:", removed_fruit) +> +> #6. clear() - полная очистка списка (создадим копию для демонстрации) +> fruits_copy = fruits.copy() +> fruits_copy.clear() +> print("6. После clear() копии:", fruits_copy) +> +> #7. index() - поиск индекса элемента +> index_kiwi = fruits.index("киви") +> print("7. Индекс элемента 'киви':", index_kiwi) +> +> #8. count() - подсчет количества элементов +> count_banana = fruits.count("банан") +> print("8. Количество 'банан' в списке:", count_banana) +> +> #9. sort() - сортировка списка +> fruits.sort() +> print("9. После sort() (по алфавиту):", fruits) +> +> #10. reverse() - обратный порядок элементов +> fruits.reverse() +> print("10. После reverse():", fruits) +> +> #11. copy() - создание копии списка +> fruits_copy2 = fruits.copy() +> fruits_copy2.append("ананас") +> print("11. Оригинал после copy():", fruits) +> print(" Копия после append('ананас'):", fruits_copy2) +> +> #12. Дополнительно: len() - длина списка +> print("12. Длина списка:", len(fruits)) +> +> #13. Дополнительно: проверка наличия элемента +> print("13. 'яблоко' в списке?", "яблоко" in fruits) +> print(" 'арбуз' в списке?", "арбуз" in fruits) -1. *Объект-кортеж похож на список, но его нельзя изменить – кортежи являются последовательностями, как списки, но они являются неизменяемыми, как строки. В отличие от списка литерал кортежа заключается в круглые, а не в квадратные скобки. Кортежи также поддер­живают включение в них объектов различных типов и операции, типич­ные для последовательностей.* +Ответ программы:![Task 7.1.9.](images/Task7_1_9.png) ->kort1=(222,'Kortezh',77+8j) ->print(kort1) +9. *Списки могут быть вложенными.* -Ответ программы: -![Task 7.2.1.](images/Task7_2_1.png) +> spis2=[spis1,[4,5,6,7]] +> print(spis2) -2. *Изменить кортеж нельзя, но можно его переопределить.* +Ответ программы:![Task 7.1.10.](images/Task7_1_10.png) ->kort1= kort1+(1,2) ->print(kort1) +10. *Обращение к элементам вложенного списка.* -Ответ программы: -![Task 7.2.2](images/Task7_2_2.png) +> print(spis2[0][1]) -3. *Если надо добавить еще один элемент в кортеж.* +Ответ программы:![Task 7.1.11.](images/Task7_1_11.png) ->ss1b= 'Меня зовут: \n TerekhovFV' ->kort1= kort1+(ss1b,) #ЗДЕСЬ ЗАПЯТАЯ ОБЯЗАТЕЛЬНА, ИНАЧЕ ОШИБКА ->print(kort1) +11. *Изменение элемента вложенного списка.* -Ответ программы: -![Task 7.2.3](images/Task7_2_3.png) +> spis2[0][1]=78 +> print(spis2[0][1]) -4. *Теперь переопределим кортеж с удалением комплексного элемента.* +Ответ программы:![Task 7.1.12.](images/Task7_1_12.png) ->kort2=kort1[:2]+kort1[3:] ->print(kort2) +12. *Объект-список, элементами которого будут объекты разных типов.* -Ответ программы: -![Task 7.2.4](images/Task7_2_4.png) +> разнообразный_список = [ +> 42, # целое число +> "Привет, мир!", # строка +> True, # логическое значение +> 3.14159, # вещественное число +> ["вложенный", "список", 123], # вложенный список +> {"ключ": "значение"}, # словарь +> None, # специальное значение +> complex(2, 3), # комплексное число +> False # еще одно логическое значение +> ] +> print(разнообразный_список) -5. *Два важных метода кортежа (они есть также и у списков):* +Ответ программы: +![Task 7.1.13.](images/Task7_1_13.png) -* Определение индекса заданного элемента: +### 7.2. Кортеж. ->print(kort1.index(2)) +1. *Объект-кортеж похож на список, но его нельзя изменить – кортежи являются последовательностями, как списки, но они являются неизменяемыми, как строки. В отличие от списка литерал кортежа заключается в круглые, а не в квадратные скобки. Кортежи также поддер­живают включение в них объектов различных типов и операции, типич­ные для последовательностей.* -Ответ программы: -![Task 7.2.5](images/Task7_2_5.png) +> kort1=(222,'Kortezh',77+8j) +> print(kort1) -* Подсчет числа вхождений заданного элемента в кортеже: +Ответ программы:![Task 7.2.1.](images/Task7_2_1.png) ->print(kort1.count(222)) +2. *Изменить кортеж нельзя, но можно его переопределить.* -Ответ программы: -![Task 7.2.6](images/Task7_2_6.png) +> kort1= kort1+(1,2) +> print(kort1) -6. *Методов append и pop у кортежей нет, т.к. они являются неизменяемыми.* +Ответ программы:![Task 7.2.2](images/Task7_2_2.png) ->kort1[2]=90 +3. *Если надо добавить еще один элемент в кортеж.* -Ответ программы: -![Task 7.2.7](images/Task7_2_7.png) +> ss1b= 'Меня зовут: \n TerekhovFV' +> kort1= kort1+(ss1b,) #ЗДЕСЬ ЗАПЯТАЯ ОБЯЗАТЕЛЬНА, ИНАЧЕ ОШИБКА +> print(kort1) -7. *Объект-кортеж с элементами разных типов: число, строка, список, кортеж.* +Ответ программы:![Task 7.2.3](images/Task7_2_3.png) ->разнообразный_кортеж = ( - 100, # целое число - "Hello, Tuple!", # строка - [1, 2, 3, "список внутри кортежа"], # список - (4, 5, 6), # вложенный кортеж - 3.14, # вещественное число - True, # логическое значение - None # специальное значение ->) ->print(разнообразный_кортеж) +4. *Теперь переопределим кортеж с удалением комплексного элемента.* -Ответ программы: -![Task 7.2.8](images/Task7_2_8.png) - +> kort2=kort1[:2]+kort1[3:] +> print(kort2) -### 7.3. Словарь. +Ответ программы:![Task 7.2.4](images/Task7_2_4.png) -1. *Объект-словарь похож на ассоциативные массивы в других языках программирования. Его содержанием является совокупность пар: «ключ (key)»:«значение (value)». В качестве ключей могут использоваться неизменяемые типы объектов. Значениями могут быть объекты любого типа. Ссылка на ключ обеспечивает быстрый доступ к связанному с ним значению. В отличие от списков и кортежей совокупность элементов словаря не является упорядоченной (последовательностью). Его элементы могут изменяться с помощью операции присваивания значений.* +5. *Два важных метода кортежа (они есть также и у списков):* ->dic1={'Saratov':145, 'Orel':56, 'Vologda':45} ->print(dic1) +* Определение индекса заданного элемента: -Ответ программы: -![Task 7.3.1](images/Task7_3_1.png) +> print(kort1.index(2)) -2. *Обращение к элементам словаря не по индексам, а по ключам:* +Ответ программы:![Task 7.2.5](images/Task7_2_5.png) ->print(dic1['Orel']) +* Подсчет числа вхождений заданного элемента в кортеже: -Ответ программы: -![Task 7.3.2](images/Task7_3_2.png) +> print(kort1.count(222)) -3. *Пополнение словаря (добавление элемента, изменение словаря):* +Ответ программы:![Task 7.2.6](images/Task7_2_6.png) ->dic1['Pskov']=78 ->print(dic1) +6. *Методов append и pop у кортежей нет, т.к. они являются неизменяемыми.* -Ответ программы: -![Task 7.3.3](images/Task7_3_3.png) +> kort1[2]=90 -*Обратите внимание на то, что в силу неупорядоченности словаря при его выводе элементы могут располагаться не в том порядке, в каком они задавались при его формировании.* -*Для того, чтобы получить перечень ключей или значений из словаря следует использовать методы keys или values, создающие списки, соответственно, ключей или значений из словаря.* +Ответ программы:![Task 7.2.7](images/Task7_2_7.png) -4. *Функция sorted позволяет увидеть список упорядоченным по ключам или по значениям:* +7. *Объект-кортеж с элементами разных типов: число, строка, список, кортеж.* ->print(sorted(dic1.keys())) ->print(sorted(dic1.values())) +> разнообразный_кортеж = ( +> 100, # целое число +> "Hello, Tuple!", # строка +> [1, 2, 3, "список внутри кортежа"], # список +> (4, 5, 6), # вложенный кортеж +> 3.14, # вещественное число +> True, # логическое значение +> None # специальное значение +> ) +> print(разнообразный_кортеж) -Ответ программы: -![Task 7.3.4](images/Task7_3_4.png) +Ответ программы: +![Task 7.2.8](images/Task7_2_8.png) -5. *Элементы словаря могут быть любого типа, в том числе и словарями.* +### 7.3. Словарь. ->dic2={1:'mean',2:'standart deviation',3:'correlation'} ->dic3={'statistics':dic2,'POAS':['base','elementary','programming']} ->print(dic3['statistics'][2]) +1. *Объект-словарь похож на ассоциативные массивы в других языках программирования. Его содержанием является совокупность пар: «ключ (key)»:«значение (value)». В качестве ключей могут использоваться неизменяемые типы объектов. Значениями могут быть объекты любого типа. Ссылка на ключ обеспечивает быстрый доступ к связанному с ним значению. В отличие от списков и кортежей совокупность элементов словаря не является упорядоченной (последовательностью). Его элементы могут изменяться с помощью операции присваивания значений.* -Ответ программы: -![Task 7.3.5](images/Task7_3_5.png) +> dic1={'Saratov':145, 'Orel':56, 'Vologda':45} +> print(dic1) -6. *Более сложный словарь из списка с элементами-кортежами с использованием функции dict:* +Ответ программы:![Task 7.3.1](images/Task7_3_1.png) ->ss1b= 'Меня зовут: \n TerekhovFV' ->dic4=dict([(1,['A','B','C']),(2,[4,5]),('Q','Prim'),('Stroka',ss1b)]) ->print(dic4) +2. *Обращение к элементам словаря не по индексам, а по ключам:* -Ответ программы: -![Task 7.3.6](images/Task7_3_6.png) +> print(dic1['Orel']) -7. *Еще один словарь из двух списков: один для ключей и другой – для значений, с помощью функций dict и zip:* +Ответ программы:![Task 7.3.2](images/Task7_3_2.png) ->dic5=dict(zip(['A','B','C','Stroka'],[16,-3,9,ss1b])) ->print(dic5) +3. *Пополнение словаря (добавление элемента, изменение словаря):* -Ответ программы: -![Task 7.3.7](images/Task7_3_7png) +> dic1['Pskov']=78 +> print(dic1) -8. *Объект-кортеж с 7 элементами и объект-список с 5 элементами и попробуйте создать из них словарь с помощью функций dict и zip.* +Ответ программы: +![Task 7.3.3](images/Task7_3_3.png) ->ключи = ('имя', 'возраст', 'город', 'профессия', 'стаж', 'зарплата', 'активен') ->значения = ['Анна', 28, 'Москва', 'программист', True] ->словарь = dict(zip(ключи, значения)) ->print(словарь) ->print(f"Количество элементов в словаре: {len(словарь)}") +*Обратите внимание на то, что в силу неупорядоченности словаря при его выводе элементы могут располагаться не в том порядке, в каком они задавались при его формировании.**Для того, чтобы получить перечень ключей или значений из словаря следует использовать методы keys или values, создающие списки, соответственно, ключей или значений из словаря.* -Ответ программы: -![Task 7.3.7](images/Task7_3_7png) +4. *Функция sorted позволяет увидеть список упорядоченным по ключам или по значениям:* + +> print(sorted(dic1.keys())) +> print(sorted(dic1.values())) + +Ответ программы:![Task 7.3.4](images/Task7_3_4.png) + +5. *Элементы словаря могут быть любого типа, в том числе и словарями.* + +> dic2={1:'mean',2:'standart deviation',3:'correlation'} +> dic3={'statistics':dic2,'POAS':['base','elementary','programming']} +> print(dic3['statistics'][2]) + +Ответ программы:![Task 7.3.5](images/Task7_3_5.png) + +6. *Более сложный словарь из списка с элементами-кортежами с использованием функции dict:* + +> ss1b= 'Меня зовут: \n TerekhovFV' +> dic4=dict([(1,['A','B','C']),(2,[4,5]),('Q','Prim'),('Stroka',ss1b)]) +> print(dic4) + +Ответ программы:![Task 7.3.6](images/Task7_3_6.png) + +7. *Еще один словарь из двух списков: один для ключей и другой – для значений, с помощью функций dict и zip:* + +> dic5=dict(zip(['A','B','C','Stroka'],[16,-3,9,ss1b])) +> print(dic5) + +Ответ программы:![Task 7.3.7](images/Task7_3_7png) + +8. *Объект-кортеж с 7 элементами и объект-список с 5 элементами и попробуйте создать из них словарь с помощью функций dict и zip.* + +> ключи = ('имя', 'возраст', 'город', 'профессия', 'стаж', 'зарплата', 'активен') +> значения = ['Анна', 28, 'Москва', 'программист', True] +> словарь = dict(zip(ключи, значения)) +> print(словарь) +> print(f"Количество элементов в словаре: {len(словарь)}") + +Ответ программы: +![Task 7.3.7](images/Task7_3_7png) ### 7.4. Множество. -1. *Объект-множество – это неупорядоченная совокупность неповторяющихся элементов. Эти элементы могут быть разных, но только неизменяемых типов (числа, строки, кортежи).* +1. *Объект-множество – это неупорядоченная совокупность неповторяющихся элементов. Эти элементы могут быть разных, но только неизменяемых типов (числа, строки, кортежи).* ->mnoz1={'двигатель','датчик','линия связи','датчик','микропроцессор','двигатель'} ->print(mnoz1) +> mnoz1={'двигатель','датчик','линия связи','датчик','микропроцессор','двигатель'} +> print(mnoz1) -Ответ программы: -![Task 7.4.1.](images/Task7_4_1.png) +Ответ программы:![Task 7.4.1.](images/Task7_4_1.png) -2. *Определение числа элементов:* +2. *Определение числа элементов:* ->print(len(mnoz1)) +> print(len(mnoz1)) -Ответ программы: -![Task 7.4.2.](images/Task7_4_2.png) +Ответ программы:![Task 7.4.2.](images/Task7_4_2.png) -3. *Проверка наличия элемента во множестве:* +3. *Проверка наличия элемента во множестве:* ->print('датчик' in mnoz1) +> print('датчик' in mnoz1) -Ответ программы: -![Task 7.4.3.](images/Task7_4_3.png) +Ответ программы:![Task 7.4.3.](images/Task7_4_3.png) -4. *Дбавление элемента:* +4. *Добавление элемента:* ->mnoz1.add('реле') ->print(mnoz1) +> mnoz1.add('реле') +> print(mnoz1) -Ответ программы: -![Task 7.4.4.](images/Task7_4_4.png) +Ответ программы:![Task 7.4.4.](images/Task7_4_4.png) -5. *Удаление элемента:* +5. *Удаление элемента:* ->mnoz1.remove('линия связи') ->print(mnoz1) +> mnoz1.remove('линия связи') +> print(mnoz1) Ответ программы: ![Task 7.4.5.](images/Task7_4_5.png) -6. *Объект-множество с элементами разных типов.* - ->разнообразное_множество = { - 42, # целое число - "hello", # строка - 3.14, # вещественное число - True, # логическое значение (True = 1) - (1, 2, 3), # кортеж (неизменяемый) - "world", # еще одна строка - 100, # еще одно число - False # логическое значение (False = 0) ->} ->print(разнообразное_множество) ->print('\n') ->разнообразное_множество.add("новый элемент") ->print(разнообразное_множество) ->print('\n') ->разнообразное_множество.remove("hello") ->print(разнообразное_множество) ->print('\n') ->print('hello' in разнообразное_множество) +6. *Объект-множество с элементами разных типов.* + +> разнообразное_множество = { +> 42, # целое число +> "hello", # строка +> 3.14, # вещественное число +> True, # логическое значение (True = 1) +> (1, 2, 3), # кортеж (неизменяемый) +> "world", # еще одна строка +> 100, # еще одно число +> False # логическое значение (False = 0) +> } +> print(разнообразное_множество) +> print('\n') +> разнообразное_множество.add("новый элемент") +> print(разнообразное_множество) +> print('\n') +> разнообразное_множество.remove("hello") +> print(разнообразное_множество) +> print('\n') +> print('hello' in разнообразное_множество) + +Ответ программы: +![Task 7.4.6.](images/Task7_4_6.png) + +## Общее контрольное задание. -Ответ программы: -![Task 7.4.6.](images/Task7_4_6.png) \ No newline at end of file +>import keyword +> +>familia = "Terekhov" +>first_letter = familia[0] +> +>sp_kw = list(keyword.kwlist) +> +>kort_nam = ("Фёдор", "Дима", "Вадим", "Екатерина") +>is_tuple = (type(kort_nam) is tuple) +>kort_nam = kort_nam + ("Павел", "Иван") +>count_dima = kort_nam.count("Дима") +> +>dict_bas = { +>"строка": familia, +>"символ (строка из 1 буквы)": first_letter, +>"список": sp_kw, +>"кортеж": kort_nam, +>"логический": is_tuple, +>} +> +>print(f"familia = {familia}") +>print(f"first_letter = {first_letter}") +>print(f"sp_kw (без 'nonlocal') содержит {len(sp_kw)} ключевых слов") +>print(f"Проверка типа kort_nam — tuple: {is_tuple}") +>print(f"kort_nam = {kort_nam}") +>print(f"Количество вхождений 'Дима' в kort_nam: {count_dima}") +>print("dict_bas (ключи → значение):") +>for k in dict_bas: +>print(f" {k}: {dict_bas[k]}") + +Ответ программы: +![Control task](images/control_task.png) \ No newline at end of file