Сравнить коммиты

...

117 Коммитов
main ... main

Автор SHA1 Сообщение Дата
TimoshenkoAA 5f08387bdc ОКЗ по теме 8
2 дней назад
TimoshenkoAA b2bb423e54 Добавлен отчет по теме 8
2 дней назад
TimoshenkoAA 9275d68a3f Изменил(а) на 'TEMA7/task.md'
1 неделю назад
TimoshenkoAA 052cc60f78 Изменил(а) на 'TEMA7/task.md'
1 неделю назад
TimoshenkoAA f76ede0ee5 Изменил(а) на 'TEMA7/task.md'
1 неделю назад
TimoshenkoAA b9d8299494 Изменил(а) на 'TEMA7/task.md'
1 неделю назад
TimoshenkoAA 6f74844736 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA 96a19fb2a3 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA f9d597352f Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA 2155001d49 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA 609ea732d5 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA b905a59f08 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA e29d2e6a86 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA 70b4d75ece Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA 4049c35b9f Загрузил(а) файлы в 'TEMA6'
1 неделю назад
TimoshenkoAA 78e544bf91 Изменил(а) на 'TEMA6/module2.md'
1 неделю назад
TimoshenkoAA 2b6efba461 Изменил(а) на 'TEMA6/module2.md'
1 неделю назад
TimoshenkoAA 54ece20e7c Изменил(а) на 'TEMA6/module2.md'
1 неделю назад
TimoshenkoAA 70a2a2e057 Добавлен тест по модулю 2
1 неделю назад
TimoshenkoAA 6d4dbd16a4 Изменил(а) на 'TEMA6/report.md'
1 неделю назад
TimoshenkoAA f257e32325 Изменил(а) на 'TEMA6/report.md'
1 неделю назад
TimoshenkoAA 235741be5b Изменил(а) на 'TEMA6/report.md'
1 неделю назад
TimoshenkoAA 8a6d159b44 Изменил(а) на 'TEMA6/test.md'
1 неделю назад
TimoshenkoAA 71173c42f6 Изменил(а) на 'TEMA6/report.md'
1 неделю назад
TimoshenkoAA 96b7f4873e Изменил(а) на 'TEMA6/report.md'
1 неделю назад
TimoshenkoAA 8590b5859d Изменил(а) на 'TEMA6/report.md'
1 неделю назад
TimoshenkoAA 5b87fde60b Графики из Темы 7
1 неделю назад
TimoshenkoAA 16b6a147ab Изменил(а) на 'TEMA7/task.md'
1 неделю назад
TimoshenkoAA c33867f9c8 ОКЗ по Теме 7
1 неделю назад
TimoshenkoAA cddd379760 Изменил(а) на 'TEMA7/report.md'
1 неделю назад
TimoshenkoAA 046ca68850 Добавлен отчет ЛР7
1 неделю назад
TimoshenkoAA d446893266 Изменил(а) на 'TEMA6/test.md'
2 недель назад
TimoshenkoAA 2b84f3c7a7 Загрузил(а) файлы в 'TEMA6'
2 недель назад
TimoshenkoAA 27754236e8 Изменил(а) на 'TEMA6/report.md'
2 недель назад
TimoshenkoAA 9f6a7ff799 Изменил(а) на 'TEMA6/report.md'
2 недель назад
TimoshenkoAA cfed11b54c Загрузил(а) файлы в 'TEMA6'
2 недель назад
TimoshenkoAA 1013b19afb Изменил(а) на 'TEMA5/test.md'
3 недель назад
TimoshenkoAA 4513f83acb Изменил(а) на 'TEMA5/test.md'
3 недель назад
TimoshenkoAA 4a7e3fcf90 Добавлено ИКЗ по Теме 5
3 недель назад
TimoshenkoAA 75f05b46be Изменил(а) на 'TEMA5/task.md'
4 недель назад
TimoshenkoAA ef83c275ed ОКЗ по Теме 5
4 недель назад
TimoshenkoAA 416cf017ac Отчет и материалы по Теме 5
4 недель назад
TimoshenkoAA 130619be09 Изменил(а) на 'TEMA4/test.md'
1 месяц назад
TimoshenkoAA 5c719db5f0 Изменил(а) на 'TEMA4/test.md'
1 месяц назад
TimoshenkoAA 3d452fe0a3 Изменил(а) на 'TEMA4/test.md'
1 месяц назад
TimoshenkoAA 5608a827cc Изменил(а) на 'TEMA4/test.md'
1 месяц назад
TimoshenkoAA 49a5336d60 Изменил(а) на 'TEMA4/test.md'
1 месяц назад
TimoshenkoAA 43cd992afe Загрузил(а) файлы в 'TEMA4'
1 месяц назад
TimoshenkoAA 2b2ad76221 Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA 634187c441 Изменил(а) на 'TEMA4/task.md'
1 месяц назад
TimoshenkoAA 87e9de5178 Изменил(а) на 'TEMA4/task.md'
1 месяц назад
TimoshenkoAA 8bc60880f2 Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA c782c95b18 Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA 81fe20e9aa Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA c1f83d555e Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA f4c129cc55 Добавлен Ris4
1 месяц назад
TimoshenkoAA 32774cf607 Добавлен Ris2
1 месяц назад
TimoshenkoAA b6964f2dba Добавлен Ris1
1 месяц назад
TimoshenkoAA 67f9b403e0 Изменил(а) на 'TEMA3/module.md'
1 месяц назад
TimoshenkoAA 3937d8860d Изменил(а) на 'TEMA3/module.md'
1 месяц назад
TimoshenkoAA c488ac634c Изменил(а) на 'TEMA3/module.md'
1 месяц назад
TimoshenkoAA 4e506a6c65 Тес по модулю 1
1 месяц назад
TimoshenkoAA ac4c454197 Тес по модулю 1
1 месяц назад
TimoshenkoAA 2143450c14 Изменил(а) на 'TEMA3/task3.md'
1 месяц назад
TimoshenkoAA 98bd6d21ab Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 73ca480fa0 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 847291f473 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 0ed2728457 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 09f8bd9499 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 1f86932c99 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 5e40047774 Добавлено ОКЗ для ЛР4
1 месяц назад
TimoshenkoAA d4e37effe3 Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA 4791a6c168 Изменил(а) на 'TEMA4/report.md'
1 месяц назад
TimoshenkoAA 4bc86f481a Добавлен отчет по ЛР4
1 месяц назад
TimoshenkoAA e1c465fd17 Изменил(а) на 'TEMA3/task3.md'
1 месяц назад
TimoshenkoAA 47ef521718 Общее контрольное задание по теме 3
1 месяц назад
TimoshenkoAA 2cc556c9e8 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 3a06de9170 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 3c281b48a8 Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA fb5d455f8e Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 12677f13fd Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 6d445a190a Изменил(а) на 'TEMA3/report3.md'
1 месяц назад
TimoshenkoAA 41636e9ca9 отчет по ЛР3
1 месяц назад
TimoshenkoAA 9d23394587 Изменил(а) на 'TEMA2/test.md'
2 месяцев назад
TimoshenkoAA 6576f0ef80 Индивидуальное контрольное задание по теме два
2 месяцев назад
TimoshenkoAA b7e8113bc9 Изменил(а) на 'TEMA2/task2.md'
2 месяцев назад
TimoshenkoAA 9829cc58cd Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA 5083ba1488 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA a5ee0eef79 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA b524482de6 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA 9b1af58e57 Изменил(а) на 'TEMA2/task2.md'
2 месяцев назад
TimoshenkoAA 03c6e318a7 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA 4cab2a7b83 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA 190f80c34f Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA b329d29739 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA 3b409e0077 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA c8b27ff5e4 Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA 4ddbe7f0cc Изменил(а) на 'TEMA2/report2.md'
2 месяцев назад
TimoshenkoAA d9518f3d4d Изменил(а) на 'TEMA2/task2.md'
2 месяцев назад
TimoshenkoAA b0fe90ce94 Изменил(а) на 'TEMA2/task2.md'
2 месяцев назад
TimoshenkoAA 0752f62656 Изменил(а) на 'TEMA1/task1.md'
2 месяцев назад
TimoshenkoAA 04c19696a1 Изменил(а) на 'TEMA1/task1.md'
2 месяцев назад
TimoshenkoAA 21e70346a1 Индивидуальное задание 1
2 месяцев назад
TimoshenkoAA d9cbda94b1 Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA 9a0a650579 Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA 320db11acf Изменил(а) на 'TEMA2/task2.md'
2 месяцев назад
TimoshenkoAA bef80273f4 Изменил(а) на 'TEMA2/task2.md'
2 месяцев назад
TimoshenkoAA ae27cc3e2d Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA 869662c638 Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA f1ae2025d7 Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA 984d86bd8a Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA 3fd76fd1dc Изменил(а) на 'TEMA1/report.md'
2 месяцев назад
TimoshenkoAA 4222b015a2 Загрузил(а) файлы в 'TEMA1'
2 месяцев назад
TimoshenkoAA a875a20a4f Загрузил(а) файлы в 'TEMA2'
2 месяцев назад
TimoshenkoAA d1b13d4043 Разрешение конфликта слияния
2 месяцев назад
TimoshenkoAA 70592f7d46 Добавлен отчет по теме 1
2 месяцев назад
TimoshenkoAA e37c6c1e24 Добавлен отчет по теме 1
2 месяцев назад

@ -0,0 +1,159 @@
# Отчет по ЛР 1 ПО АС
Выполнил: Тимошенко А.А.
Проверил: Козлюк Д.А.
## Пункт 1
В папку L:\III курс\А-1-23\TimoshenkoAA\Tema1\ПО АС 2025 перенесены материалы и распакован архив Tema1.rar
## Пункт 2
Запущен интепретатор Phyton
## Пункт 3
```
>>> print("hello")
hello
```
## Пункт 4
```
>>> h=input('Your name= ')
Your name= Alexander
>>> h
'Alexander'
```
## Пункт 5
Завершена работа с интерпретатором
```
>>> exit()
```
## Пункты 6-7
Запущена IDLE Python 3.11, изучено устройство главного командного окна
среды
## Пункт 8
```
import os
os.chdir('L:\III курс\А-1-23\TimoshenkoAA\Tema1\ПО АС 2025')
```
## Пункт 9
Шрифт изменен на Arial CYR, кегль 11, размер начального окна 50*100 символов,
комментарии подсвечиваются коричневым
В текстовом редакторе IDLE создана программа следующего содержания:
Программа по теме 1 Тимошенко Александр Анатольевич
```
import os
print("hello")
h = input('Your name = ')
os.chdir('L:\III курс\А-1-23\TimoshenkoAA\Tema1\ПО АС 2025')
Она делает следующий вывод:
= RESTART: L:/III курс/А-1-23/TimoshenkoAA/Tema1/ПО АС 2025/Pr0.py
Hello
Your name=Alexander
import Pr0
Hello
Your name=Alexander
```
При нажатии f5 в активном окне редактора:
```
= RESTART: L:/III курс/А-1-23/TimoshenkoAA/Tema1/ПО АС 2025/Pr0.py
Hello
Your name=
```
## Пункт 11
Из консоли вызван файл prb1.py
```
>>> import prb1
Как Вас зовут? Александр
Привет, Александр
```
## Пункт 12
Файл Pr0.cpython-311.pyc открыт,внутри находится байт код, версия скомпилированного исходного кода python, он создаётся для того, чтобы виртуальная машина Python могла выполнить его, а файл с байт-кодом создаётся, чтобы при повторном запуске интрепретатору не нужно было заново преобразовывать код на языке python в байт-код, чтобы тратилось меньше ресурсов. Видно, что результат компиляции невозможен для восприятия человеком. Компиляция программ производится для преобразования кода на понятном человеку языке в байт-код, который затем выполняется виртуальной машиной Python.
## Пункт 13
Все верные команды из командного окна IDLE скопированы в отдельный файл
## Пункт 14
В разделе помощи help можно найти следующие опции:
About IDLE - описание характеристик текущей среды (версия, путь и пр.)
IDLE Help - помощь по работе со средой
Python Docs - документация по языку
Turtle Demo - окно работы и помощь модуля для работы с графикой turtle
```
>>> help (print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
>>> help(print), help(input)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Help on built-in function input in module builtins:
input(prompt=None, /)
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a
trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
On *nix systems, readline is used if available.
(None, None)
```
F1 -> Указатель -> print() (built-in function) выводит справку по этой
функции
То же диалоговое окно появляется при help - Python Docs
## Пункт 15
File - Open - prb1.py
С помощью Window можно переключаться между всеми открытыми окнами
prb1.py - Run
```
======= RESTART: L:\III курс\А-1-23\TimoshenkoAA\Tema1\ПО АС 2025\prb1.py ======
Как Вас зовут? Александр
Привет, Александр
```
```
>>> import tdemo_chaos
```
Help - Turtle Demo - clock - Start выводит на экран графическое представление
программы - циферблат с часами. Есть и другие примеры программ модуля turtle,
которые можно брать за основу собственных программ.
## Пункт 16
Завершена работа со средой: File - exit

@ -0,0 +1,30 @@
# Индивидуальное контрольное задание по Теме1.
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Вопрос 6
Какие способы могут использоваться для получения помощи при работе со средой Python?
### Вариант 1. Встроенная функция help.
About IDLE - описание характеристик текущей среды (версия, путь и пр.)
help(какой-нибудь объект)
```
>>> help (print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
```
### Вариант 2. Справка в IDLE
Help → Python Docs - полная документация
Help → IDLE Help - справка по среде разработки
### Вариант 3.
Turtle Demo - окно работы и помощь модуля для работы с графикой turtle

@ -0,0 +1,634 @@
# Протокол ПО АС по теме 2
Выполнил: Тимошенко А.А. Проверил : Козлюк Д. А.
# Пункт 1
Рабочая среда настроена на нахождение в нужной директории:
```
import os
os.chdir("C:/Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА2")
```
# Пункт 2
Создадим два простых объекта - переменные f1 и f2. Это можно сделать в одну строку:
```
f1=16;f2=3
```
Можно вывести эти переменные через запятую. Тогда они будут отображены как кортеж:
```
f1, f2
(16, 3)
```
Или через точку с запятой. тогда друг за другом:
```
f1;f2
16
3
```
Функция dir() покажет, какие объекты находятся в текущем рабочем пространстве:
```
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'f1', 'f2', 'os']
```
Еще эта функция может показать атрибуты объекта:
```
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', 'is_integer', 'numerator', 'real', 'to_bytes']
```
Для определения классовой принадлежности любого объекта следует использовать функцию type():
```
type(f2)
<class 'int'>
```
Удалим объекты из рабочего пространства:
```
del f1, f2
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os']
```
# Пункт 3
Правила именования объектов:
```
gg1 = 1.6
hh1 = 'example'
73sr = 3
SyntaxError: invalid decimal literal - ошибка, т.к. имя не может начинаться с числа
and = 7
SyntaxError: invalid syntax - ошибка, т.к. имя не может совпадать с ключевым словом языка
```
# Пункт 4
Можно просмотреть все ключевые слова:
```
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']
keyWordList = keyword.kwlist
keyWordList
['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']
type(keyWordList)
<class 'list'>
```
# Пункт 5
Выведу список встроенных идентификаторов с помощью инструкций
```
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', 'PythonFinalizationError', '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', '_', '_IncompleteInputError', '__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']
```
Среди этих имен есть полезные функции, например:
Взятие модуля
```
abs(-5)
5
```
Длина объекта
```
len([1,2,3])
3
```
Максимум значений
max(14,8)
14
Минимум значений
```
min(15,0)
0
```
Возведение в степень
```
pow(5,2)
25
```
Можно возводить в степень по модулю
```
pow(5, 2, 2)
1
```
Округление
```
round(3,124)
3
```
Можно указать порядок, до которого округляем (по умолчанию - до целого)
```
round(4.87945, 2)
4.88
```
Суммирование
```
sum([7,3,5])
15
```
Можно указать еще и начальное значение
```
sum([7,3,5],7)
22
```
Сортировка по возрастанию или по убыванию:
```
sorted ([3, 7, 9, 75, 0, -1])
[-1, 0, 3, 7, 9, 75]
```
Объединение объектов в кортеж
```
sorted ([3, 7, 9, 75, 0, -1], reverse = True)
[75, 9, 7, 3, 0, -1]
```
```
list1 = [1,2,3]
list2 = [4,5,6]
zip(list1, list2)
<zip object at 0x00000189450C6C00>
```
# Пункт 6.
Python - регистрочувствительный язык
```
Gg1 = 45
gg1, Gg1
(1.6, 45)
gg1 == Gg1
False
```
# Пункт 7.1 Логический тип:
```
bb1 = True
bb2 = False
type(bb1)
<class 'bool'>
```
# Пункт 7.2 Целое число (десятичное)
```
ii1 = 1234567890
type(ii1)
<class 'int'>
```
Экспоненциальная форма записи числа
```
ff1 = 8.987e-12
type(ff1)
<class 'float'>
Двоичное число (префикс 0b - binary)
dv1 = 0b1100101
type(bb1)
<class 'bool'>
Восьмеричное число (0о - octal)
vsm1 = 0o52765
type(vsm1)
<class 'int'>
Шестнадцатеричное число (0х - hexadecimal)
shest1 = 0x7109af6
type(shest1)
<class 'int'>
Комплексное число
cc1 = 2 - 3j
type(cc1)
<class 'complex'>
a = 3.67
b = 0.45
cc2 = complex(a,b)
cc2
(3.67+0.45j)
type(cc2)
<class 'complex'>
```
# Пункт 7.3 Строковые данные
Одинарные и двойные кавычки взаимозаменяемы, но если открыта одинарная, то закрыта тоже
должна быть одинарная
```
ss1 = "Это - строка символов"
ss2 = "Это - строка символов"
ss1 == ss2
True
ss1a = "Это - \"строка символов\", \n \t выводимая на двух строках"
print(ss1a)
Это - "строка символов",
выводимая на двух строках
ss1b = 'Меня зовут: \n Тимошенко А.А.'
print(ss1b)
Меня зовут:
Тимошенко А.А.
```
Обратимся к отдельным элементам с помощью квадратных кавычек
(нумерация с нуля):
Большую строку можно записать в тройных кавычках:
mnogo="""Нетрудно заметить , что в результате операции
над числами разных типов получается число,
имеющее более сложный тип из тех, которые участвуют в операции."""
```
print(mnogo)
Нетрудно заметить , что в результате операции над числами разных типов получается число, имеющее более сложный тип из тех, которые участвуют в операции.
```
Обратимся к отдельным элементам с помощью квадратных кавычек
(нумерация с нуля):
```
mnogo[3]
'р'
ss1b[-1] - первый с конца
'.'
```
Срезы:
```
ss1[6:9]
'стр'
ss1[3:17:2]
' тоасм'
ss1[5:-8]
' строка '
Задав шаг -1, можно вывести строку в обратном порядке:
ss1[::-1]
'воловмис акортс - отЭ'
```
К элементу можно обратиться как по нумерации с начала, так и с конца:
```
ss1[17:3:-2]
'омсаот '
ss1[-4:3:-2]
'омсаот '
```
Строка - неизменяемый тип данных:
```
ss1[4] = "="
Traceback (most recent call last):
File "<pyshell#86>", line 1, in <module>
ss1[4] = "="
TypeError: 'str' object does not support item assignment
ss1b_cut = ss1b [::-2]
```
Но если возникает необходимость изменить строку, то можно пересобрать
ее из исходной строки:
```
ss1=ss1[:4]+'='+ss1[5:]
ss1
'Это = строка символов'
```
Новый объект на основе среза из старого:
ss1b_cut = ss1b [::-2]
ss1b_cut
'.. кеои твзяе'
Собственное создание разных типов данных:
```
num10 = 26
type(num10)
<class 'int'>
num16 = hex(num10)
num16
'0x1a'
type(num16)
<class 'str'>
KeyboardInterrupt
str1 = str(num10) + ' в десятичной - это ' + str(num16) + ' в шестнадцатеричной '
str1
'26 в десятичной - это 0x1a в шестнадцатеричной '
str1[5:16:3]
'дячй'
```
# Пункт 8. Списки, кортежи, словари, множества
Список list - изменяемый тип данных. Это упорядоченная последовательность из элементов
одного или разных типов.
```
spis1 = ["111", 'spisok', 5 - 9j]
stup=[0,0,1,1,1,1,1,1,1]
stup
[0, 0, 1, 1, 1, 1, 1, 1, 1]
spis=[1,2,3,4,5,6,7,8,9,10]
spis
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
spis[-1]
10
spis1[-1]
(5-9j)
stup[-8::2]
[0, 1, 1, 1]
spis1[1]='Список'
spis1
['111', 'Список', (5-9j)]
len(spis1)
3
```
Методы списков:
1. Добавление в конец (append)
```
help(spis1.append)
Help on built-in function append:
append(object, /) method of builtins.list instance
Append object to the end of the list.
spis1.append('New item')
spis1
['111', 'Список', (5-9j), 'New item']
spis1+['New item']
Только возвращает результат, но не фиксирует такое значение!
['111', 'Список', (5-9j), 'New item', 'New item']
spis1
['111', 'Список', (5-9j), 'New item']
Конкатенация строк:
spis1 += ss1b
spis1
['111', 'Список', (5-9j), 'New item', 'М', 'е', 'н', 'я', ' ', 'з', 'о', 'в', 'у', 'т', ':', ' ', '\n', ' ', 'Т', 'и', 'м', 'о', 'ш', 'е', 'н', 'к', 'о', ' ', 'А', '.', 'А', '.']
spis1 = [111, 'Список', (5-9j), 'New item']
spis1.append(ss1b)
spis1
[111, 'Список', (5-9j), 'New item', 'Меня зовут: \n Тимошенко А.А.']
```
2. Удаление элемента по индексу (pop):
```
spis1.pop(1)
'Список'
spis1
[111, (5-9j), 'New item', 'Меня зовут: \n Тимошенко А.А.']
Если указать индекс, которого нет:
spis1.pop(7)
Traceback (most recent call last):
File "<pyshell#122>", line 1, in <module>
spis1.pop(7)
IndexError: pop index out of range
```
3. Вставка элемента в определенное место по индексу (insert)
```
help(spis1.insert)
Help on built-in function insert:
insert(index, object, /) method of builtins.list instance
Insert object before index.
spis1.insert(2, "hello")
spis1
[111, (5-9j), 'hello', 'New item', 'Меня зовут: \n Тимошенко А.А.']
Если указать число большее чем длина списка, то просто вставится в конец:
spis1.insert(8, "test")
spis1
[111, (5-9j), 'hello', 'New item', 'Меня зовут: \n Тимошенко А.А.', 'test']
```
4. Удаление элемента по значению (remove)
```
help(spis1.remove)
Help on built-in function remove:
remove(value, /) method of builtins.list instance
Remove first occurrence of value.
Raises ValueError if the value is not present.
spis1.remove(111)
spis1
[(5-9j), 'hello', 'New item', 'Меня зовут: \n Тимошенко А.А.', 'test']
spis1.remove('kitten')
Traceback (most recent call last):
File "<pyshell#132>", line 1, in <module>
spis1.remove('kitten')
help(spis1.extend)
```
5. Добавление элементов объекта в конец другого объекта (extend)
```
Help on built-in function extend:
extend(iterable, /) method of builtins.list instance
Extend list by appending elements from the iterable.
end1 = [123, "mew", (1,2)]
spis1.extend(end1)
spis1
[(5-9j), 'hello', 'New item', 'Меня зовут: \n Тимошенко А.А.', 'test', 123, 'mew', (1, 2)]
```
6. Полное очищение списка (clear)
```
help(spis1.clear)
Help on built-in function clear:
clear() method of builtins.list instance
Remove all items from list.
end1.clear()
end1
[]
```
7. Сортировка списка БЕЗ создания нового объекта (sort)
```
help(spis1.sort)
Help on built-in function sort:
sort(*, key=None, reverse=False) method of builtins.list instance
Sort the list in ascending order and return None.
The sort is in-place (i.e. the list itself is modified) and stable (i.e. the
order of two equal elements is maintained).
If a key function is given, apply it once to each list item and sort them,
ascending or descending, according to their function values.
The reverse flag can be set to sort in descending order.
end1 = [5, 6, 9.99999, 384, 0, -5]
end1.sort(key = abs, reverse = True)
end1
[384, 9.99999, 6, 5, -5, 0]
```
8. Создание копии списка (copy)
```
help(end1.copy)
Help on built-in function copy:
copy() method of builtins.list instance
Return a shallow copy of the list.
endcopy = end1.copy()
endcopy
[384, 9.99999, 6, 5, -5, 0]
```
9. Поиск индекса по значению (index)
```
help(endcopy.index)
Help on built-in function index:
index(value, start=0, stop=9223372036854775807, /) method of builtins.list instance
Return first index of value.
Raises ValueError if the value is not present.
endcopy.index(0)
5
endopy.index("hehehe")
Traceback (most recent call last):
File "<pyshell#150>", line 1, in <module>
endopy.index("hehehe")
ValueError: 'hehehe' is not in list
```
10. Подсчет количества элементов по значению (count)
```
help(endcopy.count)
Help on built-in function count:
count(value, /) method of builtins.list instance
Return number of occurrences of value.
endcopy.count(5)
1
endcopy.count(666666)
0
```
# Пункт 8.1 Вложенные списки:
```
spis2=[spis1,[4,5,6,7]]
spis2
[[(5-9j), 'hello', 'New item', 'Меня зовут: \n Тимошенко А.А.', 'test', 123, 'mew', (1, 2)], [4, 5, 6, 7]]
spis2[0][1]
'hello'
spis2[0][1]=78
spis2
[[(5-9j), 78, 'New item', 'Меня зовут: \n Тимошенко А.А.', 'test', 123, 'mew', (1, 2)], [4, 5, 6, 7]]
spis1
[(5-9j), 78, 'New item', 'Меня зовут: \n Тимошенко А.А.', 'test', 123, 'mew', (1, 2)]
```
Как видно, spis1 тоже изменился. Это происходит потому, что python работает не просто с
объектами, а с ссылками на участки памяти. То есть, в Python списки передаются по ссылке,
а не по значению.
Упоминая spis1 в строке spis2=[spis1,[4,5,6,7]]
мы не создаем копию spis1, а сообщаем именно тот список, поэтому его изменения в составе
spis2 отобраажются на исходном spis1.
# Пункт 8.2. Кортеж: последовательность как список, но неизменяемая как строка.
```
kort1=(222,'Kortezh',77+8j)
kort1= kort1+(1,2)
kort1
(222, 'Kortezh', (77+8j), 1, 2)
kort1= kort1+(ss1b,)
kort1
(222, 'Kortezh', (77+8j), 1, 2, 'Меня зовут: \n Тимошенко А.А.')
kort2=kort1[:2]+kort1[3:]
kort2
(222, 'Kortezh', 1, 2, 'Меня зовут: \n Тимошенко А.А.')
kort1.index(2)
4
kort1.count(222)
1
kort1[2]=90
Traceback (most recent call last):
File "<pyshell#170>", line 1, in <module>
kort1[2]=90
TypeError: 'tuple' object does not support item assignment
>>> kortstr = ("h", "lambda", "always", 54, [1,2,3], (6,7))
SyntaxError: invalid syntax
kortstr = ("h", "lambda", "always", 54, [1,2,3], (6,7))
kortstr
('h', 'lambda', 'always', 54, [1, 2, 3], (6, 7))
type(kortstr[5])
<class 'tuple'>
type(kortstr[4])
<class 'list'>
```
# Пункт 8.3. Словарь (dictionary) - содержит в себе совокупность пар
```
"ключ (key) (неизменяемый)": "значение (value) (любого типа)"
dic1={'Saratov':145, 'Orel':56, 'Vologda':45}
dic1
{'Saratov': 145, 'Orel': 56, 'Vologda': 45}
dic1[1]
Traceback (most recent call last):
File "<pyshell#178>", line 1, in <module> #как видно, обратиться по индексу нельзя
dic1[1]
KeyError: 1
dic1['Orel']
56
dic1['Pskov']=78
dic1
{'Saratov': 145, 'Orel': 56, 'Vologda': 45, 'Pskov': 78}
sorted(dic1.keys())
['Orel', 'Pskov', 'Saratov', 'Vologda']
sorted(dic1.values())
[45, 56, 78, 145]
dic2={1:'mean',2:'standart deviation',3:'correlation'}
dic3={'statistics':dic2,'POAS':['base','elementary','programming']}
dic3['statistics'][2]
'standart deviation'
dic4=dict([(1,['A','B','C']),(2,[4,5]),('Q','Prim'),('Stroka',ss1b)])
dic4
{1: ['A', 'B', 'C'], 2: [4, 5], 'Q': 'Prim', 'Stroka': 'Меня зовут: \n Тимошенко А.А.'}
dic5=dict(zip(['A','B','C','Stroka'],[16,-3,9,ss1b]))
dic5
{'A': 16, 'B': -3, 'C': 9, 'Stroka': 'Меня зовут: \n Тимошенко А.А.'}
```
Создание собственного словаря на основе кортежа из семи элементов и списка из пяти:
```
terms_tuple = ("mean", "median", "mode", "variance", "standard deviation", "correlation", "regression")
count_list = ["one", "two", "three", "four", "five"]
KeyboardInterrupt
count_list = ["one", "two", "three", "four", "five"]
terms_dict = dict(zip(count_list, terms_tuple))
terms_dict
{'one': 'mean', 'two': 'median', 'three': 'mode', 'four': 'variance', 'five': 'standard deviation'}
```
# Пункт 8.4. Объект-множество: состоят из НЕповторяющихся неизменяемых элементов
```
mnoz1={'двигатель','датчик','линия связи','датчик','микропроцессор','двигатель'}
mnoz1
{'датчик', 'линия связи', 'микропроцессор', 'двигатель'}
len(mnoz1)
4
'датчик' in mnoz1
True
mnoz1.add('реле')
mnoz1.remove('линия связи')
mnoz1
{'датчик', 'реле', 'двигатель', 'микропроцессор'}
```

@ -0,0 +1,58 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 2
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Пункт 1
Создать переменную с именем familia и со значением - символьной строкой – своей фамилией в латинской транскрипции.
```
familia = 'Timoshenko'
```
## Пункт 2
Создать переменную со значением, совпадающим с первой буквой из familia.
```
fam1 = familia[0]
fam1
'T'
```
## Пункт 3
Создать переменную с именем sp_kw со значением – списком всей ключевых слов языка Python.
```
import keyword
sp_kw = keyword.kwlist
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']
```
## Пункт 4
Удалите из списка sp_kw значение 'nonlocal'. Выводом списка в командном окне IDLE убедитесь, что это значение удалено из списка.
```
sp_kw.remove('nonlocal')
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']
```
## Пункт 5
Создайте кортеж kort_nam с именами: вашим и еще 3-х студентов из вашей группы. Напишите инструкцию, позволяющую убедиться, что тип переменной – это tuple.
```
kort_nam = ("Sasha", "Maksim", "Dmitriy", "Danya")
type(kort_nam)
<class 'tuple'>
```
## Пункт 6
Напишите инструкцию, добавляющую в kort_nam имена еще двух студентов.
```
kort_nam += ("Liza","Nikita")
kort_nam
('Sasha', 'Maksim', 'Dmitriy', 'Danya', 'Liza', 'Nikita')
```
## Пункт 7
Напишите инструкцию, позволяющую определить, сколько раз в кортеже присутствуют студенты с именем «Дима».
```
kort_nam.count("Dmitriy")
1
```
## Пункт 8
Создайте словарь dict_bas, в котором ключами являются русские названия типов переменных, использованных в предыдущих операторах,а значениями – ранее созданные переменные, соответствующие этим типам.
```
dict_bas = {"строка": familia, "символ": fam1, "список": sp_kw,
"кортеж": kort_nam,}
dict_bas
{'строка': 'Timoshenko', 'символ': 'T', 'список': ['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'], 'кортеж': ('Sasha', 'Maksim', 'Dmitriy', 'Danya', 'Liza', 'Nikita')}
```

@ -0,0 +1,16 @@
# Индивидуальное контрольное задание
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание:
Вариант 6: Пусть создан объект
hh=-12.2758
Напишите инструкцию вывода на экран значения этого объекта, округленного до двух знаков после точки.
## Решение:
Создан объект
```
hh=-12.2758
```
C помощью функции round производим округление:
```
print(round(hh, 2))
-12.28
```

@ -0,0 +1,46 @@
# Тест по модулю 1
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Вопрос 1
Какова роль компилятора в среде Python? Чем отличаются файлы с расширением .pyc от файлов с расширением .py?
В Python компилятор не создает самостоятельный исполняемый файл, как в компилируемых языках. Его задача — преобразовать исходный код (файл .py) в байт-код — упрощенный набор инструкций для виртуальной машины Python. Этот байт-код сохраняется в файлах с расширением .pyc. Затем интерпретатор выполняет этот байт-код.
Файлы .py - это исходный код на Python, который читается человеком.
Файлы .pyc - это скомпилированный байт-код, который выполняется виртуальной машиной Python.
## Вопрос 2
Напишите инструкцию, создающую список со словами из данного предложения. Подсчитайте и отобразите на экране число слов.
```
>>> a = "Какова роль компилятора в среде Python?"
>>> word_list = a.split()
>>> word_count = len(word_list)
>>> print("Список слов:", word_list)
Список слов: ['Какова', 'роль', 'компилятора', 'в', 'среде', 'Python?']
>>> print("Число слов:", word_count)
Число слов: 6
```
## Вопрос 3
Создайте кортеж с именами 10 любых студентов вашей группы. Напишите инструкцию, доказывающую, что создан объект именно требуемого типа. Напишите инструкцию отображения списка атрибутов созданного объекта.
```
>>> students_tuple = ('Тимошенко Александр', 'Ходюк Максим', 'Коваленко Дмитрий', 'Иванов Даниил', 'Лыкова Елизавета', 'Соловьева Екатерина', 'Таболин Иван', 'Филиппов Даниил', 'Подольский Никита', 'Терехов Федор')
>>> print("Тип объекта:", type(students_tuple))
Тип объекта: <class 'tuple'>
>>> print("Атрибуты и методы объекта:", dir(students_tuple))
Атрибуты и методы объекта: ['__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']
```
## Вопрос 4
Превратите кортеж во множество. Подсчитайте число элементов множества и отобразите на экране с помощью формата по шаблону: "Во множестве ХХ студентов".
```
>>> students_set = set(students_tuple)
>>> number_of_students = len(students_set)
>>> print(f"Во множестве {number_of_students} студентов.")
Во множестве 10 студентов.
```
## Вопрос 5
Напишите инструкцию, создающую строку из элементов списка из п.2. Отобразите строку на экране.
```
>>> new_string = ' '.join(word_list)
>>> print("Полученная строка:", new_string)
Полученная строка: Какова роль компилятора в среде Python?
```

Разница между файлами не показана из-за своего большого размера Загрузить разницу

@ -0,0 +1,102 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 3
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Пункт 1
Преобразовать восьмеричное значение 45 в целое число.
```
>>> octv = '45'
>>> decv = int(octv, 8)
>>> decv
37
```
## Пункт 2
Создать объект-словарь D со значениями {"усиление":23, "запаздывание":12,
"постоянная времени":78} и затем осуществить его преобразование в два списка: ключей и
значений, а затем – эти два списка преобразовать в один кортеж. Чем отличается кортеж
от списка?
```
>>> D = {"усиление": 23, "запаздывание": 12, "постоянная времени": 78}
>>> keyD = list(D.keys())
>>> keyD
['усиление', 'запаздывание', 'постоянная времени']
>>> valD = list(D.values())
>>> valD
[23, 12, 78]
>>> tupD = (keyD, valD)
>>> tupD
(['усиление', 'запаздывание', 'постоянная времени'], [23, 12, 78])
```
Кортежи не изменяемы, инициируются с помощью круглых скобок. Списки изменяемы, инициируются
с помощью квадратных скобок.
## Пункт 3
Напишите и выполните единое выражение, осуществляющее деление числа 1768 на 24.8 с
округлением вниз, с определением после этого остатка от деления получившегося значения
на 3 и затем возведения результата в степень 2.4.
```
>>> ((1768 // 24.8) % 3) ** 2.4
5.278031643091577
```
## Пункт 4
Напишите и выполните единое выражение, последовательно осуществляющее следующие
операции: двоичное И для чисел 13 и 27, инверсия полученного значения, двоичное исключающее
ИЛИ для полученного значения и числа 14, сдвиг полученного значения на два разряда влево.
```
>>> ((~(13 & 27)) ^ 14) << 2
-32
```
## Пункт 5
Создать список с 4 одинаковыми элементами 'колебат' и написать оператор проверки
наличия комбинации символов 'аткол' в результате конкатенации второго и третьего элементов
этого списка.
```
>>> lst = ["колебат"] * 4
>>> lst[1] += lst[2]
>>> lst
['колебат', 'колебатколебат', 'колебат', 'колебат']
>>> lst.pop(2)
'колебат'
>>> lst
['колебат', 'колебатколебат', 'колебат']
>>> 'аткол' in lst[1]
True
```
## Пункт 6
Определить список методов, доступных у ранее созданного словаря D. Поочередно
использовать его методы keys и values, определить, что можно получить с применением
этих методов.
```
>>> D
{'усиление': 23, 'запаздывание': 12, 'постоянная времени': 78}
>>> dir(D)
['__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__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])
```
dict_keys и dict_values - особые объекты, которые ссылаются на элементы исходного словаря.
## Пункт 7
Создать объект - символьную строку с текстом данного предложения. Из символьной строки
создать список, элементами которого будут отдельные слова из созданной строки. Заменить в
списке элемент «-» на «,». Удалить из списка элемент со значением «данного». Отобразить
получившийся список.
```
>>> sen = "Создать объект - символьную строку с текстом данного предложения"
>>> senl = sen.split()
>>> senl
['Создать', 'объект', '-', 'символьную', 'строку', 'с', 'текстом', 'данного', 'предложения']
>>> senl[senl.index("-")] = ","
>>> senl
['Создать', 'объект', ',', 'символьную', 'строку', 'с', 'текстом', 'данного', 'предложения']
>>> senl.remove("данного")
>>> senl
['Создать', 'объект', ';', 'символьную', 'строку', 'с', 'текстом', 'предложения']
```

Двоичные данные
TEMA4/Ris1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
TEMA4/Ris2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

Двоичные данные
TEMA4/Ris4.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 11 KiB

@ -0,0 +1,855 @@
# Тема 4. Встроенные функции
Выполнил : Тимошенко А.А.
Проверил : Козлюк Д.А.
## Пункт 1
```
>>> import os
>>> os.chdir("C:/Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА4")
```
## Пункт 2
Стандартные функции (модуль builtins, импортированный по умолчанию во все скрипты)
### Пункт 2.1
round() - округление с заданной точностью
```
>>> help(round)
Help on built-in function round in module builtins:
round(number, ndigits=None)
Round a number to a given precision in decimal digits.
The return value is an integer if ndigits is omitted or None. Otherwise
the return value has the same type as the number. ndigits may be negative.
>>> round(123.456,1)
123.5
>>> type(round(123.456,1))
<class 'float'>
>>> round(123.456,0)
123.0
>>> type(round(123.456,0))
<class 'float'>
>>> round(123.456)
123
>>> type(round(123.456))
<class 'int'>
```
Таким образом, если ndigits не указан, функция возвращает округленное целое число.
Если указан, пускай даже ноль, то число с плавающей точкой.
### Пункт 2.2
range() - генерация последовательности
```
>>> help(range)
Help on class range in module builtins:
class range(object)
| range(stop) -> range object
| range(start, stop[, step]) -> range object
|
| Return an object that produces a sequence of integers from start (inclusive)
| to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
| start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
| These are exactly the valid indices for a list of 4 elements.
| When step is given, it specifies the increment (or decrement).
>>> gg=range(76,123,9)
>>> gg
range(76, 123, 9)
```
Функция возвращает итерируемый объект типа range:
```
>>> type(range(76,123,9))
<class 'range'>
```
Чтобы прочитать результат, можно записать в список:
```
>>> list(gg)
[76, 85, 94, 103, 112, 121]
```
### Пункт 2.3
zip() - создание итерируемого объекта из кортежей
```
>>> qq=["Тимошенко","Ходюк","Коваленко","Иванов"]
>>> ff = zip (gg, qq)
>>> ff
<zip object at 0x00000207EA67BD80>
>>> tuple(ff)
((76, 'Тимошенко'), (85, 'Ходюк'), (94, 'Коваленко'), (103, 'Иванов'))
```
1. Длина получившегося объекта - меньшая из длин объектов-параметров. В данном случае, это 4.
2. Объект класса zip не итерируемый:
```
>>> ff[1]
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
ff[1]
TypeError: 'zip' object is not subscriptable
```
3. Объект класса zip неизменяемый.
### Пункт 2.4
eval - вычисление выражения строкой
```
>>> help(eval)
Help on built-in function eval in module builtins:
eval(source, globals=None, locals=None, /)
Evaluate the given source in the context of globals and locals.
The source may be a string representing a Python expression
or a code object as returned by compile().
The globals must be a dictionary and locals can be any mapping,
defaulting to the current globals and locals.
If only globals is given, locals defaults to it.
>>> fff=float(input('коэффициент усиления=')); dan=eval('5*fff-156')
коэффициент усиления=13
>>> fff
13.0
>>> dan
-91.0
```
Пояснение:
Если выражение будет записанно некорректно, будет возвращена SyntaxError.
По умолчанию eval() имеет доступ к глобальным именам.
eval() выполняет следующую последовательность действий:
Анализ последовательности символов выражения
Компилирование в байт-код
Выполнение кода
Возвращение результата
### Пункт 2.5
exec - выполнение операций строкой
```
>>> help(exec)
Help on built-in function exec in module builtins:
exec(source, globals=None, locals=None, /)
Execute the given source in the context of globals and locals.
The source may be a string representing one or more Python statements
or a code object as returned by compile().
The globals must be a dictionary and locals can be any mapping,
defaulting to the current globals and locals.
If only globals is given, locals defaults to it.
>>> exec(input('введите инструкции:'))
введите инструкции:perem=-123.456; gg=round(abs(perem)+98,3)
>>> gg
221.456
```
Пояснение:
eval используется только для вычисления выражений и возвращает результат.
exec может выполнять любой код, но не возвращает значение.
### Пункт 2.6
Возвращение модуля (abs):
```
>>> abs(-98)
98
>>> abs(5 + 4j)
6.4031242374328485
```
Возведение в степень:
```
>>> help(pow)
Help on built-in function pow in module builtins:
pow(base, exp, mod=None)
Equivalent to base**exp with 2 arguments or base**exp % mod with 3 arguments
Some types, such as ints, are able to use a more efficient algorithm when
invoked using the three argument form.
>>> pow(5,5)
3125
>>> pow(5,5,10)
5
```
Максимальное из значений:
```
>>> help(max)
Help on built-in function max in module builtins:
max(...)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value
With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
```
Обычный пример использования:
```
>>> max(35,4,-3)
35
```
Со списком:
```
>>> max([5,0,-10])
5
```
Со словарем:
```
>>> max({'a': 1, 'b': 2, 'c': 3})
'c'
```
Пояснение:
1. Видно, что выбор большего происходит из ключей
2. Видно, что среди буквенных символов больше то, которое ближе к концу алфавита
С разными типами:
```
>>> max([34,5,6, "hehe", 5+2j])
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
max([34,5,6, "hehe", 5+2j])
TypeError: '>' not supported between instances of 'str' and 'int'
```
Пояснение:
Видно, что внутри функции max заложен оператор сравнения, и между разными типами
он не работает.
Одинаковые символы разного регистра:
```
>>> max("b", "B")
'b'
```
Пояснение: тут python сравнивает коды символов в unicode. у "b" это 98, а у "B" - 66.
Поиск минимума:
Нюансы аналогичны максимуму, поэтому детально расписаны не будут.
Сумма элементов:
```
>>> help(sum)
Help on built-in function sum in module builtins:
sum(iterable, /, start=0)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.
```
Просто суммирование:
```
>>> sum([1,2,3,4])
10
```
Суммирование с значением, которое добавляется к сумме:
```
>>> sum([1,2,3,4], -5)
5
```
Возвращение кортежа из целой части и остатка от деления:
```
>>> help(divmod)
Help on built-in function divmod in module builtins:
divmod(x, y, /)
Return the tuple (x//y, x%y). Invariant: div*y + mod == x.
>>> divmod(14, 3)
(4, 2)
```
Результаты для отрицательных чисел:
```
>>> divmod(14, -3)
(-5, -1)
```
Длина объекта:
```
>>> len((1,2,3,4,10))
5
>>> len("kukukukukuku")
12
>>> len(["kukukukukkuuk","kuku"])
2
>>> len({'a': 1, 'b': 2, 'c': 3})
3
```
Но при этом:
```
>>> len(43)
Traceback (most recent call last):
File "<pyshell#90>", line 1, in <module>
len(43)
TypeError: object of type 'int' has no len()
```
Применение функции к каждому элементу коллекции:
```
>>> help(map)
Help on class map in module builtins:
class map(object)
| map(func, *iterables) --> map object
|
| Make an iterator that computes the function using arguments from
| each of the iterables. Stops when the shortest iterable is exhausted.
```
Пример:
```
>>> map(int, ["1", "14"])
<map object at 0x00000158BF19F250>
>>> list(map(int, ["1", "14"]))
[1, 14]
```
Как следует из справки, если сообщается несколько коллекций, map закончится, когда применит
функцию к самой короткой из них.
## Пункт 3
Стандартный модуль math
```
>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin',
'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees',
'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp',
'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
>>> help(math.factorial)
Help on built-in function factorial in module math:
factorial(x, /)
Find x!.
Raise a ValueError if x is negative or non-integral.
>>> math.factorial(5)
120
```
Нахождение синуса:
```
>>> help(math.sin)
Help on built-in function sin in module math:
sin(x, /)
Return the sine of x (measured in radians).
>>> math.sin(3.141)
0.0005926535550994539
>>> math.sin(-1)
-0.8414709848078965
```
Нахождение арккосинуса:
```
>>> math.acos(1)
0.0
>>> math.acos(11)
Traceback (most recent call last):
File "<pyshell#120>", line 1, in <module>
math.acos(11)
ValueError: math domain error
>>> math.acos(-1)
3.141592653589793
```
Перевод из радиан в градусы:
```
>>> help(math.degrees)
Help on built-in function degrees in module math:
degrees(x, /)
Convert angle x from radians to degrees.
>>> math.degrees(6.28)
359.817495342157
>>> math.degrees(1)
57.29577951308232
```
Перевод из градусов в радианы:
```
>>> help(math.radians)
Help on built-in function radians in module math:
radians(x, /)
Convert angle x from degrees to radians.
>>> math.radians(360)
6.283185307179586
>>> math.radians(90)
1.5707963267948966
>>> math.radians(57)
0.9948376736367679
>>> math.radians(3.1415)
0.05482951845140187
```
Число е в степени заданного:
```
>>> help(math.exp)
Help on built-in function exp in module math:
exp(x, /)
Return e raised to the power of x.
>>> math.exp(0)
1.0
>>> math.exp(1)
2.718281828459045
>>> math.exp(-5)
0.006737946999085467
```
Нахождение логарифма:
```
>>> help(math.log)
Help on built-in function log in module math:
log(...)
log(x, [base=math.e])
Return the logarithm of x to the given base.
If the base not specified, returns the natural logarithm (base e) of x.
```
Если основание логарифма не задано, то он натуральный.
```
>>> math.log(math.e)
1.0
>>> math.log(5)
1.6094379124341003
>>> math.log(25,5)
2.0
```
Согласно нормам математики, логарифмируемое выражение и основание логарифма не могут быть
отрицательными. Это есть и в python, попытка задать такие значения вернет ValueError.
Десятичный логарифм:
```
>>> math.log10(0.0001)
-4.0
>>> math.log10(10000)
4.0
```
Извлечение квадратного корня:
```
>>> math.sqrt(49)
7.0
```
В данном случае, в отличие от канонов матанализа, задание отрицательного аргумента вернет
ValueError, а не комплексное число.
Округление числа до ближайшего целого вверх:
```
>>> help(math.ceil)
Help on built-in function ceil in module math:
ceil(x, /)
Return the ceiling of x as an Integral.
This is the smallest integer >= x.
>>> math.ceil(5.77)
6
>>> math.ceil(6.00001)
7
>>> math.ceil(-6.7)
-6
>>> math.ceil(-6)
-6
```
Округление вниз:
```
>>> math.floor(7.99)
7
>>> math.floor(-3.7)
-4
```
Константа: число пи:
```
>>> math.pi
3.141592653589793
```
Пример комбинированного использования:
```
>>> math.sin(2 * math.pi / 7 + math.exp(0.23))
0.8334902641414562
```
## Пункт 4
```
Модуль cmath для работы с комплексными числами
>>> import cmath
>>> dir(cmath)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin',
'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite',
'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin',
'sinh', 'sqrt', 'tan', 'tanh', 'tau']
>>> cmath.sqrt(1.2-0.5j)
(1.118033988749895-0.22360679774997896j)
>>> cmath.phase(1-0.5j)
-0.4636476090008061
```
## Пункт 5
Модуль random для генерации псевдослучайных чисел и работы с ними
```
>>> import random
>>> dir(random)
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom',
'TWOPI', '_Sequence', '_Set', '__all__', '__builtins__', '__cached__', '__doc__',
'__file__', '__loader__', '__name__', '__package__', '__spec__', '_accumulate', '_acos',
'_bisect', '_ceil', '_cos', '_e', '_exp', '_floor', '_inst', '_log', '_os', '_pi',
'_random', '_repeat', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom',
'_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss',
'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randbytes',
'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular',
'uniform', 'vonmisesvariate', 'weibullvariate']
>>> help(random.seed)
Help on method seed in module random:
seed(a=None, version=2) method of random.Random instance
Initialize internal state from a seed.
The only supported seed types are None, int, float,
str, bytes, and bytearray.
None or no argument seeds from current time or from an operating
system specific randomness source if available.
If *a* is an int, all bits are used.
For version 2 (the default), all of the bits are used if *a* is a str,
bytes, or bytearray. For version 1 (provided for reproducing random
sequences from older versions of Python), the algorithm for str and
bytes generates a narrower range of seeds.
>>> random.seed()
```
Эта функция инициализирует сид, т.е. начальное значение для дальнейшей генерации. Если ничего
не указано в скобках, то random.seed() вызывает time.time(), а эта функция, в свою очередь,
возвращает время в Unix-формате. То есть в качестве сида используется текущее время.
Случайное число от 0 до 1:
```
>>> help(random.random)
Help on built-in function random:
random() method of random.Random instance
random() -> x in the interval [0, 1).
>>> random.random()
0.009279717292968392
>>> random.random()
0.8044346046065457
>>> random.random()
0.2928444484701447
```
Равномерно распределенное случайное число:
```
>>> help(random.uniform)
Help on method uniform in module random:
uniform(a, b) method of random.Random instance
Get a random number in the range [a, b) or [a, b] depending on rounding.
>>> random.uniform(2,5)
4.803201121309196
```
Равномерное случайное целое:
```
>>> help(random.randint)
Help on method randint in module random:
randint(a, b) method of random.Random instance
Return random integer in range [a, b], including both end points.
>>> random.randint(3,18)
5
>>> random.randint(3,18)
13
```
Случайное из коллекции:
```
>>> help(random.choice)
Help on method choice in module random:
choice(seq) method of random.Random instance
Choose a random element from a non-empty sequence.
```
Вернет IndexError, если коллекция пустая.
```
>>> random.choice([False, "hehehe", 67, 90.7, 5+8j])
90.7
```
Случайное перемешивание элементов коллекции:
```
>>> help(random.shuffle)
Help on method shuffle in module random:
shuffle(x, random=None) method of random.Random instance
Shuffle list x in place, and return None.
Optional argument random is a 0-argument function returning a
random float in [0.0, 1.0); if it is the default None, the
standard random.random will be used.
>>> lst = [False, "hehehe", 67, 90.7, 5+8j]
>>> random.shuffle(lst)
>>> lst
[67, False, 90.7, (5+8j), 'hehehe']
```
Возвращает None, изменяет исходный объект. Работает только с изменяемами типами.
Нормально распределенное случайное число:
```
>>> help(random.gauss)
Help on method gauss in module random:
gauss(mu, sigma) method of random.Random instance
Gaussian distribution.
mu is the mean, and sigma is the standard deviation. This is
slightly faster than the normalvariate() function.
Not thread-safe without a lock around calls.
```
Без заданных матожидания и дисперсии, в отличие, например, от R, возвращает TypeError, а не
берет 0 и 1 как значения по умолчанию.
```
>>> random.gauss(0,1)
1.1859475053515318
```
Случайное подмножество:
```
>>> help(random.sample)
Help on method sample in module random:
sample(population, k, *, counts=None) method of random.Random instance
Chooses k unique random elements from a population sequence or set.
Returns a new list containing elements from the population while
leaving the original population unchanged. <...>
>>> random.sample(lst, 5)
['cherry', 'tangerine', 'banana', 'pineapple', 'peach']
>>> random.sample(lst, 1)
['tangerine']
>>> random.sample(lst, 0)
[]
```
Поставить как k число большее, чем длина коллекции, нельзя (TypeError)
Случайное число, подчиняющееся бета-распределению:
```
>>> help(random.betavariate)
Help on method betavariate in module random:
betavariate(alpha, beta) method of random.Random instance
Beta distribution.
Conditions on the parameters are alpha > 0 and beta > 0.
Returned values range between 0 and 1.
>>> random.betavariate(1,2)
0.4074810441922475
```
Случайное число, подчиняющееся гамма-распределению:
```
>>> help(random.gammavariate)
Help on method gammavariate in module random:
gammavariate(alpha, beta) method of random.Random instance
Gamma distribution. Not the gamma function!
Conditions on the parameters are alpha > 0 and beta > 0.
The probability distribution function is:
x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) = --------------------------------------
math.gamma(alpha) * beta ** alpha
>>> random.gammavariate(2,4)
1.9359228890418254
```
Список из четырех чисел с разными законами распределения:
```
>>> rl = [0] * 4
>>> rl[0] = random.uniform(2,6)
>>> rl[1] = random.gauss(2, 0.5)
>>> rl[2] = random.betavariate(2,6)
>>> rl[3] = random.gammavariate(2,6)
>>> rl
[2.6190336401985204, 1.82010731374589, 0.18732603571429413, 20.348843073887398]
```
## Пункт 6
```
time - модуль для работы со временем
>>> import time
>>> dir(time)
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__',
'altzone', 'asctime', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime',
'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time',
'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'thread_time',
'thread_time_ns', 'time', 'time_ns', 'timezone', 'tzname']
```
UNIX-время:
```
>>> c1 = time.time()
>>> c1
1758971496.5712385
>>> c2=time.time()-c1
>>> c2
8.266037702560425
```
Возвращается время в секундах с начала эпохи UNIX: 00:00:00 UTC 1 января 1970 года.
Текущее время:
```
>>> time.gmtime
<built-in function gmtime>
>>> help(time.gmtime)
Help on built-in function gmtime in module time:
gmtime(...)
gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,
tm_sec, tm_wday, tm_yday, tm_isdst)
Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.
GMT). When 'seconds' is not passed in, convert the current time instead.
If the platform supports the tm_gmtoff and tm_zone, they are available as
attributes only.>>> dat=time.gmtime()
>>> dat=time.gmtime()
>>> list(dat)
[2025, 9, 27, 11, 12, 18, 5, 270, 0]
>>> dat.tm_mon
9
>>> dat.tm_year
2025
>>> dat.tm_yday
270
>>> dat.tm_isdst #Показывает, действует ли летнее время (0 - нет, 1 - да, -1 - нет данных)
0
```
Текущее время с учетом часового пояса:
```
>>> here = time.localtime()
>>> list(here)
[2025, 9, 27, 14, 16, 28, 5, 270, 0]
```
Время из кортежа в строку:
```
>>> time.asctime(here)
'Sat Sep 27 14:16:28 2025'
```
Время из секунд в строку:
```
>>> time.ctime()
'Sat Sep 27 14:17:07 2025'
```
Пауза:
```
>>> time.sleep(5)
```
Из кортежа в секунды с начала эпохи:
```
>>> time.mktime(here)
1758971788.0
```
## Пункт 7
```
Графические функции модуля pylab пакета matplotlib
>>> import matplotlib
>>> import pylab
>>> x=list(range(-3,55,4))
>>> t=list(range(15))
>>> pylab.plot(t,x) #Создание графика в оперативной памяти
[<matplotlib.lines.Line2D object at 0x00000158D9921670>]
>>> pylab.title('Первый график')
Text(0.5, 1.0, 'Первый график')
>>> pylab.xlabel('время')
Text(0.5, 0, 'время')
>>> pylab.ylabel('сигнал')
Text(0, 0.5, 'сигнал')
>>> pylab.show()
```
Открылось внешнее окно с графиком. Файл сохранен с именем Ris1
Два графика на одном окне:
```
>>> X1=[12,6,8,10,7]
>>> X2=[5,7,9,11,13]
>>> pylab.plot(X1)
[<matplotlib.lines.Line2D object at 0x00000158D9AEB130>]
>>> pylab.plot(X2)
[<matplotlib.lines.Line2D object at 0x00000158D9AEB3D0>]
>>> pylab.show()
```
Появились две ломаные линии синего и оранжевого цвета.
Круговая диаграмма:
```
>>> region=['Центр','Урал','Сибирь','Юг']
>>> naselen=[65,12,23,17]
>>> naselen=[65,12,23,17]
([<matplotlib.patches.Wedge object at 0x00000158DBCC8820>, <matplotlib.patches.Wedge object at 0x00000158DBCC8760>, <matplotlib.patches.Wedge object at 0x00000158DBCC8FD0>, <matplotlib.patches.Wedge object at 0x00000158DBCDE490>], [Text(-0.1910130855889933, 1.083288512416601, 'Центр'), Text(-0.8613283319035216, -0.6841882085072037, 'Урал'), Text(0.04429273729355889, -1.0991078898011077, 'Сибирь'), Text(0.9873752043868569, -0.4848610169543564, 'Юг')])
>>> pylab.show()
```
Сохранено в Ris2
Столбиковая диаграмма:
```
>>> fruits = ["apple", "date", "apricot", "raspberry", "watermelon"]
>>> values = [10, 15, 7, 20, 3]
>>> pylab.bar(fruits, values, color='skyblue')
<BarContainer object of 5 artists>
>>> pylab.show()
```
Сохранено в Ris4
## Пункт 8
Статистический модуль statistics
```
>>> dir(statistics)
['Counter', 'Decimal', 'Fraction', 'NormalDist', 'StatisticsError', '__all__',
'__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', '_coerce', '_convert', '_exact_ratio', '_fail_neg',
'_find_lteq', '_find_rteq', '_isfinite', '_normal_dist_inv_cdf', '_ss', '_sum',
'bisect_left', 'bisect_right', 'erf', 'exp', 'fabs', 'fmean', 'fsum', 'geometric_mean',
'groupby', 'harmonic_mean', 'hypot', 'itemgetter', 'log', 'math', 'mean', 'median',
'median_grouped', 'median_high', 'median_low', 'mode', 'multimode', 'numbers', 'pstdev',
'pvariance', 'quantiles', 'random', 'sqrt', 'stdev', 'tau', 'variance']
```
Математическое ожидание:
```
>>> data = [10, 20, 30, 40, 50]
>>> statistics.mean(data)
30
```
Если объект пустой, вернет StatisticsError
Медиана:
```
>>> statistics.median(data)
30
```
Среднеквадратичное отклонение:
```
>>> statistics.stdev(data)
15.811388300841896
```
Среднее можно сообщить самостоятельно: stdev(data, xbar=None)
Дисперсия:
```
>>> statistics.variance(data)
250
```
Квантили:
```
>>> data = [10, 56, 73, 7, 20, 30, 40, 50, 56, 77, 3]
>>> statistics.quantiles(data)
[10.0, 40.0, 56.0]
```

@ -0,0 +1,66 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 4
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Пункт 1
Напишите и исполните единое выражение, реализующее последовательное выполнение
следующих операций: вычисление фазы комплексного числа 0.2+0.8j, округление результата
до двух знаков после запятой, умножение полученного значения на 20, получение кортежа из
двух значений: округленное вниз значение от деления результата на 3 и остатка от этого
деления
```
>>> divmod((round(cmath.phase(0.2 + 0.8j), 2) * 20), 3)
(8.0, 2.6000000000000014)
```
## Пункт 2
Создайте объект класса struct_time с временными параметрами для текущего
московского времени. Создайте строку с текущим часом и минутами.
```
>>> nowtime = time.localtime()
>>> nowtime
time.struct_time(tm_year=2025, tm_mon=9,
tm_mday=27, tm_hour=1, tm_min=44, tm_sec=10, tm_wday=0, tm_yday=274, tm_isdst=0)
>>> nows = str(nowtime.tm_hour) + " " + str(nowtime.tm_min)
>>> nows
'15 19'
```
## Пункт 3
Создайте список с элементами – названиями дней недели. Сделайте случайную выборку
из этого списка с тремя днями недели.
```
>>> week = ["понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"]
>>> random.sample(week, 3)
['воскресенье', 'понедельник', 'пятница']
```
## Пункт 4
Напишите инструкцию случайного выбора числа из последовательности целых чисел от
14 до 32 с шагом 3.
```
>>> random.choice(range(14, 32, 3))
26
>>> random.choice(range(14, 32, 3))
14
```
## Пункт 5
Сгенерируйте нормально распределенное число N с математическим ожиданием 15 и
стандартным отклонением 4 и округлите его до целого значения. Создайте список с N
элементами – случайно выбранными буквами латинского алфавита.
```
>>> N = round(random.gauss(15,4))
>>> N
10
>>> lst = list("abcdefghijgklmnopqrstuvwxyz")
>>> random.sample(lst, N)
['q', 'g', 'i', 'z', 'h', 'y', 'r', 'o', 'f', 'n']
```
Или в одну строку:
```
>>> random.sample(list("abcdefghijgklmnopqrstuvwxyz"), round(random.gauss(15,4)))
['y', 'l', 'f', 'x', 'o', 'e', 'h', 'i', 'b', 'd', 't', 'm', 'n', 'a', 'j', 'u', 'g', 'g', 's']
```
## Пункт 6
Напишите инструкцию для определения временного интервала в минутах, прошедшего с
момента предыдущего (из п.2) определения временных параметров.
```
>>> (time.mktime(nowtime) - time.mktime(time.localtime())) / 60
-4.166666666666667
```

@ -0,0 +1,15 @@
# Индивидуальное контрольное задание по Теме 4
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание:
Вариант 8: Напишите инструкцию создания переменной со значением – календарными данными момента начала выполнения контрольного задания. Создайте кортеж с последовательностью элементов со значениями от -26 до 46 с шагом 9. Подсчитайте число элементов в созданном кортеже. Отобразите результат в виде строки по шаблону: «Число элементов = <значение>». Напишите инструкцию определения числа секунд, прошедших с начала выполнения контрольного задания.
## Решение:
```
>>> start_time = time.time()
>>> a = tuple(range(-26, 47, 9))
>>> count = len(a)
>>> print(f"Число элементов = {count}")
Число элементов = 9
>>> proshlo_sekund = time.time() - start_time
>>> print(f"Прошло секунд: {proshlo_sekund:.6f}")
Прошло секунд: 258.212157
```

Двоичные данные
TEMA5/Figure_1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 30 KiB

Двоичные данные
TEMA5/Figure_2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 18 KiB

@ -0,0 +1,445 @@
# Тема 5. Блоки инструкций, управляющие инструкции
Выполнил: Тимошенко А.А.
Проверил: Козлюк Д. А.
## Пункт 1.
```
>>> import os
>>> os.chdir("C:/Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА5")
```
## Пункт 2. Ветвление по условию (if)
Общий вид выглядит так:
if <условие>:
<отступы> <Блок инструкций, выполняемый, если условие истинно>
[elif <условие2>:
<отступы><Блок инструкций2, выполняемый, если условие2 истинно>
]
[else:
< отступы><Блок инструкций3, выполняемый, если условие ложно>
]
Причем elif и else вместе или по отдельности могут отсуствовать.
Пример:
```
>>> porog = 6
>>> rashod1 = 8
>>> rashod2 = 5
>>> if rashod1 >= porog:
dohod = 12 # Это выполняется, если rashod1 >= porog
elif rashod2 == porog:
dohod = 0 # Это выполняется, если первое условие ложно, но rashod2 == porog
else:
dohod = -8 # Это выполняется, если ни первое, ни второе условие не были истинными
>>> dohod
12
```
Оператор rashod1 >= porog (например, в числах, 8 >= 5) возвращает логическое значение True,
поэтому будет выполняться блок инструкций, соответствующий этому условию. Важно понимать,
что в конструкции if-elif-else всегда выполняется только одна ветвь. Даже если условие
в elif также истинно, оно не будет проверено и, соответственно, не выполнится, если до
этого уже выполнился блок if. Это связано с тем, что после выполнения любого блока
инструкции (будь то if, elif или else) остальные части конструкции игнорируются.
Перезададим некоторые значения и выполним другую управляющую инструкцию:
```
>>> rashod2 = 4
>>> porog = 4
>>> if rashod1 >= 3 and rashod2 == 4: #Верно
dohod = rashod1
if rashod2 == porog or rashod1 < rashod2: #Тоже верно
dohod = porog
>>> dohod
4
```
В данном случае выполняются оба if, потому что один находится в блоке инструкций другого
вложенное условие). Вложенное условие будет проверяться в любом случае, если выполнилось
внешнее.
```
>>> if porog == 3: #Неверно
dohod = 1
elif porog == 4: #Верно
dohod = 2
elif porog == 5: #Игнорируется
dohod = 3
else: #Игнорируется
dohod = 0
>>> dohod
2
```
Еще одна форма записи условных управляющих инструкций - тернарный оператор (от лат. "тройной"):
<Объект> = <значение 1> if <условие> else <значение 2>
```
>>> dohod = 2 if porog >= 4 else 0
>>> dohod
2
```
Если в блоке инструкций всего одна строка, можно записать всё в одну строку:
```
>>> porog = 2
>>> if porog >= 5 : rashod1 = 6; rashod2 = 0
>>> rashod1
8
>>> rashod2
4
```
Поскольку сейчас значение porog было задано таким, чтобы не удовлетворять условию, то
эта строка полностью не была выполнена и не повлияла на значения переменных. Но в другом
случае:
```
>>> porog = 7
>>> if porog >= 5 : rashod1 = 6; rashod2 = 0
>>> rashod1
6
>>> rashod2
0
```
Выполняется условие и выполняются инструкции.
## Пункт 3. Цикл по перечислению (for)
for <Объект-переменная цикла> in <объект>:
<отступы> <Блок инструкций 1 – тело цикла>
[else:
<отступы> <Блок инструкций 2 – если в цикле не сработал break>]
В качестве объекта сойдёт любая коллекция или, например, диапазон range. Если сообщить
словарь, то будут перебираться его ключи. Если сообщить множество, перебор будет осуществлен,
но порядок будет неочевидным.
### Пункт 3.1. Простой цикл.
```
>>> temperatura = 5
>>> for i in range(3,18,3):
temperatura += i
>>> temperatura
50
```
### Пункт 3.2. Более сложный цикл.
```
>>> sps=[2,15,14,8]
>>> for k in sps:
if len(sps) <= 10: sps.append(sps[0])
else: break
>>> sps
[2, 15, 14, 8, 2, 2, 2, 2, 2, 2, 2]
```
Как видно, в конец цикла добавляется двойка до тех пор, пока длина не превысит 10. Важно
понимать, что sps - это и объект, по которому проходит k, и объект, изменяющийся
внутри цикла. То есть k будет двигаться по циклу бесконечно, и выполнение останавливается
именно из-за условия if - else.
(При этом else в данном случае относится к if, а не к for (это можно понять не только по
смыслу, но и по табуляции)
Рассмотрим другой вариант:
```
>>> sps=[2,15,14,8]
>>> for k in sps[:]:
if len(sps)<=10:
sps.append(sps[0])
else: break
>>> sps
[2, 15, 14, 8, 2, 2, 2, 2]
```
Как видно, итог другой, и вот почему. Операция взятия среза sps[:] создает полную копию
исходного списка (грубо говоря, срез от начала до конца включительно).
Теперь список, по которому пробегается k, и список, изменяющийся внутри цикла - это объекты,
имеющие разные адреса. Это можно проверить:
```
>>> id(sps)
1684034116672
>>> id(sps[:])
1684069134400
```
Следовательно, else не успеет сработать, потому что итерируемый в управляющей инструкции
объект окажется короче и завершит цикл раньше:
### Пункт 3.3
```
>>> import random as rn
>>> sps5 = []
>>> for i in range(10):
sps5.append(rn.randint(1,100))
ss = sum(sps5)
if ss > 500: break
else:
print(ss)
```
Программа ничего не вывела. Посмотрим, почему именно:
```
>>> ss
501
>>> sps5
[25, 66, 4, 30, 8, 97, 87, 11, 51, 57, 65]
```
После того, как прошло одиннадцать итераций, сумма элементов списка уже была больше 500, поэтому
цикл закончился из-за if, а не из-за окончания диапазона range(10).
Попробуем обнулить список и выполнить ту же программу еще раз:
```
>>> sps5 = []
>>> for i in range(10):
sps5.append(rn.randint(1,100))
ss = sum(sps5)
if ss > 500: break
else:
print(ss)
436
```
В этот раз программа вывела ответ самостоятельно, потому что сработал else, потому что
за все десять итераций цикла так и не успел выполниться break по условию if.
Примечание:
Рассмотрим строку >>> import random as rn
Если мы попробуем вызвать функцию из этого модуля по ее исходному названию, ничего не
выйдет:
```
>>> random.randint(4,7)
Traceback (most recent call last):
File "<pyshell#105>", line 1, in <module>
random.randint(4,7)
NameError: name 'random' is not defined
```
Так происходит потому, что на этапе преобразования программы в байт-код python связывает
модуль random, найденный где-то в каталогах, принадлежащих python, с именем rs. Модуль
random становится объектом в пространстве имен, создаётся ссылка на объект модуля random
и ему присваивается имя rn. Но имя random ему НЕ присваивается, поэтому обратиться к
методам и атрибутам по имени random нельзя.
### Пункт 3.4. Пример с символьной строкой
```
>>> stroka = 'Это – автоматизированная система'
>>> stroka1 = ""
>>> for ss in stroka:
stroka1 += " " + ss
>>> stroka1
' Э т о – а в т о м а т и з и р о в а н н а я с и с т е м а'
```
Переменная ss проходит по всему строковому объекту, на каждой итерации принимая значение
одного знака. Этот знак с предшествующим пробелом дописывается в конец другой, изначально
пустой строки. Цикл закончится, когда закончится исходная строка.
### Пункт 3.5. Запись цикла в строке
```
>>> import math
>>> sps2=[math.sin(i*math.pi/5+2) for i in range(100)]
>>> sps2
[0.9092974268256817, 0.49103209793281005, -0.11479080280322804, -0.6767675184643197, -0.9802420445539634, -0.9092974268256817, -0.49103209793281016, 0.11479080280322791, 0.6767675184643196, 0.9802420445539634, 0.9092974268256818, 0.4910320979328103, -0.1147908028032278, -0.6767675184643196, -0.9802420445539632, -0.9092974268256818, -0.4910320979328104, 0.11479080280322768, 0.6767675184643195, 0.9802420445539632, 0.9092974268256819, 0.4910320979328105, -0.11479080280322579, -0.6767675184643194, -0.9802420445539632, -0.9092974268256819, -0.4910320979328106, 0.11479080280322743, 0.6767675184643193, 0.9802420445539632, 0.909297426825682, 0.49103209793281066, -0.1147908028032273, -0.6767675184643192, -0.9802420445539632, -0.909297426825682, -0.4910320979328108, 0.11479080280322719, 0.6767675184643192, 0.9802420445539631, 0.9092974268256822, 0.491032097932814, -0.11479080280322707, -0.676767518464319, -0.9802420445539625, -0.9092974268256822, -0.491032097932811, 0.11479080280323047, 0.6767675184643189, 0.9802420445539625, 0.9092974268256822, 0.4910320979328142, -0.11479080280322682, -0.6767675184643215, -0.9802420445539631, -0.9092974268256808, -0.4910320979328112, 0.11479080280322317, 0.6767675184643187, 0.9802420445539624, 0.9092974268256823, 0.4910320979328082, -0.11479080280322658, -0.6767675184643213, -0.980242044553963, -0.9092974268256838, -0.49103209793281144, 0.11479080280322293, 0.6767675184643186, 0.9802420445539637, 0.9092974268256824, 0.49103209793280844, -0.11479080280322633, -0.6767675184643158, -0.980242044553963, -0.9092974268256839, -0.49103209793281166, 0.11479080280322974, 0.6767675184643184, 0.9802420445539637, 0.9092974268256825, 0.4910320979328149, -0.11479080280321903, -0.6767675184643209, -0.9802420445539629, -0.909297426825681, -0.4910320979328119, 0.11479080280322244, 0.6767675184643129, 0.9802420445539636, 0.9092974268256826, 0.49103209793281505, -0.11479080280322584, -0.6767675184643155, -0.9802420445539644, -0.9092974268256812, -0.49103209793281205, 0.1147908028032222, 0.6767675184643127, 0.980242044553965]
```
Такая конструкция называется list comprehention (генератор списков). В общем
виде она выглядит так:
<итоговый список> = [<выражение> for <элемент> in <исходный объект> if <условие>]
Эту синусоиду можно отобразить на графике:
```
>>> import pylab
>>> pylab.plot(sps2, label='Синусоидальный сигнал', color = 'green')
[<matplotlib.lines.Line2D object at 0x0000018834CBB460>]
>>> pylab.show()
```
Полученный график корректен и и сохранен в файле Figure_1
## Пункт 4. Цикл "пока истинно условие" (while)
Общий вид:
```
while <Условие>:
<отступы><Блок инструкций 1 – тело цикла>
[else:
<отступы><Блок инструкций 2 – если в цикле не сработал break>]
break и else работают аналогично предыдущему случаю.
```
### Пункт 4.1. Цикл со счетчиком
```
>>> rashod = 300
>>> while rashod:
print("Расход =",rashod)
rashod -= 50
Расход = 300
Расход = 250
Расход = 200
Расход = 150
Расход = 100
Расход = 50
```
Как именно произошло завершение цикла? Нужно вспомнить, что все числа, кроме нуля, при
конвертации в логический тип данных имеют логическое значение True:
```
>>> bool(50)
True
```
И только нуль имеет значение False:
```
>>> bool(0)
False
```
Сравниваемая в управляющей инструкции переменная уменьшается в самом цикле, поэтому, когда
строка со сравнением обнаружит 0, то воспримет это как False, и действия по выводу
и уменьшению числа выполняться больше не будут.
### Пункт 4.2. Пример с символьной строкой
```
>>> import math
>>> stroka='Расчет процесса в объекте регулирования'
>>> i=0
>>> sps2=[]
>>> while i<len(stroka):
r=1-2/(1+math.exp(0.1*i))
sps2.append(r)
print('Значение в момент',i,"=",r)
i+=1
Значение в момент 0 = 0.0
Значение в момент 1 = 0.049958374957880025
Значение в момент 2 = 0.09966799462495568
Значение в момент 3 = 0.14888503362331795
...
Значение в момент 37 = 0.9517459571646616
Значение в момент 38 = 0.9562374581277391
```
У цикла 38 повторений, по числу элементов в строке, но на 1 меньше. На каждой итерации
значение i на единицу меньше, чем в предыдущей.
```
>>> pylab.plot(sps2, label='Сигнал выхода', color='red')
[<matplotlib.lines.Line2D object at 0x00000188336D9FA0>]
>>> pylab.title("Сигнал на выходе инерционного звена")
Text(0.5, 1.0, 'Сигнал на выходе инерционного звена')
>>> pylab.show()
```
График сохранен под именем Figure_2.
### Пункт 4.3. Определение, является ли число простым (делится только на самого себя или 1).
```
>>> chislo = 267
>>> kandidat = chislo // 2
>>> while kandidat > 1:
if chislo % kandidat == 0:
print(chislo, ' имеет множитель ', kandidat)
break
kandidat -= 1
else:
print(chislo, ' является простым!')
267 имеет множитель 89
```
Программа работает так: переменная kandidat отвечает за потенциальный делитель заданного
числа. Изначально мы задаем половину от заданного числа, потому что у числа не может быть
делителя большего, чем половина от него. Далее мы последовательно уменьшаем потенциальный
множитель, каждый раз проверяя, получилось ли поделить без остатка. Если получилось, то
число непростое, и цикл можно прекращать досрочно. Если цикл отработал до конца, не
прервавшись, то число простое.
Дополниим программу так, чтобы она проверяла все числа от 250 до 300.
```
>>> chislo = [x for x in range (250, 301)]
>>> for now in chislo:
kandidat = now // 2
while kandidat > 1:
if now % kandidat == 0:
print(now, ' имеет множитель ', kandidat)
break
kandidat -= 1
else: #ОБЯЗАТЕЛЬНО относится не к if и не к for, а к while
print(now, " является простым!")
250 имеет множитель 125
251 является простым!
252 имеет множитель 126
253 имеет множитель 23
254 имеет множитель 127
255 имеет множитель 85
256 имеет множитель 128
257 является простым!
258 имеет множитель 129
259 имеет множитель 37
260 имеет множитель 130
261 имеет множитель 87
262 имеет множитель 131
263 является простым!
264 имеет множитель 132
265 имеет множитель 53
266 имеет множитель 133
267 имеет множитель 89
268 имеет множитель 134
269 является простым!
270 имеет множитель 135
271 является простым!
272 имеет множитель 136
273 имеет множитель 91
274 имеет множитель 137
275 имеет множитель 55
276 имеет множитель 138
277 является простым!
278 имеет множитель 139
279 имеет множитель 93
280 имеет множитель 140
281 является простым!
282 имеет множитель 141
283 является простым!
284 имеет множитель 142
285 имеет множитель 95
286 имеет множитель 143
287 имеет множитель 41
288 имеет множитель 144
289 имеет множитель 17
290 имеет множитель 145
291 имеет множитель 97
292 имеет множитель 146
293 является простым!
294 имеет множитель 147
295 имеет множитель 59
296 имеет множитель 148
297 имеет множитель 99
298 имеет множитель 149
299 имеет множитель 23
300 имеет множитель 150
```
### Пункт 4.4. Инструкция continue.
Она используется, когда надо при определенном условии не завершить весь цикл, а завершить
только текущую итерацию.
Пример (вывести только положительные числа):
```
>>> nums = [rn.randint(-30, 30) for x in range(15)]
>>> nums
[-11, -1, 25, -11, 12, 24, -28, -16, -2, 15, -25, -2, -15, 9, -4]
>>> for now in nums:
if now < 0: continue
print(now, " > 0")
else: print("все числа обработаны")
25 > 0
12 > 0
24 > 0
15 > 0
9 > 0
все числа обработаны
```

@ -0,0 +1,98 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 5
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание
Для заданной символьной строки с англоязычным текстом (его можно заимствовать из помощи)
определите порядковый номер каждой буквы в английском алфавите.
Создайте список со словами из задания данного пункта. Для этого списка – определите,
есть ли в нем некоторое заданное значение, и выведите соответствующее сообщение: либо о
нахождении элемента, либо о его отсутствии в списке (проверить как с имеющимся, так и с
отсутствующим словом).
Создайте список студентов вашей группы (3-4 фамилии) и список их средних баллов в
летней сессии – в порядке перечисления студентов в первом списке. Создайте еще 2 аналогичных
списка для тех же студентов, но в другом порядке, по зимней сессии. Напишите инструкции,
позволяющие по указанной (запрошенной и введенной) фамилии студента вывести его средние
баллы по двум сессиям.
## Решение
```
>>> alphabet = "abcdefghijklmnopqrstuvwxyz"
>>> text = "There is a house in New Orleans, They call The Rising Sun"
>>> for now in range(len(text)):
low = text.lower()
letter = low[now]
if not letter in alphabet:
continue
else:
print("Буква ", letter, " имеет ", alphabet.index(letter) + 1,
"порядковый номер в алфавите")
Буква t имеет 20 порядковый номер в алфавите
Буква h имеет 8 порядковый номер в алфавите
Буква e имеет 5 порядковый номер в алфавите
Буква r имеет 18 порядковый номер в алфавите
...
Буква g имеет 7 порядковый номер в алфавите
Буква s имеет 19 порядковый номер в алфавите
Буква u имеет 21 порядковый номер в алфавите
Буква n имеет 14 порядковый номер в алфавите
>>> text = """Создайте список со словами из задания данного пункта Для этого
списка определите есть ли в нем некоторое заданное значение и выведите соответствующее
сообщение либо о нахождении элемента либо о его отсутствии в списке проверить как с
имеющимся так и с отсутствующим словом"""
>>> lst = text.split(" ")
>>> lst
['Создайте', 'список', 'со', 'словами', 'из', 'задания', 'данного', 'пункта', 'Для', 'этого',
'списка', 'определите', 'есть', 'ли', 'в', 'нем', 'некоторое', 'заданное', 'значение', 'и',
'выведите', 'соответствующее', 'сообщение', 'либо', 'о', 'нахождении', 'элемента', 'либо',
'о', 'его', 'отсутствии', 'в', 'списке', 'проверить', 'как', 'с', 'имеющимся', 'так', 'и',
'с', 'отсутствующим', 'словом']
>>> target = "либо"
>>> for now in lst:
if now == target:
print ("Такое слово есть")
break
else:
print("Такого слова нет")
Такое слово есть
>>> target = "космос"
>>> for now in lst:
if now == target:
print ("Такое слово есть")
break
else:
print("Такого слова нет")
Такого слова нет
>>> studs = ["Timoshenko", "Hodyk", "Kovalenko", "Ivanov"]
>>> summer_marks = [4.52, 4.50, 4.40, 4.10]
>>> studs2 = ["Ivanov", "Kovalenko", "Hodyk", "Timoshenko"]
>>> winter_marks = [4.3, 4.23, 4.16, 4.82]
>>> student = input("Введите фамилию: ")
Введите фамилию: Timoshenko
>>> while student != "q":
if (student in studs) and (student in studs2):
sum_answer = summer_marks[studs.index(student)]
win_answer = winter_marks[studs2.index(student)]
print("Балл летом: ", sum_answer, "\nЗимой: ", win_answer, "\nСредний :",
(sum_answer + win_answer)/2)
else:
print("Такого студента нет :(")
student = input("Введите фамилию (q для выхода): ")
Балл летом: 4.52
Зимой: 4.82
Средний : 4.67
Введите фамилию (q для выхода): Kovalenko
Балл летом: 4.4
Зимой: 4.23
Средний : 4.315
Введите фамилию (q для выхода): q
```

@ -0,0 +1,61 @@
# Индивидуальное контрольное задание по Теме 5
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание:
Вариант 4: Создайте список с 20 случайными, нормально распределенными (математическое ожидание равно 3400, стандартное отклонение равно 121) числами. Рассчитайте по нему среднее значе-ние и число элементов, значение которых превышает это среднее.
## Решение:
```
>>> import random
>>> # Параметры распределения из задания
>>> mu = 3400
>>> sigma = 121
>>> n = 20
>>> # Создам пустой список для хранения чисел
>>> numbers = []
>>> # Заполню список случайными числами
>>> for i in range(n):
... # Генерирую случайное число с нормальным распределением
... # Использую формулу преобразования: x = mu + sigma * random.gauss(0, 1)
... number = mu + sigma * random.gauss(0, 1)
... numbers.append(number)
>>> # Здесь я вывожу сгенерированные числа
>>> print("Сгенерированные числа:")
>>> for i in range(n):
... print("Число", i+1, ":", "%.2f" % numbers[i])
>>> # Рассчитываю среднее значение
>>> summa = 0
>>> for num in numbers:
... summa += num
>>> mean_value = summa / n
>>> print("\nСреднее значение:", "%.2f" % mean_value)
>>> # Подсчитываю числа выше среднего
>>> count_above = 0
>>> for num in numbers:
... if num > mean_value:
... count_above += 1
>>> print("Количество чисел выше среднего:", count_above)
Сгенерированные числа:
Число 1: 3300.47
Число 2: 3641.42
Число 3: 3422.97
Число 4: 3415.40
Число 5: 3300.32
Число 6: 3385.84
Число 7: 3297.38
Число 8: 3426.89
Число 9: 3489.59
Число 10: 3452.55
Число 11: 3574.94
Число 12: 3439.11
Число 13: 3377.13
Число 14: 3219.63
Число 15: 3339.65
Число 16: 3307.97
Число 17: 3333.71
Число 18: 3273.80
Число 19: 3332.02
Число 20: 3309.60
Среднее значение: 3382.02
Количество чисел выше среднего: 9
```

@ -0,0 +1,4 @@
1,2,3
4,5,6
7,8,9
10,11,12

@ -0,0 +1,38 @@
# Тест по модулю 2
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание(Вариант 7)
1) С помощью текстового редактора создайте текстовый файл с некоторым именем, в котором будет 4 строки и на каждой строке будет по 3 числа, разделенных запятыми.
2) Запросите у пользователя и введите имя файла с данными для обработки. Обеспечьте вывод сообщения при вводе пустой строки и повторный ввод.
3) Введите данные из указанного файла и представьте их в виде списка.
4) Рассчитайте по введенным данным среднее значение синусов элементов списка.
5) Выведите рассчитанное значение на экран по шаблону: " По <число элементов в списке> элементам среднее синусов = <рассчитанное среднее>". При этом значение среднего должно быть округлено до двух знаков после точки.
## Решение
```
import os
import math
file_name = input('Введите имя файла: ')
while file_name == '':
print('Ошибка! Введите имя файла.')
file_name = input('Введите имя файла: ')
with open(file_name, 'r') as f:
data_list = []
for line in f:
numbers = line.strip().split(',') #тут я убрал пробелы и переносы в начале и конце строки, и разбил строку на части по запятым
data_list.extend([float(x) for x in numbers])#тут добавил числа в общий список
sin_sum = sum(math.sin(x) for x in data_list)
average = sin_sum / len(data_list)
print(f'По {len(data_list)} элементам среднее синусов = {average:.2f}')
Введите имя файла: module.txt
По 12 элементам среднее синусов = -0.01
```

@ -0,0 +1,736 @@
# Тема 6. Ввод-вывод данных и операции с файлами
Выполнил: Тимошенко А.А.
Проверил: Козлюк Д.А.
## Пункт 1
```
>>> import os
>>> os.chdir("C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6")
```
## Пункт 2. Вывод данных на экран дисплея.
### Пункт 2.1. Вывод данных в командной строке.
Эхо-вывод в терминал
```
>>> stroka='Автоматизированная система управления'
>>> stroka
'Автоматизированная система управления'
```
### Пункт 2.2 Вывод с использованием функции print
```
>>> help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
>>> fff = 234.5; gg = 'Значение температуры = '
>>> print(gg, fff)
Значение температуры = 234.5
```
Это работает и в терминале, и в скриптах, которые записаны в файлы .ру. Причем видно, что
вывод через print() убирает у строки кавычки при выводе.
По умолчанию выводимые объекты разделяются через пробел, но это можно изменить, задав
значение сепаратору sep:
```
>>> print(gg, fff, sep='/')
Значение температуры = /234.5
```
По умолчанию после того, как функция print() сделала вывод, происходит перенос курсора на
следующую строку. Это тоже можно изменить. Параметр end по умолчанию имеет значение "\n",
его можно изменить на другое.
```
>>> print(gg, fff,sep = '/', end = '***'); print('____')
Значение температуры = /234.5***____
```
Можно просто вызвать перенос курсора без какого-либо текста, вызвав print() без аргументов:
```
>>> print()
>>>
```
Если текст большой, можно расположить его в несколько строк:
```
>>> print(""" Здесь может выводиться
большой текст,
занимающий несколько строк""")
Здесь может выводиться
большой текст,
занимающий несколько строк
```
Или переносить отдельные объекты, разделенные запятой:
```
>>> print("Здесь может выводиться",
"большой текст,",
"занимающий несколько строк")
Здесь может выводиться большой текст, занимающий несколько строк
```
Разница в том, что в первом случае тройные кавычки воспроизводят текст ровно так, как он был
введен. В тексте были введены переносы строки, но они были введены не как символ \n, а
в обычном, человеку понятном виде.
Во втором случае три выводимых объекта-строки перечисленны через запятую, и это работает как
обычный print(), разделяющий объекты с помощью пробелов, если не указано иное.
### Пункт 2.3. Вывод с использованием write объекта stdout (поток стандартного вывода) модуля sys.
```
>>> import sys
>>> help(sys.stdout.write)
Help on method write in module idlelib.run:
write(s) method of idlelib.run.StdOutputFile instance
Write string to stream.
Returns the number of characters written (which is always equal to
the length of the string).
>>> sys.stdout.write("Функция write")
Функция write13
```
По умолчанию каретка не переводится! Если нужно перевести, это нужно указать вручную.
```
>>> sys.stdout.write("Функция write\n")
Функция write
14
```
Важно отметить, что функция выводит текст, но возвращает число. Это число - количество
введенных символов, причем \n считается за один символ, а не за два.
Это можно проверить:
```
>>> type(sys.stdout.write("Функция write"))
Функция write<class 'int'>
```
Если вызвать эту функцию без аргументов, вернется ошибка:
```
>>> sys.stdout.write()
Traceback (most recent call last):
...
TypeError: write() missing 1 required positional argument: 's'
```
Если сообщить пустую строку, то, соответственно, 0.
```
>>> sys.stdout.write("")
0
```
## Пункт 3. Ввод данных с клавиатуры.
```
>>> help(input)
Help on built-in function input in module builtins:
input(prompt=None, /)
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a
trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
On *nix systems, readline is used if available.
```
Функция input() приостанавливает дальнейшее выполнение программы и ожидает ввод от пользователя.
Выполнение программы продолжится только после нажатия Enter. input() всегда возвращает строку,
даже если ввести числа или, например, функцию. Если нужна не строка, то input надо поместить
внутрь функции, изменяющей тип данных. Например, int(input()).
input() может принимать один аргумент: приглашение для пользователя. Это тоже строка, и с
помощью нее можно конкретизировать для человека, что означают данные, которые он вводит.
При этом после вывода строки-приглашения каретка не переносится, пробел не ставится.
```
>>> psw = input('Введите пароль:')
Введите пароль:123456789
>>> psw
'123456789'
>>> type(psw)
<class 'str'>
```
Пример 1
```
>>> while True:
znach=float(input('Задайте коэф.усиления = '))
if znach < 17.5 or znach > 23.8:
print('Ошибка!')
else:
break
Задайте коэф.усиления = 15.4
Ошибка!
Задайте коэф.усиления = 21.6
```
Пример 2
```
>>> import math
>>> print(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23 / (1 + math.exp(-3.24)))
1.34504378689765
```
Введенная через input() строка преобразуется в исполнительные инструкции с помощью eval(),
они потом выполняются и результат выводится на экран. Строка имеет тип, соответствующий
результату вычислений и задаваемый автоматически:
```
>>> type(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = 1+2
<class 'int'>
```
```
>>> type(eval(input('введите выражение для расчета = ')))
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
<class 'float'>
```
## Пункт 4. Ввод-вывод при работе с файлами.
### Пункт 4.1. Функции для работы с путём к файлу.
```
>>> import os
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6'
>>> timoshenko = os.getcwd()
>>> timoshenko # Если просто сделать эхо-вывод, бекслеши будут двойными.
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6'
>>> print(timoshenko) # Если сделать вывод с print(), то одинарными.
C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА6
```
Сменим директорию и посмотрим, что смена произошла:
```
>>> os.chdir("C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6")
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6'
```
Создание каталога (mkdir)
```
>>> help(os.mkdir)
mkdir(path, mode=511, *, dir_fd=None)
Create a directory.
If dir_fd is not None, it should be a file descriptor open to a directory,
and path should be relative; path will then be relative to that directory.
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError.
The mode argument is ignored on Windows.
>>> help(os.mkdir)
>>> os.chdir("test")
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test'
```
Теперь путь от самого диска можно не указывать, т.к. мы уже находимся в нужной корневой папке.
Функция вернет FileExistsError, если папка с таким именем уже существует в текущей директории.
mode - нужно для настройки прав доступа.
Удаление каталога
```
>>> help(os.rmdir)
Help on built-in function rmdir in module nt:
rmdir(path, *, dir_fd=None)
Remove a directory.
If dir_fd is not None, it should be a file descriptor open to a directory,
and path should be relative; path will then be relative to that directory.
dir_fd may not be implemented on your platform.
If it is unavailable, using it will raise a NotImplementedError.
```
1) Не получится удалить каталог, в котором находимся мы, обратившись по полному пути. Это вернет
ошибку:
```
>>> os.rmdir('C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test')
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
os.rmdir('C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test')
PermissionError: [WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test'
```
2) Для того, чтобы корректно выполнить удаление той папки, где мы находимся, надо сначала
подняться на уровень выше, и уже там произвести удаление:
```
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6\\test'
>>> os.chdir('../') # Поднимает нас на одну папку выше. ../../ - для двух папок и т.д.
>>> os.getcwd()
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\еще тема 6'
>>> os.rmdir("test")
```
3) Попробуем удалить эту папку еще раз.
```
>>> os.rmdir("test")
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
os.rmdir("test")
FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'test'
```
Показать список всех файлов и папок, вложенных в текущую
```
>>> help(os.listdir)
Help on built-in function listdir in module nt:
listdir(path=None)
Return a list containing the names of the files in the directory.
path can be specified as either str, bytes, or a path-like object. If path is bytes,
the filenames returned will also be bytes; in all other circumstances
the filenames returned will be str.
If path is None, uses the path='.'.
On some platforms, path may also be specified as an open file descriptor;\
the file descriptor must refer to a directory.
If this functionality is unavailable, using it raises NotImplementedError.
The list is in arbitrary order. It does not include the special
entries '.' and '..' even if they are present in the directory.
```
Проверка существования каталога
```
>>> help(os.path.isdir)
Help on function isdir in module genericpath:
isdir(s)
Return true if the pathname refers to an existing directory.
```
Функция isdir() модуля os.path возвращает True если путь path существует и является каталогом,
False в противном случае.
```
>>> os.path.isdir("ИКЗ")
True
>>> os.path.isdir("фотографии людей")
False
>>> os.path.isdir("testest.txt") # Такой файл существует, но это не каталог, поэтому False.
False
```
Возвращение абсолютного пути
Функция os.path.abspath() в Python преобразует путь, переданный в качестве аргумента, в
абсолютный путь.
```
>>> fil = os.path.abspath("testest.txt") # Такой файл есть
>>> fil
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\testest.txt'
>>> fil = os.path.abspath("test.txt") #Такого файла не существует
>>> fil
'C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\test.txt'
```
Абсолютный путь — это полный путь к файлу или каталогу, начиная от
корневого каталога системы, а не относительный путь (который зависит от текущего рабочего
каталога).
Если передать в os.path.abspath() несуществующий файл или каталог, функция не проверяет
наличие этого файла в файловой системе. Она просто преобразует путь в абсолютный, не
проверяя его существование.
Отделение из абсолютного пути только каталога/только имени файла
Функция os.path.dirname() из абсолютного пути выделяется путь доступа (от диска до последней
папки). Функция os.path.basename(), наоборот, убирает из абсолютного пути все, кроме имени
файла.
```
>>> drkt = os.path.dirname(fil)
>>> print(drkt)
C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА6
>>> bsnm = os.path.basename(fil)
>>> print(bsnm)
test.txt
```
Разделение на кортеж из пути и из имени файла
```
>>> os.path.split(fil)
('C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6', 'test.txt')
```
```
>>> type(os.path.split(fil))
<class 'tuple'>
```
Проверка существования любого объекта (пути или файла)
```
>>> os.path.exists("C:/GAMES") # Такой каталог есть на ПК
True
>>> os.path.exists("C:/Arts") # Такого каталога нет
False
>>> os.path.exists("C:/Users/mapon/OneDrive/Рабочий стол/NIR/Тимошенко А-01-23 НИР Этап2.docx")
# Такой файл есть
True
>>> os.path.exists("C:/GAMES/abcd.jpg") # Такого файла нет
False
```
Проверка существования файла
```
>>> os.path.isfile("C:/Users/mapon/OneDrive/Рабочий стол/NIR/Тимошенко А-01-23 НИР Этап2.docx")
# Это есть и это файл
True
>>> os.path.isfile("C:/Users/mapon/OneDrive/Рабочий стол/NIR/") # Это есть, но это не файл!
False
>>> os.path.isfile("C:/GAMES/abcd.jpg") # Это файл, но его не существует
False
```
### Пункт 4.2 Общая схема работы с файлом
Для обмена данными с файлом необходимо выполнить следующие операции:
• Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
• Выполнение одной или нескольких операций обмена данными с файлом;
• Закрытие файла.
### Пункт 4.3 Открытие файла для записи или чтения
```
>>> fp = open(file = drkt+'\\zapis1.txt', mode='w')
>>> type(fp)
<class '_io.TextIOWrapper'>
```
Объект класса _io.TextIOWrapper - файловый объект для текстовых данных, имеющий ряд атрибутов
и методов.
```
>>> fp
<_io.TextIOWrapper name='C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\zapis1.txt' mode='w' encoding='cp1251'>
```
Здесь перечислены атрибуты объекта:
name - абсолютный путь
mode - режим:
r - чтение
w - запись (если такой файл уже есть, его содержимое будет удалено, если нет,
создается. Содержимое удаляется в момент открытия, а не в момент первой
записи)
a - дозапись (в конец)
x - открывает для записи, но только если файл есть, иначе FileExistsError.
+ - чтение и запись:
r+ - чтение и запись, файл должен существовать.
w+ - запись и чтение, файл создаётся или перезаписывается.
a+ - добавление и чтение, файл создаётся, если не существует.
```
>>> fp.closed
False
```
Если имя файла на первом месте, а режим на втором, то имена можно не указывать. (позиционные аргументы
всегда должны идти первыми, а именованные — после них)
Путь можно опустить, если он совпадает с текущей рабочей директории:
```
>>> fp = open('zapis1.txt','w')
>>> fp
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
```
Список атрибутов объекта fp:
```
>>> dir(fp)
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__',
'__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__',
'__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable',
'_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach',
'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name',
'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable',
'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
```
Пример открытия бинарного файла:
```
>>> fp1 = open(drkt + '\\zapis2.bin', mode = 'wb+')
>>> fp1
<_io.BufferedRandom name='C:\\Users\\mapon\\OneDrive\\Рабочий стол\\ПО АС\\ТЕМА6\\zapis2.bin'>
```
### Пункт 4.4. Закрытие файла.
Когда файл успешно открывается / создается и открывается, ему задается целочисленный
номер, называемый файловым дескриптором. Он создается только на один сеанс работы и указывает,
с каким именно файлом нужно работать.
После того, как программа отработала, надо очистить ресурсы, связанные с файлом (область
в оперативной памяти, в буфере при буферизации), и удалить дескриптор. Если не закрыть
файл, это может его повредить, данные могут быть утеряны или система может быть перегружена,
т.к. исчерпается ресурс оперативной памяти. Для закрытия есть метод close().
После закрытия на объект все еще можно посмотреть:
```
>>> fp.close()
>>> fp
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
```
Но значение атрибута closed сменится на True:
```
>>> fp.closed
True
```
### Пункт 4.5. Запись информации в файл.
```
>>> help(fp.write)
Help on built-in function write:
write(text, /) method of _io.TextIOWrapper instance
Write string to stream.
Returns the number of characters written (which is always equal to
the length of the string).
```
Выполним операции над файлом:
```
>>> sps = list(range(1,13))
>>> sps
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> fp2 = open('zapis3.txt','w')
>>> fp2.write(str(sps[:4]) + '\n')
13
>>> fp2.write(str(sps[4:8]) + '\n')
13
>>> fp2.write(str(sps[8:]) + '\n')
16
>>> fp2.close()
```
Посмотрим, как выглядит файл, в текстовом редакторе:
```
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
```
В файл записались преобразованные в строки срезы списка. Второй и последущие вызовы write()
в рамках одного сеанса не стирают содержимое файла.
Метод выполняет действия по записи данных в файл, но возвращает количество записанных
символов.
Создадим другой список и попробуем записать его в файл:
```
>>> sps3 = [['Тимошенко А.',1],['Ходюк М.',2],['Коваленко Д.',3]]
>>> sps3
[['Тимошенко А.', 1], ['Ходюк М.', 2], ['Коваленко Д.', 3]]
>>> fp3 = open('zapis4.txt','w')
>>> for i in range(len(sps3)):
stroka4 = sps3[i][0] + ' ' + str(sps3[i][1])
fp3.write(stroka4)
14
10
14
>>> fp3.close()
```
Файл в текстовом редакторе выглядит так:
Тимошенко А. 1Ходюк М. 2Коваленко Д. 3
Видно, что строки склеились там, где не надо. Попробуем по-другому.
```
>>> gh = open('zapis5.txt','w')
>>> for r in sps3:
gh.write(r[0] + ' '+str(r[1]) + '\n')
15
11
15
>>> gh.close()
```
Мы добавили перенос каретки на каждой итерации цикла и пробел в нужном месте. Стало так:
Тимошенко А. 1
Ходюк М. 2
Коваленко Д. 3
```
>>> gh = open('zapis5.txt','w')
>>> for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n')
15
11
15
>>> gh.close()
```
Тимошенко А. 1
Ходюк М. 2
Коваленко Д. 3
### Пункт 4.6. Чтение из файла, способ 1.
```
>>> sps1 = []
>>> fp = open('zapis3.txt')
```
Здесь используется только один аргумент — имя файла, что означает, что файл будет открыт
в режиме чтения по умолчанию.
```
>>> for stroka in fp:
stroka = stroka.rstrip('\n')
stroka = stroka.replace('[','')
stroka = stroka.replace(']','')
sps1 = sps1 + stroka.split(',') # на этот моменте целые числа превращаются в строки
```
Метод .rstrip() убирает символы с конца строки. Если не задавать аргументов,
он удалит любые пробелы (пробел, табуляция, символы новой строки и т.п.) с конца строки.
Метод .replace() заменяет первый агрумент на второй. С помощью него мы убираем скобки.
```
>>> fp.close()
>>> sps1
['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
```
Видно, что полученный список отличается от исходного sps, в первую очередь, типом данных.
К тому же, в sps1 убрались не все пробелы.
Преобразовать sps1 в sps можно, например, так:
```
>>> sps2 = [int(i.strip()) for i in sps1]
>>> sps2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
```
Это list comprehension, который у каждого элемента sps1 убирает лишние пробелы с обеих
сторон (в этом отличие rstrip от strip). Затем полученная строка конвертируется в число.
### Пункт 4.7. Чтение информации из файла с помощью метода read.
Этой функции передается количество символов или, если открыт бинарный файл, - количество
байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла,
начиная с текущего положения маркера. Если указать число большее, чем длина файла,
или любое отрицательное, или не передавать вообще, будет прочитан весь файл до EOF.
```
>>> fp = open('zapis3.txt')
>>> stroka1 = fp.read(12) # Чтение первых 12 файлов, курсор остановится на 13-ом (/n)
>>> stroka2 = fp.read() # Чтение всех оставшихся файлов вплоть до EOF
>>> fp.close()
>>> stroka1
'[1, 2, 3, 4]'
>>> stroka2
'\n[5, 6, 7, 8]\n[9, 10, 11, 12]\n'
```
### Пункт 4.8. Чтение информации с помощью readline и readlines.
Метод readline() считывает одну строку из файла за один вызов. Он читает символы до тех пор,
пока не встретит символ новой строки (\n; включается в строку) или конец файла (EOF).
Если файл содержит только одну строку или указатель чтения находится в конце файла, то при
вызове readline() будет возвращена пустая строка.
Метод readlines() считывает все строки файла и возвращает их в виде списка, где каждая
строка — это отдельный элемент списка. Каждая строка в списке будет содержать символ новой
строки \n, если он есть в файле.
```
>>> file = open("zapis5.txt")
>>> file.readline()
'Тимошенко А. 1\n'
>>> file.seek(0) # Вовзращение указателя обратно в начало, чтобы нагляднее выполнить
readlines
0
>>> file.readlines()
['Тимошенко А. 1\n', 'Ходюк М. 2\n', 'Коваленко Д. 3\n']
```
### Пункт 4.9. Ввод-вывод объектов с использованием функций из модуля pickle.
Этот модуль предназначен для сериализации (перевода в бинарную форму) объектов.
```
>>> import pickle
>>> mnoz1={'pen','book','pen','iPhone','table','book'}
>>> fp = open('zapis6.mnz', 'wb') # открывается с предварительным созданием файл на
бинарную запись
>>> pickle.dump(mnoz1, fp) # сериализация - запись в бинарный вид
>>> fp.close()
```
Откроем получившийся файл в текстовом редакторе, увидим подобную строку.
耄锣 鐨谄扯潫钌մ慢汥钌٩偨潮斔调灥溔逮
Так происходит, потому что байты в этом файле не предназначены для текстового представления.
Они могут содержать символы, которые не могут быть корректно интерпретированы в рамках
любой текстовой кодировки. Но в некоторых байтах содержатся символы, которые попадают в
диапазон, поддерживаемый текстовым редактором и конкретной кодировкой (в моем случае ANSI),
поэтому правильно дешифрованные буквы все же есть.
Десериализуем множество обратно:
```
>>> fp = open('zapis6.mnz','rb')
>>> mnoz2=pickle.load(fp)
>>> fp.close()
>>> mnoz2
{'book', 'iPhone', 'table', 'pen'}
>>> mnoz1
{'iPhone', 'book', 'pen', 'table'}
>>> mnoz1 == mnoz2
True
```
mnoz1 не совпадает с тем, что было задано, потому что это множество. Оно исключает
повторяющиеся элементы, оставляя только один, а еще не содержит конкретный порядок элементов.
Но два множества равны, если у них равны все элементы и их одинаковое количество, вне
зависимости от порядка, так что сравнение возвращает True.
```
>>> fp = open('zapis7.2ob','wb')
>>> pickle.dump(mnoz1,fp)
>>> pickle.dump(sps3,fp)
>>> fp.close()
>>> fp = open('zapis7.2ob','rb')
>>> obj1 = pickle.load(fp)
>>> obj2 = pickle.load(fp)
>>> fp.close()
>>> obj1
{'book', 'table', 'iPhone', 'pen'}
>>> obj2
[['Тимошенко А.', 1], ['Ходюк М.', 2], ['Коваленко Д.', 3]]
>>> mnoz1 == obj1
True
>>> obj2 == sps3
True
```
Примечание: .mnz и .2ob - пользовательские расширения, не относящиеся к стандартным.
## Пункт 5. Перенаправление потоков ввода и вывода данных.
Поток в python и других ЯП - это абстракция, которая позволяет регулировать источники
ввода информации и то, куда её выводить. Всего их по умолчанию три (еще можнно создать
пользовательские):
sys.stdin — поток ввода (обычно клавиатура)
sys.stdout — поток вывода
sys.stderr — поток ошибок (оба обычно экран)
Для работы с потоками импортируем модуль sys:
```
>>> import sys
```
Сохраним адрес в памяти текущего потока вывода:
```
>>> vr_out = sys.stdout
>>> vr_out
<idlelib.run.StdOutputFile object at 0x000002CCB1927040>
```
Откроем (созадем) файл на запись:
```
>>> fc = open('Stroka.txt','w')
```
Теперь зададим в качестве потока вывода этот файл:
```
>>> sys.stdout = fc
>>> print('запись строки в файл')
```
Видно, что в консоли не появилось строки. Вернем поток по умолчанию обратно:
```
>>> sys.stdout = vr_out
>>> print('запись строки на экран')
запись строки на экран
>>> fc.close()
```
В файле Stroka.txt находится: запись строки в файл
Можно перенаправить и поток ввода тоже. Например, на файл:
```
>>> tmp_in = sys.stdin
>>> fd = open("Stroka.txt", "r")
>>> sys.stdin = fd
>>> sys.stdin
<_io.TextIOWrapper name='Stroka.txt' mode='r' encoding='cp1251'>
>>> while True:
try: # Конструкция try-except предназначена для отладки исключений
# То есть если возвращается ошибка, можно ее перехватить и
# указать, что делать в таком случае
line = input()
print(line)
except EOFError:
break
запись строки в файл
>>> fd.close()
>>> sys.stdin = tmp_in #Вернул стандартное назначение для потока ввода
```

@ -0,0 +1,54 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 5
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание
Придумайте инструкции и запишите их в файл с расширением .py , которые выполняют следую-щие операции:
• Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк.
• Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников.
• Записывается кортеж в бинарный файл.
• Записывается в этот же файл список и закрывается файл.
• Открывается этот файл для чтения и считывает из него данные в 2 новых объекта.
• Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение.
• Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде от-дельных списков со своими именами.
## Решение
```
>>> nums = tuple(str(random.randint(6, 56)) for _ in range(125))
>>> nums
('7', '34', '42', '20', '50', '45', '9', '29', '17', '9', '51', '51', '39', '22', '49', '34', '45', '29', '49', '48', '56', '28', '48', '47', '41', '43', '33', '44', '49', '10', '30', '6', '49', '14', '41', '18', '7', '41', '20', '42', '56', '54', '20', '40', '18', '13', '32', '40', '44', '40', '37', '39', '8', '43', '33', '40', '20', '10', '10', '39', '46', '37', '9', '52', '45', '10', '37', '18', '56', '47', '46', '20', '30', '42', '49', '43', '22', '11', '23', '30', '30', '47', '31', '43', '32', '27', '20', '24', '25', '50', '54', '15', '42', '40', '24', '27', '10', '13', '39', '27', '34', '43', '11', '44', '41', '14', '38', '21', '45', '31', '17', '48', '18', '54', '21', '38', '30', '48', '35', '32', '38', '35', '35', '56', '24')
```
Примечание: если итератор не надо использовать в теле цикла, принято просто обозначать его _
```
>>> group = ["Timoshenko", "Hodyk", "Kovalenko", "Filippov", "Goloshchapov"]
>>> fl = open("okz.okz", "wb")
>>> pickle.dump(nums, fl)
>>> pickle.dump(group, fl)
>>> fl.close()
>>> fl = open("okz.okz", "rb")
>>> nums1 = pickle.load(fl)
>>> nums1
('7', '34', '42', '20', '50', '45', '9', '29', '17', '9', '51', '51', '39', '22', '49', '34', '45', '29', '49', '48', '56', '28', '48', '47', '41', '43', '33', '44', '49', '10', '30', '6', '49', '14', '41', '18', '7', '41', '20', '42', '56', '54', '20', '40', '18', '13', '32', '40', '44', '40', '37', '39', '8', '43', '33', '40', '20', '10', '10', '39', '46', '37', '9', '52', '45', '10', '37', '18', '56', '47', '46', '20', '30', '42', '49', '43', '22', '11', '23', '30', '30', '47', '31', '43', '32', '27', '20', '24', '25', '50', '54', '15', '42', '40', '24', '27', '10', '13', '39', '27', '34', '43', '11', '44', '41', '14', '38', '21', '45', '31', '17', '48', '18', '54', '21', '38', '30', '48', '35', '32', '38', '35', '35', '56', '24')
>>> group1 = pickle.load(fl)
>>> group1
['Timoshenko', 'Hodyk', 'Kovalenko', 'Filippov', 'Goloshchapov']
```
Примечание: при чтении с помощью pickle.load() тоже есть указатель, который останавливается
при достижении /n, так что можно просто вызвать ее два раза, чтобы записать эти два объекта.
Если вызвать ее третий раз, будет EOFError.
```
>>> print("Файлы nums совпадают") if nums == nums1 else print("Переменные nums не совпадают")
Переменные nums совпадают
>>> print("Переменные group совпадают") if group == group1 else print("Переменные group не совпадают")
Переменные group совпадают
>>> for i in range(125//5):
exec('list' + str(i) + '=' + str(list(nums1[i:i+5])))
```
Можно вызвать конкретные списки для проверки:
```
>>> list1
['34', '42', '20', '50', '45']
>>> list6
['9', '29', '17', '9', '51']
```

Двоичные данные
TEMA7/Figure_1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

Двоичные данные
TEMA7/Figure_2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 13 KiB

@ -0,0 +1,679 @@
# Тема 7. Создание пользовательских функций
Выполнил: Тимошенко А.А.
Проверил: Козлюк Д.А.
## Пункт 1.
```
>>> import os
>>> os.chdir("C:/Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА7")
```
## Пункт 2. Создание пользовательской функции.
Общий вид:
def <Имя функции>([<Список аргументов >]):
[<отступы> """<Комментарий по назначению функции>"""]
<отступы> <Блок инструкций – тело функции>
[<отступы> return <Значение или вычисляемое выражение>]
Функция считается оконченной, если в очередной строке нет отступов или их число меньше, чем
в отступах в функции. Если при выполнении функции будет выполнена инструкция return, то
выполнение функции прекращается с возвратом значения, следующего за этой инструкцией.
В Python, если функция не содержит оператора return, она автоматически возвращает значение
None.
### Пункт 2.1. Функция без аргументов.
```
>>> def uspeh():
"""Подтверждение успеха операции"""
print('Выполнено успешно!')
>>> uspeh()
Выполнено успешно!
```
Функция является объектом класса function:
```
>>> type(uspeh)
<class 'function'>
```
Видно, что такой объект появился в рабочем пространстве:
```
>>> dir()
['__annotations__', '__builtins__',
'__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh']
```
Вызовем помощь по этой функции:
```
>>> help(uspeh)
Help on function uspeh in module __main__:
uspeh()
Подтверждение успеха операции
```
Видно, что help вернуло имя функции и то описание, которое было указано в тройных кавычках
при её определении. Это называется docstring или документ-строка. Они используются
для написания документации. Она должна быть первой строкой внутри блока.
### Пункт 2.2. Функция с аргументами.
```
>>> def sravnenie(a, b):
"""Сравнение a и b"""
if a > b:
print(a, ' больше ', b)
elif a < b:
print(a, ' меньше ', b)
else:
print(a, ' равно ',b)
>>> n, m = 16, 5; sravnenie(n,m)
16 больше 5
```
Так как при описании функции мы не конкретизировали, какой тип данных хотим получить, то
python сможет принять любые данные, которые можно сравнить. Если что-то нельзя сравнить,
вернется TypeError.
```
>>> sravnenie("house", "building")
house больше building
```
### Пункт 2.3. Функция с return.
```
>>> def logistfun(b, a):
"""Вычисление логистической функции"""
import math
return a / (1 + math.exp(-b))
```
```
>>> v, w = 1, 0.7; z = logistfun(w, v)
>>> z
0.6681877721681662
```
### Пункт 2.4. Сложение для разных типов аргументов.
```
>>> def slozh(a1, a2, a3, a4):
""" Сложение значений четырех аргументов"""
return a1 + a2 + a3 + a4
```
Для чисел:
```
>>> slozh(1, 2, 3, 4)
10
```
Для строк:
```
>>> slozh('1','2','3','4')
'1234'
```
Для списков:
```
>>> b1 = [1, 2]; b2 = [-1, -2]; b3 = [0, 2]; b4 = [-1, -1]
>>> q = slozh(b1, b2, b3, b4)
>>> q
[1, 2, -1, -2, 0, 2, -1, -1]
```
Для кортежей:
```
>>> slozh((1, 2), (3, 4), (-5, 0), (-7, -3))
(1, 2, 3, 4, -5, 0, -7, -3)
```
Для множеств:
```
>>> slozh({1,1,1,1}, {2}, {"privet", True, None}, {6, 6, "a"})
...
TypeError: unsupported operand type(s) for +: 'set' and 'set'
```
Как видно, операция сложения для множеств не применима. Если нужно объединить два множества,
для этого есть специальная операция set union
Для словарей:
```
>>> dict1 = {'a': 1}; dict2 = {'b': 2}; dict3 = {'c': 3}; dict4 = {'d': 4}
>>> slozh(dict1, dict2, dict3, dict4)
...
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
```
Словари тоже нельзя сложить плюсом. Для объединения словарей есть оператор распаковывания
**dict1.
Комбинирование типов:
```
Число и строка:
>>> slozh(1, "а", 2, "б")
...
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
С коллекциями без явного преобразования тоже не сработает.
Число и логический тип:
```
>>> slozh(1, True, 2, False)
4
```
Целое число и число с плавающей точкой:
```
>>> slozh(1, 3.44, 2.0, 7)
13.44
```
### Пункт 2.5. Функция, реализующая модель некоторого устройства, на вход которого в текущий момент поступает сигнал х, на выходе получается сигнал y:
```
>>> def inerz(x,T,ypred):
""" Модель устройства с памятью:
x - текущее значение вх.сигнала,
T - постоянная времени,
ypred - предыдущее значение выхода устройства"""
y = (x + T * ypred) / (T + 1)
return y
>>> sps = [0] + [1] * 100
>>> spsy = []
>>> TT = 20
>>> yy = 0
>>> for xx in sps:
yy = inerz(xx,TT,yy)
spsy.append(yy)
>>> import pylab as plt
>>> plt.plot(spsy, label = "Выходной сигнал")
[<matplotlib.lines.Line2D object at 0x00000241DC815370>]
>>> plt.show()
```
График сохранен в файле с именем Figure_1.
## Пункт 3. Функции как объекты.
### Пункт 3.1. Получение списка атрибутов объекта-функции.
```
>>> dir(inerz)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__',
'__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__',
'__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> inerz.__doc__
' Модель устройства с памятью:\nx- текущее значение вх.сигнала,\n\tT -постоянная времени,\n\typred - предыдущее значение выхода устройства'
>>> help(inerz)
Help on function inerz in module __main__:
```
Этот атрибут содержит значение docstring, если при инициализации функции она была задана.
Если не была, то inerz.__doc__ будет иметь значение None.
```
inerz(x, T, ypred)
Модель устройства с памятью:
x- текущее значение вх.сигнала,
T -постоянная времени,
ypred - предыдущее значение выхода устройства
```
Примеры других атрибутов функций:
```
>>> def f(a : int, b : int, c = 10):
return
>>> f.__annotations__
{'a': <class 'int'>, 'b': <class 'int'>} # Возвращает типы аргументов, если они заданы
>>> f.__defaults__ # Возвращает значения по умолчанию, если они заданы
(10,)
>>> f.__name__ # Возвращает имя функции (для функций, определенных внутри других, возвращает
полный путь
'f'
```
### Пункт 3.2. Сохранение ссылки на объект-функцию в другой переменной.
```
>>> n, m = 16, 5; sravnenie(n, m)
16 больше 5
>>> fnkt = sravnenie
>>> v = 16
>>> fnkt(v, 23)
16 меньше 23
```
Здесь происходит присвоение функции sravnenie переменной fnkt. Функции можно передавать в
переменные, как и любые другие объекты. После этого переменная fnkt ссылается на ту же самую
функцию, что и sravnenie.
### Пункт 3.3. Возможность альтернативного определения функции в программе.
```
>>> typ_fun = 8
>>> if typ_fun == 1:
def func():
print("Функция 1")
>>> if typ_fun == 1:
def func():
print('Функция 1')
else:
def func():
print('Функция 2')
>>> func()
Функция 2
```
Программа выводит сообщение "Функция 2", потому что переменная typ_fun не равна 1, и
выполняется блок else, в котором функция func определена как выводящая, собственно,
"Функция 2". Функция становится доступной только после того, как интерпретатор достигает
строки с её определением.
## Пункт 4. Аргументы функции.
### Пункт 4.1. Возможность использования функции в качестве аргумента другой функции
```
>>> def fun_arg(fff,a,b,c):
"""fff-имя функции, используемой
в качестве аргумента функции fun_arg"""
return a+fff(c,b)
>>> zz=fun_arg(logistfun,-3,1,0.7)
>>> print(zz)
-2.3318122278318336
```
Python передаёт ссылку на объект функции logistfun в переменную fff. Внутри
функции выполняется операция: a + fff(c, b), что эквивалентно -3 + logistfun(0.7, 1)
### Пункт 4.2. Обязательные и необязательные аргументы.
```
>>> def logistfun(a,b=1): #Аргумент b – необязательный; значение по умолчанию=1
"""Вычисление логистической функции"""
import math
return b/(1+math.exp(-a))
>>> logistfun(0.7)
0.6681877721681662
>>> logistfun(0.7,2)
1.3363755443363323
```
### Пункт 4.3. Возможность обращения к функции с произвольным расположением аргументов.
```
>>> logistfun(b = 0.5, a = 0.8)
0.34498724056380625
```
Но при этом нельзя сделать так:
```
>>> logistfun(b = 2, 0.7)
SyntaxError: positional argument follows keyword argument
```
Python ожидает, что все позиционные аргументы будут переданы первыми, а затем уже
могут следовать именованные аргументы.
### Пункт 4.4. Пример со значениями аргументов функции, содержащимися в списке или кортеже.
```
>>> b1234 = [b1, b2, b3, b4]
>>> b1234
[[1, 2], [-1, -2], [0, 2], [-1, -1]]
>>> qq = slozh(*b1234)
>>> qq
[1, 2, -1, -2, 0, 2, -1, -1]
```
Со звёздочкой коллекции передаются как набор аргументов функции, Она также называется
"оператор распаковки". Это было бы эквивалентно записи slozh(b1,b2,b3,b4)
### Пункт 4.5. Пример со значениями аргументов функции, содержащимися в словаре
```
>>> dic4 = {"a1": 1, "a2": 2, "a3": 3, "a4": 4}
>>> qqq = slozh(**dic4)
>>> qqq
10
```
В данном случае распаковка произошла так, что ключи на входе функции восприниимаются как
значения позиционных переменных, а значения, соответственно, как значения.
Примечание: Если поставить только одну звездочку, python попытается интерпретировать
ключи, а не значения словаря как позиционные аргументы. Получается так:
```
>>> slozh(*dic4)
'a1a2a3a4'
```
### Пункт 4.6. Смешанные ссылки
```
>>> e1 = (-1, 6); dd2 = {'a3': 3, 'a4': 9}
>>> qqqq = slozh(*e1,**dd2)
>>> qqqq
17
То есть (-1) + 6 + 3 + 9 = 17
```
### Пункт 4.7. Переменное число аргументов у функции.
```
>>> def func4(*kort7):
"""Произвольное число аргументов в составе кортежа"""
smm = 0
for elt in kort7:
smm += elt
return smm
>>> func4(-1,2)
1
>>> func4(-1,2,0,3,6)
10
```
Переменное число аргументов с использованием * упаковывается в кортеж.
### Пункт 4.8. Комбинация аргументов
```
>>> def func4(a, b = 7, *kort7): #Аргументы: a - позиционный, b - по умолчанию + кортеж
"""Кортеж - сборка аргументов - должен быть последним!"""
smm=0
for elt in kort7:
smm += elt
return a * smm + b
>>> func4(-1,2,0,3,6)
-7
```
То есть -1 * 9 + 2 = -7.
### Пункт 4.9. Изменение значений объектов, используемых в качестве аргументов функции.
```
>>> a = 90
>>> def func3(b):
b = 5*b+67
>>> func3(a)
>>> a
90
```
Поскольку функция ничего не возвращает (то есть, формально, является процедурой), то вычисленное
значение b = 5*b+67 существует только локально внутри нее и не выносится в глобальную область видимости
Для наглядности:
```
>>> def func3(b):
b = 5*b+67
print(b)
>>> func3(a)
517
>>> a
90
```
Пример со списком:
```
>>> sps1=[1,2,3,4]
>>> def func2(sps):
sps[1] = 99
>>> func2(sps1)
>>> print(sps1)
[1, 99, 3, 4]
```
В отличие от предыдущего примера с переменной численного типа, список передается по ссылке, а не по
значению, поэтому изменяется именно тот объект, который был передан.
Кортеж:
```
>>> kort = (1,2,3,4)
>>> func2(kort)
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
func2(kort)
File "<pyshell#40>", line 2, in func2
sps[1] = 99
TypeError: 'tuple' object does not support item assignment
```
Кортеж - неизменяемая коллекция, так что переназначение значения в таком виде, как здесь, не работает.
## Пункт 5. Специальные типы пользовательских функций
### Пункт 5.1. Анонимные функции (лямбда-функции).
```
>>> anfun1 = lambda: 1.5 + math.log10(17.23)
>>> type(anfun1)
<class 'function'>
>>> anfun1()
2.7362852774480286
>>> anfun2 = lambda a,b : a+math.log10(b)
>>> anfun2(17, 234)
19.369215857410143
>>> anfun3 = lambda a, b=234: a+math.log10(b)
>>> anfun3(100)
102.36921585741014
```
Вызов лямбда-функции создает объект класса "функция", который потом можно положить в другую переменную
и далее вызывать.
### Пункт 5.2. Функции-генераторы
Иногда в циклах на каждой итерации нужно получать одно из значений. Для этого есть оператор yield.
Это похоже на return, но в отличие от return не останавливает полностью выполнение программы.
Когда выполнение генератора возобновляется после yield, оно продолжается с того места, где было
приостановлено, до следующего оператора yield (или до конца функции).
Вместе с yield, можно использовать next(). Например:
```
>>> def test():
for i in range(3):
yield i
>>> l = test()
>>> l
<generator object test at 0x000001AAA0453640>
>>> next(l)
0
>>> next(l)
1
```
Аналогично, можно использовать и метод __next__
```
>>> print(l.__next__())
2
```
Другой пример:
```
>>> alp=func5(7,3)
>>> print(alp.__next__())
1
>>> print(alp.__next__())
5
>>> print(alp.__next__())
4
...
```
__next__ помогает вывести значение, которое yield передает на каждй итерации цикла. Если функция
отработала последнюю итерацию, но мы все попытаемся сделать вызов, вернется ошибка:
```
>>> print(alp.__next__())
Traceback (most recent call last):
File "<pyshell#96>", line 1, in <module>
print(alp.__next__())
StopIteration
```
## Пункт 6. Локализация объектов в функциях.
Все объекты - переменные, коллекции, функции и т.д. - могут быть определены глобально или локально.
Глобально - значит вне всяких функций.Локальные переменные определены внутри функции, и если хочется
использовать такую переменную в другой функции, то нужно обрабатывать доступ к ним из других функций.
### Пункт 6.1. Примеры
```
>>> glb = 10
>>> def func7(arg):
loc1 = 15
glb = 8
return loc1*arg
>>> res = func7(glb)
>>> res
150
```
Проверим:
```
>>> glb
10
```
Посмотрим подробнее, что происходит внутри функции:
```
>>> def func7(arg):
loc1=15
glb=8
print(glb, arg)
return loc1*arg
>>> res=func7(glb)
8 10
```
Видно, что внутри объект с именем glb принял значение 8, но глобальная переменная при этом после выполнения
функции значения не поменяла. Это происходит потому, что технически, локальный glb и глобальный glb -
это два разных объекта. В этом можно убедиться:
```
>>> res=func7(glb) #При определенении func7 добавлена строка print(id(glb))
8 10
>>> id(glb)
140726606628040
```
Пример 2.
```
>>> def func8(arg):
loc1=15
print(glb)
glb=8
return loc1*arg
>>> res=func8(glb)
Traceback (most recent call last):
File "<pyshell#119>", line 1, in <module>
res=func8(glb)
File "<pyshell#118>", line 3, in func8
print(glb)
UnboundLocalError: local variable 'glb' referenced before assignment
```
Ошибка возникает, потому что когда python видит внутри функции переменную, он по умолчанию считает ее
локальной. И получается, что вызов локальной переменной glb происходит раньше объявления локальной
переменной glb, на что нам и указывает ошибка. Можно исправить эту проблему, переопределив лоаклизацию
glb внутри func8():
```
>>> glb=11
>>> def func7(arg):
loc1=15
global glb
print(glb)
glb=8
return loc1*arg
>>> res=func7(glb)
11
>>> glb
8
```
Здесь мы явно указали, что в функции имеем в виду глобальную переменную, так что она изменилась.
### Пункт 6.2. locals() и globals()
Эти функции возвращают словари, ключами в которых будут имена объектов, являющихся, соответственно,
локальными или глобальными на уровне вызова этих функций.
```
>>> globals().keys()
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'dict1', 'dict2', 'dict3', 'dict4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'f', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'r', 'r1', 'test', 'l', 'func5', 'alp', 'glb', 'func7', 'res', 'func8'])
>>> locals().keys()
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'dict1', 'dict2', 'dict3', 'dict4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'f', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'r', 'r1', 'test', 'l', 'func5', 'alp', 'glb', 'func7', 'res', 'func8'])
```
Сейчас различий нет, потому что эти методы возвращают объекты на уровне вызова этих функций, но мы
вызвали обе самом внешнем уровне, не внутри какой-либо функции, а в самом рабочем пространстве, где
локальная и глобальная области видимости совпадают.
```
>>> glb = 10
>>> def func8(arg):
loc1=15
glb=8
print(globals().keys()) #Перечень глобальных объектов «изнутри» функции
print(locals()) #Перечень локальных объектов «изнутри» функции (для наглядности отобразим и значения тоже)
return loc1*arg
>>> hh=func8(glb)
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'dict1', 'dict2', 'dict3', 'dict4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'f', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'r', 'r1', 'test', 'l', 'func5', 'alp', 'glb', 'func7', 'res', 'func8'])
{'arg': 10, 'loc1': 15, 'glb': 8}
>>> glb # Снова глобальное glb
10
```
### Пункт 6.3. Локализация объектов при использовании вложенных функций.
```
>>> def func9(arg2,arg3):
def func9_1(arg1):
loc1=15
glb1=8
print('glob_func9_1:',globals().keys())
print('locl_func9_1:',locals().keys())
return loc1*arg1
loc1=5
glb=func9_1(loc1)
print('loc_func9:',locals().keys())
print('glob_func9:',globals().keys())
return arg2+arg3*glb
>>> kk=func9(10,1)
glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'dict1', 'dict2', 'dict3', 'dict4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'f', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'r', 'r1', 'test', 'l', 'func5', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9'])
locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1']) # Содержит только объекты, определенные внутри func9
а также объект, переданный как аргумент функции
loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb']) # Содержит все то же, что и locl_func9_1, но еще и arg3, переданный func9, и саму func9_1
glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'dict1', 'dict2', 'dict3', 'dict4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'f', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'r', 'r1', 'test', 'l', 'func5', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9'])
```
### Пункт 6.4. Моделирование САУ
```
>>> znach=input('k1,T,k2,Xm,A,F,N=').split(',')
k1,T,k2,Xm,A,F,N=8,5,3,10,2,0.5,1000
>>> k1=float(znach[0])#распаковываю значения из списка в отдельные объекты - числовые переменные
>>> T=float(znach[1])
>>> k2=float(znach[2])
>>> Xm=float(znach[3])
>>> A=float(znach[4])
>>> F=float(znach[5])
>>> N=int(znach[6])
>>> vhod=[]#входной сигнал
>>> for i in range(N):
vhod.append(A*math.sin((2*i*math.pi)/F))
>>> vhod
[0.0, -9.797174393178826e-16, -1.959434878635765e-15, -2.9391523179536475e-15, -3.91886975727153e-15,
-4.898587196589413e-15, -5.878304635907295e-15, -6.858022075225178e-15,
...
1.1010469343064857e-13,
-8.856348540728095e-13, -1.8813744015762676e-12, 7.608648580119871e-13, -2.3487468949147107e-13, -1.
2306142369949293e-12, -2.226353784498387e-12, 4.1588547508986746e-13, -5.798540724135906e-13,
-1.5755936199170489e-12]
>>> def realdvig(xtt,kk1,TT,yti1,ytin1):
#Модель реального двигателя
yp=kk1*xtt #усилитель
yti1=yp+yti1 #Интегратор
ytin1=(yti1+TT*ytin1)/(TT+1)
return [yti1,ytin1]
>>> def tahogen(xtt,kk2,yti2):
#Модель тахогенератора
yp=kk2*xtt #усилитель
yti2=yp+yti2 #интегратор
return yti2
>>> def nechus(xtt,gran):
#зона нечувствит
if xtt<gran and xtt>(-gran):
ytt=0
elif xtt>=gran:
ytt=xtt-gran
elif xtt<=(-gran):
ytt=xtt+gran
return ytt
>>> yi1 = 0; yin1 = 0; yi2 = 0
>>> vyhod = []
>>> for xt in vhod:
xt1 = xt - yi2 #отрицательная обратная связь
[yi1,yin1] = realdvig(xt1,k1,T,yi1,yin1)
yi2 = tahogen(yin1,k2,yi2)
yt = nechus(yin1,Xm)
vyhod.append(yt)
>>> print('y=',vyhod)
y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0183086292055208, 0, 26.39885775889784,
-36.65029553691161, -34.19982663883278, 196.29963397615063, -151.6919482160481,
-388.32493988337274, 1057.8073200868555, -308.3186572590445,
...
2.37392249152569e+226, -2.801972415904499e+226, -3.2288710633399875e+226,
1.321721142591339e+227, -9.144734174579399e+226]
```

@ -0,0 +1,88 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 7
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание
• Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с за-держкой на заданное время Т.
• Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения случайной величины. Возвращае-мый результат функции: список с числами элементов выборки в интервалах разбиения.
• Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х
Y=b1+b2*X и имеющую аргументы b1, b2 и X.
## Решение
```
def delay_signal(signal, T):
delayed_signal = signal.copy()
if T < len(signal):
# Сдвигаю сигнал вправо на T отсчетов, начало заполняем нулями
delayed_signal = [0] * T + signal[:-T]
else:
# Если задержка больше длины сигнала - возвращаем нули
delayed_signal = [0] * len(signal)
return delayed_signal
>>> y = [random.gauss(3, 1.5) for _ in range(40)]
>>> y
[5.325416780634114, 2.3593622133749808, 1.2470676959301887, -0.593060108499694, 1.4340279482713292, 2.162904911751828, 3.5966381215435743, 3.1215233313521367, 3.278769015552392, 1.4600848702469413, 2.227188218562767, -0.02101290555432689, 2.9015754761132713, 5.507229347318583, 4.392918705255052, 2.893096608173657, 2.400184728443876, 2.3464420973774045, -0.29207940771891217, 4.868968794420769, 5.1569207689963275, 2.966999923764223, 0.9443978469937528, 5.562190945114451, 3.4834584941068765, 1.7250255447073042, 3.013873484634806, 3.783067951814041, 4.602220595567667, 2.283163010872606, 4.563248136396248, 5.370530689941988, -0.5394330191088121, 4.481730159619498, 2.6088804215267345, 3.562728440630803, 4.422684655442551, 1.846276163481897, 3.8925551687094426, 4.720299420830592]
>>> yd = delay_signal(y, 4)
>>> yd
[0, 0, 0, 0, 5.325416780634114, 2.3593622133749808, 1.2470676959301887, -0.593060108499694, 1.4340279482713292, 2.162904911751828, 3.5966381215435743, 3.1215233313521367, 3.278769015552392, 1.4600848702469413, 2.227188218562767, -0.02101290555432689, 2.9015754761132713, 5.507229347318583, 4.392918705255052, 2.893096608173657, 2.400184728443876, 2.3464420973774045, -0.29207940771891217, 4.868968794420769, 5.1569207689963275, 2.966999923764223, 0.9443978469937528, 5.562190945114451, 3.4834584941068765, 1.7250255447073042, 3.013873484634806, 3.783067951814041, 4.602220595567667, 2.283163010872606, 4.563248136396248, 5.370530689941988, -0.5394330191088121, 4.481730159619498, 2.6088804215267345, 3.562728440630803]
import matplotlib.pyplot as plt
def calculate_histogram(data, num_bins):
min_val, max_val = min(data), max(data)
bins = np.linspace(min_val, max_val, num_bins + 1)
counts = [0] * num_bins
for value in data:
for i in range(num_bins):
if bins[i] <= value < bins[i + 1]:
counts[i] += 1
break
if value == max_val:
counts[-1] += 1
return counts, bins
def plot_histogram(data, bins, counts):
plt.hist(data, bins=bins, alpha=0.7, edgecolor='black')
plt.xlabel('Значения выборки')
plt.ylabel('Число элементов')
plt.title('Гистограмма выборки')
plt.show()
def histo(data, num_bins):
"""
Основная функция для работы с гистограммой
"""
counts, bins = calculate_histogram(data, num_bins)
plot_histogram(data, bins, counts)
return counts
sample = [random.gauss(random.random(), random.random()) for _ in range(random.randint(10,200))]
intervals = int(input("Введите количество интервалов разбиения: "))
output = histo(sample, intervals)
======= RESTART: C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА7\OKZ2.py ======
Введите количество интервалов разбиения: 12
Список с числами элементов в интервалах: [3, 4, 10, 10, 6, 8, 7, 0, 1, 0, 0, 1]
#График сохранен под именем Figure_2
linreg = lambda b1, b2, x: b1 + b2 * x
b1 = float(input("Введите коэффициент b1 линейной регрессии: "))
b2 = float(input("Введите коэффициент b2 линейной регрессии: "))
x_val = float(input("Введите значение x: "))
print(linreg(b1, b2, x_val))
Введите коэффициент b1 линейной регрессии: 2
Введите коэффициент b2 линейной регрессии: 3
Введите значение x: 5
17.0
```

@ -0,0 +1,393 @@
# Тема 8. Модули и структурирование программы
Выполнил: Тимошенко А.А.
Проверил: Козлюк Д. А.
## Пункт 1. Импорт библиотек
```
>>> import os
>>> os.chdir("C:/Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8")
>>> import sys, importlib
```
## Пункт 2. Создание и использование модулей в среде Python.
### Пункт 2.1. Запуск модуля на выполнение путем его импорта.
Файл mod1.py содержит команды:
```
perm1 = input('Mod1: Введите значение = ')
print('Mod1: Значение perm1 = ', perm1)
```
Вызов файла как импортируемого модуля:
```
>>> import mod1
Mod1: Введите значение = 5
Mod1: Значение perm1 = 5
>>> mod1.perm1
'5'
>>> import mod1
>>> import mod1
```
Все следующие после первого вызовы не инициируют ввод значения
perm1. В Python модули импортируются один раз в рамках одного запуска интерпретатора.
Если попытаться импортировать модуль повторно, используется уже загруженная версия из кэша.
Если нужно повторно импортировать модуль как в первый раз, можно сделать так:
```
>>> importlib.reload(mod1)
Mod1: Введите значение = 6
Mod1: Значение perm1 = 6
<module 'mod1' from 'C:\\Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8\\mod1.py'>
>>> mod1.perm1
'6'
```
### Пункт 2.2. Словарь импортированных модулей
```
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'mod1', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> sys.modules.pop('mod1')
<module 'mod1' from 'C:\\Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8\\mod1.py'>
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
```
Пояснение: принципиальное отличие importlib.reload() от sys.modules.pop() заключается
в следующем: importlib.reload() перезагружает модуль, выполняя его код заново, но не удаляет модуль из кэша. Он имеет тот же адрес в памяти и все зависимости от него остаются в силе. sys.modules.pop() убирает модуль из кэша, при повторном импорте он уже будет иметь другой адрес, а старые зависимости ссылаются на пустой объект.
```
>>> import mod1
Mod1: Введите значение = 9
Mod1: Значение perm1 = 9
>>> mod1.perm1
'9'
```
### Пункт 2.3. Запуск модуля на выполнение с помощью функции exec().
```
>>> exec(open('mod1.py', encoding='utf-8').read())
Mod1: Введите значение = 7
Mod1: Значение perm1 = 7
>>> mod1.perm1
'9'
>>> perm1
'7'
>>> exec(open('mod1.py', encoding='utf-8').read())
Mod1: Введите значение = 99
Mod1: Значение perm1 = 99
>>> perm1
'99'
>>> exec(open('mod1.py', encoding='utf-8').read())
Mod1: Введите значение = 40
Mod1: Значение perm1 = 40
>>> perm1
'40'
```
### Пункт 2.4. Использование инструкции from … import …
Пример 1.
```
>>> sys.modules.pop('mod1')
<module 'mod1' from 'C:\\Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8\\mod1.py'>
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> from mod1 import perm1
Mod1: Введите значение = 89
Mod1: Значение perm1 = 89
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'mod1', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> perm1
'89' - измененный объект тоже доступен из глобальной области видимости.
```
Как видно, объект mod1 всё же появился в sys.modules.keys(). Аналогично обычному import, при первом импорте команда
инициализирует ввод, но при последующих ничего не делает.
Пример 2.
```
>>> from mod2 import beta
>>> g = beta(2)
>>> g
535.4916555247646
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'mod1', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
```
Объект mod2 появился в списке всех модулей.
```
>>> h = alpha(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'alpha' is not defined
```
Импортируем alpha, используя для него псевдоним.
```
>>> from mod2 import alpha as al
>>> al()
****ALPHA****
Значение t=90
'90'
```
Если мы попробуем вызвать функцию по обычному ее имени, ничего не выйдет.
```
>>> alpha()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'alpha' is not defined
```
Так происходит потому, что на этапе преобразования программы в байт-код python связывает
модуль, найденный в рабочей директории, с именем al. Модуль становится объектом в пространстве имен,
создаётся ссылка на объект модуля alpha и ему присваивается имя al. Но имя alpha ему НЕ присваивается,
поэтому обратиться к методам и атрибутам по имени alpha нельзя.
```
>>> del al, beta
>>> from mod2 import alpha as al, beta as bt
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'mod1', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> sys.modules.pop('mod2')
<module 'mod2' from 'C:\\Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8\\mod2.py'>
>>> sys.modules.pop('mod1')
<module 'mod1' from 'C:\\Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8\\mod1.py'>
>>> from mod2 import *
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_opcode_metadata', '_operator', '_pickle', '_pyrepl', '_pyrepl.pager', '_queue', '_random', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_sysconfig', '_thread', '_tkinter', '_tokenize', '_typing', '_warnings', '_weakref', '_weakrefset', '_winapi', '_wmi', 'abc', 'ast', 'bdb', 'binascii', 'bisect', 'builtins', 'bz2', 'codecs', 'collections', 'collections.abc', 'configparser', 'contextlib', 'copyreg', 'datetime', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf_8', 'enum', 'errno', 'fnmatch', 'functools', 'genericpath', 'heapq', 'idlelib', 'idlelib.autocomplete', 'idlelib.autocomplete_w', 'idlelib.calltip', 'idlelib.calltip_w', 'idlelib.config', 'idlelib.debugger', 'idlelib.debugger_r', 'idlelib.debugobj', 'idlelib.debugobj_r', 'idlelib.hyperparser', 'idlelib.iomenu', 'idlelib.macosx', 'idlelib.multicall', 'idlelib.pyparse', 'idlelib.rpc', 'idlelib.run', 'idlelib.scrolledlist', 'idlelib.stackviewer', 'idlelib.tooltip', 'idlelib.tree', 'idlelib.util', 'idlelib.window', 'idlelib.zoomheight', 'importlib', 'importlib._abc', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib.machinery', 'importlib.util', 'inspect', 'io', 'ipaddress', 'itertools', 'keyword', 'linecache', 'lzma', 'marshal', 'math', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 'pickle', 'pkgutil', 'platform', 'plistlib', 'posixpath', 'pydoc', 'pyexpat', 'pyexpat.errors', 'pyexpat.model', 'queue', 'random', 're', 're._casefix', 're._compiler', 're._constants', 're._parser', 'reprlib', 'select', 'selectors', 'shlex', 'shutil', 'site', 'socket', 'socketserver', 'stat', 'string', 'struct', 'sys', 'sysconfig', 'tempfile', 'textwrap', 'threading', 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'typing', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
```
Протестируем функции после импорта:
```
>>> tt = alpha()
****ALPHA****
Значение t=0.13
>>> uu = beta(float(tt))
>>> uu
1.5044194029024176
```
## Пункт 3. Создание многомодульных программ.
### Пункт 3.1. Пример простой многомодульной программы.
Создадим файл mod0.py:
```
import mod1
print('perm1 = ', mod1.perm1)
from mod2 import alpha as al
tt = al()
print('tt = ', tt)
from mod2 import beta
qq=beta(float(tt))
print('qq = ', qq)
```
Вызовем его в терминале, предварительно убедившись, что ни один
из трех модулей не упоминается в sys.modules.keys():
```
>>> import mod0
Mod1: Введите значение = 8
Mod1: Значение perm1 = 8
perm1 = 8
****ALPHA****
Значение t=2
tt = 2
qq = 535.4916555247646
```
Теперь обратимся к каждому из объектов в рабочем пространстве:
```
>>> mod0.tt
'2'
>>> mod0.qq
535.4916555247646
```
Обращение к perm1 выглядит несколько иначе:
```
>>> mod0.perm1
Traceback (most recent call last):
File "<stdin>", line 1, in <module> - неверно
AttributeError: module 'mod0' has no attribute 'perm1'
>>> mod0.mod1.perm1
'8' - верно
```
Ошибка возникает, потому что переменная perm1 находится в пространстве имен
модуля mod1, а не модуля mod0. Чтобы сделать её доступной через mod0, нужно явно
импортировать её с помощью такой строки:
from mod1 import perm1.
### Пункт 3.2.
Файл mm0.py:
```
import mm2
print('y =', mm2.vyhod)
```
Файл mm1.py:
```
def realdvig(xtt,kk1,TT,yti1,ytin1):
#Модель реального двигателя
yp = kk1 * xtt #усилитель
yti1 = yp + yti1 #Интегратор
ytin1 = (yti1+TT*ytin1)/(TT+1)
return [yti1, ytin1]
def tahogen(xtt,kk2,yti2):
#Модель тахогенератора
yp = kk2 * xtt #усилитель
yti2 = yp + yti2 #интегратор
return yti2
def nechus(xtt,gran):
if (xtt < gran) and (xtt > (-gran)):
ytt = 0
elif xtt >= gran:
ytt = xtt - gran
elif xtt <= (-gran):
ytt = xtt + gran
return ytt
```
Файл mm2.py:
```
znach = input('k1,T,k2,Xm,A,F,N=').split(',')
k1 = float(znach[0])
T = float(znach[1])
k2 = float(znach[2])
Xm = float(znach[3])
A = float(znach[4])
F = float(znach[5])
N = int(znach[6])
import math
vhod = []
for i in range(N):
vhod.append(A*math.sin((2*i*math.pi)/F))
import mm1 as mod
yi1 = 0; yin1 = 0; yi2 = 0
vyhod=[]
for xt in vhod:
xt1 = xt - yi2 #отрицательная обратная связь
[yi1,yin1] = mod.realdvig(xt1,k1,T,yi1,yin1)
yi2 = mod.tahogen(yin1,k2,yi2)
yt = mod.nechus(yin1,Xm)
vyhod.append(yt)
```
Тестирование:
k1,T,k2,Xm,A,F,N=9,6,4,11,3,0.5,1500
y = [0, 0, ... 0, -70.20177063675057, 0, 257.73311334096866, -677.4095530135962, ... -6.270038281034423e+306, -1.198995988522659e+307]
### Области действия объектов в модулях:
Обращение в функции alpha к функции beta:
```
def alpha():
print('****ALPHA****')
t=input('Значение t=')
beta(int(t))
return t
def beta(q):
import math
expi=q*math.pi
return math.exp(expi)
```
Тестирование:
```
Mod1: Введите значение = 8
Mod1: Значение perm1 = 8
perm1 = 8
****ALPHA****
Значение t=4
tt = 4
qq = 286751.31313665316
```
Обращение в функции beta к функции alpha:
```
def alpha():
print('****ALPHA****')
t=input('Значение t=')
return t
def beta(q):
import math
expi = int(alpha())*math.pi
return math.exp(expi)
```
Тестирование:
```
Mod1: Введите значение = 8
Mod1: Значение perm1 = 8
perm1 = 8
****ALPHA****
Значение t=4
tt = 4
****ALPHA****
Значение t=4
qq = 286751.31313665316
```
Ввод запускается два раза - первый от самой функции alpha, а второй - от той, которая
упоминалась в beta.
Отобразить на экране в модуле Mod0 значения объектов t и expi:
Одна из попыток:
```
#Модуль mod0
import mod1
print('perm1 = ', mod1.perm1)
from mod2 import alpha as al
tt = al()
print('tt = ', tt)
from mod2 import beta
qq=beta(float(tt))
print('qq = ', qq)
print(f't = {al.t}, expi = {beta.expi}')
Traceback (most recent call last):
File "C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА8\mod0.py", line 9, in <module>
print(f't = {al.t}, expi = {beta.expi}')
AttributeError: 'function' object has no attribute 't'
```
Не получится вызвать эти переменные по их непосредственному имени (t и expi),
упоминая объекты, атрибутами которых они являются, без изменения кода (например,
объявления t в alpha как глобальную переменную, или задание его как метода.
Но, так как мы знаем, что alpha возвращает t, то узнать t можем по имени al.
С expi и beta так не получится:
```
Traceback (most recent call last):
File "C:\Users\mapon\OneDrive\Рабочий стол\ПО АС\ТЕМА8\mod0.py", line 10, in <module>
print(f't = {al}, expi = {beta.expi}')
^^^^^^^^^
AttributeError: 'function' object has no attribute 'expi'
```
В модуле Mod0 увеличить в 3 раза значение
объекта perm1 и отобразить его после этого на экране.
Так как perm1 имеет тип str, то умножение напрямую без преобразования типов
будет выглядеть так:
```
...
print('perm1 = ', mod1.perm1)
print('Умножено:' , mod1.perm1 * 3)
...
Mod1: Введите значение = 4
Mod1: Значение perm1 = 4
perm1 = 4
Умножено: 444
```
Преобразовав тип perm1, можно получить классическое умножение:
```
...
print('Умножено:' , int(mod1.perm1) * 3)
...
Mod1: Введите значение = 4
Mod1: Значение perm1 = 4
perm1 = 4
Умножено: 12
```
В командной строке (в главном модуле) увеличить в 2 раза значения объектов perm1, tt, qq:
```
>>> mod1.perm1 * 2
'55'
>>> mod0.tt * 2
'44'
>>> mod0.qq * 2
573502.6262733063
```
perm1 и tt, как упоминалось ранее, имеют строковый тип, так что умножение
дублирует содержимое строки.

@ -0,0 +1,75 @@
# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 8
Выполнил: Тимошенко А.А. Проверил: Козлюк Д.А.
## Задание
Разработайте программу, состоящую из трех модулей:
- Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколь-ко на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полу-ченный список должен возвращаться в вызывающую программу.
- Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
- Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. За-тем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.
## Решение
okz1.py
```
def reading (file):
nums = []
with open(file, 'r') as file:
for line in file:
nums.extend(map(float, line.split()))
return nums
```
okz2.py
```
import math
def correlation(l1, l2):
n = min(len(l1), len(l2))
sum1 = sum(l1)
sum2 = sum(l2)
sum1sq = sum(now ** 2 for now in l1)
sum2sq = sum(now ** 2 for now in l2)
sum12 = sum(x * y for x, y in zip(l1, l2))
part1 = n * sum12 - sum1 * sum2
part2 = math.sqrt((n * sum1sq - sum1 ** 2) * (n * sum2sq - sum2 ** 2))
try:
corr = part1 / part2
return corr
except ZeroDivisionError:
print("Ошибка деления на ноль!")
return
```
okz3.py
```
from okz1 import reading
from okz2 import correlation
file1 = input("Введите имя первого файла: ")
file2 = input("Введите имя второго файла: ")
arr1 = reading(file1)
arr2 = reading(file2)
if arr1 is None or arr2 is None:
print("Не удалось считать данные из файлов.")
else:
corr = correlation(arr1, arr2)
if corr is not None:
print(f"Коэффициент корреляции: {corr:.2f}")
```
Содержимое файлов:
```
data1.txt
1.0 2.0 3.0 4.0 5.0
6.0 7.0 8.0 9.0 10.0
data2.txt
10.0 9.5 9.0 8.5 8.0
7.5 7.0 6.5 6.0 1.0
```
```
================ RESTART: C:/Users/mapon/OneDrive/Рабочий стол/ПО АС/ТЕМА8/okz3.py ================
Введите имя первого файла: data1.txt
Введите имя второго файла: data2.txt
Коэффициент корреляции: -0.88
```

@ -0,0 +1,138 @@
#Отчет по ЛР 1 ПО АС Выполнил: студент группы А-01-23 Тимошенко А.А. Проверил: Козлюк Д.А.
#Пункт 1 В папку L:\\III курс\\А-1-23\\TimoshenkoAA\\Tema1\\ПО АС 2025
перенесены материалы и распакован архив Tema1.rar
#Пункт 2 Запущен интепретатор Phyton
#Пункт 3 \>\>\> print(\"hello\") hello
#Пункт 4 \>\>\> h=input(\'Your name= \') Your name= Alexander \>\>\> h
\'Alexander\'
#Пункт 5 \>\>\> exit()
#Пункты 6-7 Запущена IDLE Python 3.11, изучено устройство главного
командного окна среды
#Пункт 8 import os os.chdir(\'L:\\III
курс\\А-1-23\\TimoshenkoAA\\Tema1\\ПО АС 2025\')
#Пункт 9 Шрифт изменен на Arial CYR, кегль 11, размер начального окна
50\*100 символов, комментарии подсвечиваются коричневым
#В текстовом редакторе IDLE создана программа следующего содержания:
#Программа по теме 1 Тимошенко Александр Анатольевич
import os
print(\"hello\") h = input(\'Your name = \')
os.chdir(\'L:\\III курс\\А-1-23\\TimoshenkoAA\\Tema1\\ПО АС 2025\') Она
делает следующий вывод: = RESTART: L:/III
курс/А-1-23/TimoshenkoAA/Tema1/ПО АС 2025/Pr0.py Hello Your
name=Alexander
import Pr0 Hello Your name=Alexander
При нажатии f5 в активном окне редактора:
= RESTART: L:/III курс/А-1-23/TimoshenkoAA/Tema1/ПО АС 2025/Pr0.py Hello
Your name=
#Пункт 11
Из консоли вызван файл prb1.py
\>\>\> import prb1 Как Вас зовут? Александр Привет, Александр
#Пункт 12
Файл Pr0.cpython-34.pyc открыт в NotePad ++. Видно, что разультат
компиляции тяжел для восприятия человеком, вероятно, из-за
несоответствия кодировок. Комплиляция программ необходима, чтобы
перевести команды из человекопонятной формы в машинный код, который
может быть обработан процессором. При выполнении скрипта Python сначала
преобразовывает его в байт-код (.рус), а затем уже он компилируется с
помощью виртуальный машины. Это ускорит повторную загрузку программы.
#Пункт 13
Все верные команды из командного окна IDLE скопированы в отдельный файл
#Пункт 14
В разделе помощи help можно найти следующие опции:
About IDLE - описание характеристик текущей среды (версия, путь и пр.)
IDLE Help - помощь по работе со средой
Python Docs - документация по языку
Turtle Demo - окно работы и помощь модуля для работы с графикой turtle
\>\>\> help (print)
Help on built-in function print in module builtins:
print(\...) print(value, \..., sep=\' \', end=\'\\n\', file=sys.stdout,
flush=False)
Prints the values to a stream, or to sys.stdout by default. Optional
keyword arguments: file: a file-like object (stream); defaults to the
current sys.stdout. sep: string inserted between values, default a
space. end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
\>\>\> help(print), help(input)
Help on built-in function print in module builtins:
print(\...) print(value, \..., sep=\' \', end=\'\\n\', file=sys.stdout,
flush=False)
Prints the values to a stream, or to sys.stdout by default. Optional
keyword arguments: file: a file-like object (stream); defaults to the
current sys.stdout. sep: string inserted between values, default a
space. end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Help on built-in function input in module builtins:
input(prompt=None, /) Read a string from standard input. The trailing
newline is stripped.
The prompt string, if given, is printed to standard output without a
trailing newline before reading input.
If the user hits EOF (\*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise
EOFError. On \*nix systems, readline is used if available.
(None, None)
F1 -\> Указатель -\> print() (built-in function) выводит справку по этой
функции
То же диалоговое окно появляется при help - Python Docs
#Пункт 15
File - Open - prb1.py
С помощью Window можно переключаться между всеми открытыми окнами
prb1.py - Run
======= RESTART: L:\\III курс\\А-1-23\\TimoshenkoAA\\Tema1\\ПО АС
2025\\prb1.py ====== Как Вас зовут? Александр Привет, Александр
\>\>\> import tdemo_chaos
Help - Turtle Demo - clock - Start выводит на экран графическое
представление программы - циферблат с часами. Есть и другие примеры
программ модуля turtle, которые можно брать за основу собственных
программ.
16\. Завершена работа со средой: File - exit
Загрузка…
Отмена
Сохранить