Сравнить коммиты
18 Коммитов
9a86ed855c
...
main
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
938ea36e39 | ||
|
|
6060694e61 | ||
|
|
bd677349b6 | ||
|
|
4ab3a4680d | ||
|
|
a452e9798d | ||
|
|
dd3ccf8cbb | ||
|
|
9ba7bc18e6 | ||
|
|
985c67a6f8 | ||
|
|
b19195609b | ||
|
|
00a85e2f17 | ||
|
|
5a62b0131c | ||
|
|
6b256e7995 | ||
|
|
bd111d96a0 | ||
|
|
4360983378 | ||
|
|
09e65158e8 | ||
|
|
a1e89bc5e0 | ||
| 98a6412095 | |||
| e127606f2a |
@@ -12,7 +12,8 @@
|
|||||||
5) Подсчитайте сумму элементов в объекте, созданном в п.4. Отобразите результат по шаблону: "Сумма элементов=ХХХ".
|
5) Подсчитайте сумму элементов в объекте, созданном в п.4. Отобразите результат по шаблону: "Сумма элементов=ХХХ".
|
||||||
|
|
||||||
## Решение
|
## Решение
|
||||||
1.
|
1
|
||||||
|
|
||||||
В командном окне после символов приглашения к диалогу ввести инструкции настройки рабочего каталога
|
В командном окне после символов приглашения к диалогу ввести инструкции настройки рабочего каталога
|
||||||
среды по следующему образцу:
|
среды по следующему образцу:
|
||||||
import os
|
import os
|
||||||
@@ -20,7 +21,9 @@ os.chdir('<путь доступа к папке>')
|
|||||||
|
|
||||||
Установка рабочего каталога позволяет упростить загрузку и сохранение файлов, так как все относительные пути будут отсчитываться от этого каталога.
|
Установка рабочего каталога позволяет упростить загрузку и сохранение файлов, так как все относительные пути будут отсчитываться от этого каталога.
|
||||||
Если имеет место скрипт, который должен считывать файлы из определенного каталога или записывать результаты в эту же директорию - необходимо установить этот каталог как текущий рабочий.
|
Если имеет место скрипт, который должен считывать файлы из определенного каталога или записывать результаты в эту же директорию - необходимо установить этот каталог как текущий рабочий.
|
||||||
2.
|
|
||||||
|
2
|
||||||
|
|
||||||
```python
|
```python
|
||||||
>>>sentence = "Напишите инструкции, обеспечивающие подсчет числа букв (без запятой, скобок и пробелов) в данном предложении."
|
>>>sentence = "Напишите инструкции, обеспечивающие подсчет числа букв (без запятой, скобок и пробелов) в данном предложении."
|
||||||
|
|
||||||
@@ -33,7 +36,9 @@ os.chdir('<путь доступа к папке>')
|
|||||||
в предложении 92 букв
|
в предложении 92 букв
|
||||||
```
|
```
|
||||||
|
|
||||||
3.
|
3
|
||||||
|
|
||||||
|
|
||||||
```python
|
```python
|
||||||
>>>num = 2345
|
>>>num = 2345
|
||||||
>>>binary = bin(num)
|
>>>binary = bin(num)
|
||||||
@@ -55,7 +60,8 @@ os.chdir('<путь доступа к папке>')
|
|||||||
12
|
12
|
||||||
```
|
```
|
||||||
|
|
||||||
4.
|
4
|
||||||
|
|
||||||
```python
|
```python
|
||||||
>>>something = {-45,78,90,-3,56}
|
>>>something = {-45,78,90,-3,56}
|
||||||
>>>type(something)
|
>>>type(something)
|
||||||
@@ -65,7 +71,7 @@ os.chdir('<путь доступа к папке>')
|
|||||||
True
|
True
|
||||||
```
|
```
|
||||||
|
|
||||||
5.
|
5
|
||||||
|
|
||||||
```python
|
```python
|
||||||
>>>total = sum(something)
|
>>>total = sum(something)
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ range(0, 23)
|
|||||||
>>>list(range(23))
|
>>>list(range(23))
|
||||||
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
|
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
|
||||||
```
|
```
|
||||||
Объект range(23) будет содержать последовательность целых чисел, начиная с 0 и до 22 (так как 23 не включается). Чтобы это увидить, необходимо применить list(). range — это легковесный объект, который генерирует числа на лету, а не хранит их все в памяти, поэтому преобразование в list нужно только для просмотра. Границы диапазона: от 0 и до 23, проход с шагом 1 по умолчанию(Если вызываем просто range(23), выводится только начальное и конечное значение).
|
Объект range(23) будет содержать последовательность целых чисел, начиная с 0 и до 22 (так как 23 не включается). Чтобы это увидеть, необходимо применить list(). range — это легковесный объект, который генерирует числа на лету, а не хранит их все в памяти, поэтому преобразование в list нужно только для просмотра. Границы диапазона: от 0 и до 23, проход с шагом 1 по умолчанию(Если вызываем просто range(23), выводится только начальное и конечное значение).
|
||||||
|
|
||||||
### 2.3. Функция zip - создание итерируемого объекта из кортежей
|
### 2.3. Функция zip - создание итерируемого объекта из кортежей
|
||||||
```python
|
```python
|
||||||
@@ -152,7 +152,7 @@ Traceback (most recent call last):
|
|||||||
ff[1]
|
ff[1]
|
||||||
TypeError: 'zip' object is not subscriptable
|
TypeError: 'zip' object is not subscriptable
|
||||||
```
|
```
|
||||||
К объекту ff нельзя обратиться по индексу из-за того что он не итерируемый, так же он является не изменяемым.
|
К объекту ff нельзя обратиться по индексу из-за того что он не индексируемый, так же он является не изменяемым.
|
||||||
|
|
||||||
### 2.4. Функция eval – вычисление значения выражения, корректно записанного на языке Python и представленного в виде символьной строки.
|
### 2.4. Функция eval – вычисление значения выражения, корректно записанного на языке Python и представленного в виде символьной строки.
|
||||||
|
|
||||||
|
|||||||
53
TEMA4/test.md
Обычный файл
@@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
## Жалнин В.Ю. А-01-23, вариант 19
|
||||||
|
|
||||||
|
# Задание:
|
||||||
|
Напишите инструкцию запоминания в переменной текущего регионального времени. Напишите инструкцию превращения этого времени в символьную строку. Отобразите результат на экране. Создайте множество с 5 элементами – случайными целыми числами из диапазона значений от -23 до 57. Подсчитайте корень квадратный из суммы элементов этого множества и отобразите на экране в виде: «результат = ХХХ» с округлением числа до одного знака после точки.
|
||||||
|
Выполнение:
|
||||||
|
```python
|
||||||
|
#Напишите инструкцию запоминания в переменной текущего регионального времени.
|
||||||
|
|
||||||
|
import time
|
||||||
|
|
||||||
|
regional = time.localtime()
|
||||||
|
|
||||||
|
#Напишите инструкцию превращения этого времени в символьную строку.
|
||||||
|
|
||||||
|
symbol = time.asctime(regional)
|
||||||
|
|
||||||
|
#Отобразите результат на экране.
|
||||||
|
|
||||||
|
print(symbol)
|
||||||
|
|
||||||
|
#Создайте множество с 5 элементами – случайными целыми числами из диапазона зна-чений от -23 до 57.
|
||||||
|
|
||||||
|
import random
|
||||||
|
|
||||||
|
mnozhestv0 = set(random.sample(range(-23,58),5)) # Множество - набор уникальных(!) элементов
|
||||||
|
|
||||||
|
#Подсчитайте корень квадратный из суммы элементов этого множества
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
if sum(mnozhestv0) < 0:
|
||||||
|
|
||||||
|
print("К сожалению, получившаяся сумма элементов меньше нуля, извлечение корня невозможно. Перезапустите программу.")
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
koren = math.sqrt(sum(mnozhestv0))
|
||||||
|
|
||||||
|
#отобразите на экране в виде: «результат = ХХХ» с округлением числа до одного знака после точки
|
||||||
|
|
||||||
|
print("результат =", round(koren,1))
|
||||||
|
```
|
||||||
|
Вывод в терминал (первый вариант)
|
||||||
|
```
|
||||||
|
Mon Oct 27 12:22:36 2025
|
||||||
|
К сожалению, получившаяся сумма элементов меньше нуля, извлечение корня невозможно. Перезапустите программу.
|
||||||
|
```
|
||||||
|
Вывод в терминал (второй вариант)
|
||||||
|
```
|
||||||
|
Mon Oct 27 12:23:32 2025
|
||||||
|
результат = 10.1
|
||||||
|
```
|
||||||
Двоичные данные
TEMA5/figure0.png
Обычный файл
|
После Ширина: | Высота: | Размер: 27 KiB |
Двоичные данные
TEMA5/figure1.png
Обычный файл
|
После Ширина: | Высота: | Размер: 14 KiB |
366
TEMA5/report.md
Обычный файл
@@ -0,0 +1,366 @@
|
|||||||
|
*Жалнин Вадим А-01-23*
|
||||||
|
## 1. Запуск интерактивной оболочки IDLE.
|
||||||
|
|
||||||
|
## 2. Ветвление по условию – управляющая инструкция if.
|
||||||
|
|
||||||
|
- Операции определения значения dohod:
|
||||||
|
```python
|
||||||
|
>>>porog = 5
|
||||||
|
>>>rashod1 = 8
|
||||||
|
>>>rashod2 = 6
|
||||||
|
|
||||||
|
if rashod1 >= porog:
|
||||||
|
dohod = 12
|
||||||
|
elif rashod2 == porog:
|
||||||
|
dohod = 0
|
||||||
|
else:
|
||||||
|
dohod = 8
|
||||||
|
|
||||||
|
>>>print(dohod)
|
||||||
|
>>>12
|
||||||
|
# Выполним операцию для двух случаев
|
||||||
|
>>>rashod2 = 4
|
||||||
|
>>>if rashod1 >= 3 and rashod2 == 4:
|
||||||
|
dohod = rashod1
|
||||||
|
if rashod2 == porog or rashod1 < rashod2:
|
||||||
|
dohod = porog
|
||||||
|
>>>print(dohod)
|
||||||
|
8
|
||||||
|
>>>porog = 4
|
||||||
|
>>>if rashod1 >= 3 and rashod2 == 4:
|
||||||
|
dohod = rashod1
|
||||||
|
if rashod2 == porog or rashod1 < rashod2:
|
||||||
|
dohod = porog
|
||||||
|
>>>print(dohod)
|
||||||
|
4
|
||||||
|
```
|
||||||
|
- Операция с множественным ветвлением линий потока:
|
||||||
|
```python
|
||||||
|
>>>if porog == 3: # Не подходит
|
||||||
|
dohod = 1
|
||||||
|
elif porog == 4: # Подходит
|
||||||
|
dohod = 2
|
||||||
|
elif porog == 5: # Игнорируется
|
||||||
|
dohod = 3
|
||||||
|
else: # Игнорируется
|
||||||
|
dohod = 0
|
||||||
|
>>>print(dohod)
|
||||||
|
2
|
||||||
|
```
|
||||||
|
|
||||||
|
- Инструкции, записывающиеся в одну строку в операторе присваивания.
|
||||||
|
<Объект>=<значение 1> if <условие> else <значение 2>
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>>dohod = 2 if porog >= 4 else 0
|
||||||
|
>>>print(dohod)
|
||||||
|
2
|
||||||
|
>>>if porog >= 5: rashod1 = 6; rashod2 = 0 # porog = 4
|
||||||
|
>>>print(rashod1)
|
||||||
|
8
|
||||||
|
>>>print(rashod2)
|
||||||
|
4
|
||||||
|
>>>porog = 6
|
||||||
|
>>>if porog >= 5: rashod1 = 6; rashod2 = 0
|
||||||
|
>>>print(rashod1)
|
||||||
|
6
|
||||||
|
>>>print(rashod2)
|
||||||
|
0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Цикл по перечислению – управляющая инструкция for.
|
||||||
|
Общее правило написания:
|
||||||
|
for <Объект-переменная цикла> in <объект>:
|
||||||
|
<отступы><Блок инструкций 1 – тело цикла>
|
||||||
|
[else:
|
||||||
|
< отступы ><Блок инструкций 2 – если в цикле не сработал break>]
|
||||||
|
|
||||||
|
|
||||||
|
### 3.1. Простой цикл.
|
||||||
|
Выполняем цикл, который проходится по значениям от 3 до 18(не включительно) с шагом 3 и суммирует их в переменную temperatura.
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>>temperatura = 5
|
||||||
|
>>>for i in range(3, 18, 3):
|
||||||
|
temperatura += i
|
||||||
|
|
||||||
|
>>>temperatura
|
||||||
|
50
|
||||||
|
```
|
||||||
|
### 3.2. Более сложный цикл.
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>>sps = [2, 15, 14, 18]
|
||||||
|
>>>for k in sps:
|
||||||
|
if len(sps) <= 10: sps.append(sps[0])
|
||||||
|
else: break
|
||||||
|
>>>sps
|
||||||
|
[2, 15, 14, 18, 2, 2, 2, 2, 2, 2, 2]
|
||||||
|
```
|
||||||
|
|
||||||
|
В конец списка добавляется двойка до тех пор, пока его длина не превысит 10.
|
||||||
|
sps - это и объект, по которому проходит k, и объект, изменяющийся внутри цикла. То есть k будет двигаться по циклу бесконечно, и выполнение останавливается именно из-за условия if - else.
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>>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, поэтому бесконечного прохождения цикла не произойдёт, даже если не будет выполнено условие if-else. Количество итераций обусловлено в данном случае только изначальным количеством элементов в списке sps (4 элемента в списке => 4 элемента добавлено к изначальному списку)
|
||||||
|
|
||||||
|
### 3.3. : Cоздание списка с 10 целыми случайными числами из диапазона от 1 до 100. При этом, если сумма чисел не превышает 500, эта сумма должна быть отображена на экране.
|
||||||
|
|
||||||
|
```python
|
||||||
|
>>>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
|
||||||
|
512
|
||||||
|
>>>sps5
|
||||||
|
[47, 92, 92, 54, 52, 78, 67, 30]
|
||||||
|
```
|
||||||
|
После того, как прошло девять итераций, сумма элементов списка уже была больше 500, поэтому
|
||||||
|
цикл закончился из-за if, а не из-за окончания диапазона range(10).
|
||||||
|
|
||||||
|
Попробуем обнулить список и выполнить ту же программу еще раз:
|
||||||
|
```python
|
||||||
|
>>>sps5 = []
|
||||||
|
>>>for i in range(10):
|
||||||
|
sps5.append(rn.randint(1, 100))
|
||||||
|
ss = sum(sps5)
|
||||||
|
if ss > 500: break
|
||||||
|
else:
|
||||||
|
print(ss)
|
||||||
|
419
|
||||||
|
```
|
||||||
|
В этот раз программа вывела ответ, следовательно сработал else и break не сработал.
|
||||||
|
|
||||||
|
### 3.4. Пример с символьной строкой
|
||||||
|
```python
|
||||||
|
>>>stroka='Это – автоматизированная система'
|
||||||
|
>>>stroka1 = " "
|
||||||
|
>>>for ss in stroka:
|
||||||
|
stroka1 += " " + ss
|
||||||
|
>>>print(stroka1)
|
||||||
|
Э т о – а в т о м а т и з и р о в а н н а я с и с т е м а
|
||||||
|
```
|
||||||
|
Переменная stroka содержит исходную строку: "Это – автоматизированная система".
|
||||||
|
Переменная stroka1 инициализируется как пустая строка.
|
||||||
|
В цикле for происходит перебор каждого символа ss из строки stroka.
|
||||||
|
На каждой итерации к stroka1 добавляется пробел и текущий символ ss.
|
||||||
|
После обработки всех символов в stroka1 формируется новая строка, где каждый символ исходной строки разделён пробелом.
|
||||||
|
|
||||||
|
|
||||||
|
### 3.5. Конструкция list comprehension.
|
||||||
|
Пример: создание списка с синусоидальным сигналом.(Внутри квадратных скобок записано выражение-генератор)
|
||||||
|
```python
|
||||||
|
>>>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]
|
||||||
|
>>>import pylab
|
||||||
|
>>>pylab.plot(sps2, label = 'Синусоидальный сигнал', color = 'red')
|
||||||
|
[<matplotlib.lines.Line2D object at 0x000001A6371A2CE0>]
|
||||||
|
>>>pylab.show()
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
## 4. Цикл «пока истинно условие» – управляющая инструкция while.
|
||||||
|
Общее правило написания:
|
||||||
|
while <Условие>:
|
||||||
|
<отступы><Блок инструкций 1 – тело цикла>
|
||||||
|
[else:
|
||||||
|
<отступы><Блок инструкций 2 – если в цикле не сработал break>]
|
||||||
|
|
||||||
|
### 4.1. Цикл со счетчиком.
|
||||||
|
```python
|
||||||
|
>>>rashod = 300
|
||||||
|
>>>while rashod:
|
||||||
|
print("Расход=", rashod)
|
||||||
|
rashod -= 50
|
||||||
|
Расход= 300
|
||||||
|
Расход= 250
|
||||||
|
Расход= 200
|
||||||
|
Расход= 150
|
||||||
|
Расход= 100
|
||||||
|
Расход= 50
|
||||||
|
```
|
||||||
|
Цикл завершился из-за того, что расход стал равен 0, а 0 в свою очередь воспринимается как False.
|
||||||
|
|
||||||
|
|
||||||
|
### 4.2. Пример с символьной строкой.
|
||||||
|
```python
|
||||||
|
>>>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
|
||||||
|
Значение в момент 4 = 0.197375320224904
|
||||||
|
Значение в момент 5 = 0.2449186624037092
|
||||||
|
Значение в момент 6 = 0.2913126124515909
|
||||||
|
Значение в момент 7 = 0.3363755443363322
|
||||||
|
Значение в момент 8 = 0.3799489622552249
|
||||||
|
Значение в момент 9 = 0.421899005250008
|
||||||
|
Значение в момент 10 = 0.4621171572600098
|
||||||
|
Значение в момент 11 = 0.5005202111902354
|
||||||
|
Значение в момент 12 = 0.5370495669980353
|
||||||
|
Значение в момент 13 = 0.5716699660851172
|
||||||
|
Значение в момент 14 = 0.6043677771171636
|
||||||
|
Значение в момент 15 = 0.6351489523872873
|
||||||
|
Значение в момент 16 = 0.6640367702678489
|
||||||
|
Значение в момент 17 = 0.6910694698329307
|
||||||
|
Значение в момент 18 = 0.7162978701990245
|
||||||
|
Значение в момент 19 = 0.7397830512740043
|
||||||
|
Значение в момент 20 = 0.7615941559557649
|
||||||
|
Значение в момент 21 = 0.7818063576087741
|
||||||
|
Значение в момент 22 = 0.8004990217606297
|
||||||
|
Значение в момент 23 = 0.8177540779702878
|
||||||
|
Значение в момент 24 = 0.8336546070121553
|
||||||
|
Значение в момент 25 = 0.8482836399575129
|
||||||
|
Значение в момент 26 = 0.8617231593133063
|
||||||
|
Значение в момент 27 = 0.874053287886007
|
||||||
|
Значение в момент 28 = 0.8853516482022625
|
||||||
|
Значение в момент 29 = 0.8956928738431645
|
||||||
|
Значение в момент 30 = 0.9051482536448664
|
||||||
|
Значение в момент 31 = 0.9137854901178277
|
||||||
|
Значение в момент 32 = 0.9216685544064713
|
||||||
|
Значение в момент 33 = 0.9288576214547277
|
||||||
|
Значение в момент 34 = 0.935409070603099
|
||||||
|
Значение в момент 35 = 0.9413755384972874
|
||||||
|
Значение в момент 36 = 0.9468060128462683
|
||||||
|
Значение в момент 37 = 0.9517459571646616
|
||||||
|
Значение в момент 38 = 0.9562374581277391
|
||||||
|
>>>pylab.plot(sps2, label = 'Сигнал на выходе инерционного звена', color = 'red')
|
||||||
|
[<matplotlib.lines.Line2D object at 0x000001A6372762F0>]
|
||||||
|
>>>pylab.show()
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
### 4.3. Определение, является ли число простым (делится только на самого себя или 1).
|
||||||
|
```python
|
||||||
|
>>>chislo=267 #Проверяемое число
|
||||||
|
>>>kandidat =chislo // 2 # Для значений chislo > 1
|
||||||
|
>>>while kandidat > 1:
|
||||||
|
if chislo%kandidat == 0: # Остаток от деления
|
||||||
|
print(chislo, ' имеет множитель ', kandidat)
|
||||||
|
break # else выполняться не будет
|
||||||
|
kandidat -= 1
|
||||||
|
>>>else: # При завершении цикла без break
|
||||||
|
print(chislo, ' является простым!')
|
||||||
|
267 имеет множитель 89
|
||||||
|
```
|
||||||
|
Программа работает так: переменная kandidat отвечает за потенциальный делитель заданного
|
||||||
|
числа. Изначально мы задаем половину от заданного числа, потому что у числа не может быть
|
||||||
|
делителя большего, чем половина от него. Далее мы последовательно уменьшаем потенциальный
|
||||||
|
множитель, каждый раз проверяя, получилось ли поделить без остатка. Если получилось, то
|
||||||
|
число непростое, и цикл можно прекращать досрочно. Если цикл отработал до конца, не
|
||||||
|
прервавшись, то число простое.
|
||||||
|
|
||||||
|
Дополним программу так, чтобы выявить все простые числа в диапазоне от 250 до 300.
|
||||||
|
```python
|
||||||
|
>>>for i in range(250, 301):
|
||||||
|
chislo = i
|
||||||
|
kandidat = chislo // 2
|
||||||
|
while kandidat > 1:
|
||||||
|
if chislo % kandidat == 0:
|
||||||
|
print(chislo, 'имеет множитель', kandidat)
|
||||||
|
break
|
||||||
|
kandidat -= 1
|
||||||
|
else:
|
||||||
|
print(chislo, 'является простым!')
|
||||||
|
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
|
||||||
|
```
|
||||||
|
Здесь просто добавляется for для перебора значений.
|
||||||
|
|
||||||
|
### 4.4. Инструкция continue
|
||||||
|
Инструкция continue, которая не вызывает завершения цикла, но завершает его текущий виток и обеспечивает переход к следующему витку.
|
||||||
|
```python
|
||||||
|
>>>x = [rn.randint(-25, 40) for i in range (20)]
|
||||||
|
>>>x
|
||||||
|
[35, 21, -14, 21, -15, 1, -9, -7, -15, 2, 32, 11, 38, 32, -13, -21, 31, -10, -20, 15]
|
||||||
|
>>>for y in x:
|
||||||
|
if y < 0: continue
|
||||||
|
print(y, ">0")
|
||||||
|
else: print("stop")
|
||||||
|
35 >0
|
||||||
|
21 >0
|
||||||
|
21 >0
|
||||||
|
1 >0
|
||||||
|
2 >0
|
||||||
|
32 >0
|
||||||
|
11 >0
|
||||||
|
38 >0
|
||||||
|
32 >0
|
||||||
|
31 >0
|
||||||
|
15 >0
|
||||||
|
stop
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Завершение сеанса в среде IDLE
|
||||||
157
TEMA5/task.md
Обычный файл
@@ -0,0 +1,157 @@
|
|||||||
|
*Жалнин Вадим А-01-23*
|
||||||
|
|
||||||
|
## Задание:
|
||||||
|
|
||||||
|
- Для заданной символьной строки с англоязычным текстом (его можно заимствовать из помощи) определите порядковый номер каждой буквы в английском алфавите.
|
||||||
|
- Создайте список со словами из задания данного пункта. Для этого списка – определите, есть ли в нем некоторое заданное значение, и выведите соответствующее сообщение: либо о нахождении элемента, либо о его отсутствии в списке (проверить как с имеющимся, так и с отсутствующим словом).
|
||||||
|
- Создайте список студентов вашей группы (3-4 фамилии) и список их средних баллов в летней сессии – в порядке перечисления студентов в первом списке. Создайте еще 2 аналогичных списка для тех же студентов, но в другом порядке, по зимней сессии. Напишите инструкции, позволяющие по указанной (запрошенной и введенной) фамилии студента вывести его средние баллы по двум сессиям.
|
||||||
|
|
||||||
|
|
||||||
|
## Решение:
|
||||||
|
|
||||||
|
```python
|
||||||
|
text = "Python is a programming language that lets you work quickly and integrate systems more effectively"
|
||||||
|
alphabet = "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
print("Буква -> Номер")
|
||||||
|
print("--------------")
|
||||||
|
for char in text:
|
||||||
|
if char.lower() in alphabet:
|
||||||
|
numb = alphabet.index(char.lower()) + 1
|
||||||
|
print(f" {char} -> {numb}")
|
||||||
|
|
||||||
|
#Вывод в терминал:
|
||||||
|
|
||||||
|
Буква -> Номер
|
||||||
|
--------------
|
||||||
|
P -> 16
|
||||||
|
y -> 25
|
||||||
|
t -> 20
|
||||||
|
h -> 8
|
||||||
|
o -> 15
|
||||||
|
n -> 14
|
||||||
|
i -> 9
|
||||||
|
s -> 19
|
||||||
|
a -> 1
|
||||||
|
p -> 16
|
||||||
|
r -> 18
|
||||||
|
o -> 15
|
||||||
|
g -> 7
|
||||||
|
r -> 18
|
||||||
|
a -> 1
|
||||||
|
m -> 13
|
||||||
|
m -> 13
|
||||||
|
i -> 9
|
||||||
|
n -> 14
|
||||||
|
g -> 7
|
||||||
|
l -> 12
|
||||||
|
a -> 1
|
||||||
|
n -> 14
|
||||||
|
g -> 7
|
||||||
|
u -> 21
|
||||||
|
a -> 1
|
||||||
|
g -> 7
|
||||||
|
e -> 5
|
||||||
|
t -> 20
|
||||||
|
h -> 8
|
||||||
|
a -> 1
|
||||||
|
t -> 20
|
||||||
|
l -> 12
|
||||||
|
e -> 5
|
||||||
|
t -> 20
|
||||||
|
s -> 19
|
||||||
|
y -> 25
|
||||||
|
o -> 15
|
||||||
|
u -> 21
|
||||||
|
w -> 23
|
||||||
|
o -> 15
|
||||||
|
r -> 18
|
||||||
|
k -> 11
|
||||||
|
q -> 17
|
||||||
|
u -> 21
|
||||||
|
i -> 9
|
||||||
|
c -> 3
|
||||||
|
k -> 11
|
||||||
|
l -> 12
|
||||||
|
y -> 25
|
||||||
|
a -> 1
|
||||||
|
n -> 14
|
||||||
|
d -> 4
|
||||||
|
i -> 9
|
||||||
|
n -> 14
|
||||||
|
t -> 20
|
||||||
|
e -> 5
|
||||||
|
g -> 7
|
||||||
|
r -> 18
|
||||||
|
a -> 1
|
||||||
|
t -> 20
|
||||||
|
e -> 5
|
||||||
|
s -> 19
|
||||||
|
y -> 25
|
||||||
|
s -> 19
|
||||||
|
t -> 20
|
||||||
|
e -> 5
|
||||||
|
m -> 13
|
||||||
|
s -> 19
|
||||||
|
m -> 13
|
||||||
|
o -> 15
|
||||||
|
r -> 18
|
||||||
|
e -> 5
|
||||||
|
e -> 5
|
||||||
|
f -> 6
|
||||||
|
f -> 6
|
||||||
|
e -> 5
|
||||||
|
c -> 3
|
||||||
|
t -> 20
|
||||||
|
i -> 9
|
||||||
|
v -> 22
|
||||||
|
e -> 5
|
||||||
|
l -> 12
|
||||||
|
y -> 25
|
||||||
|
# Часть 2
|
||||||
|
text = ("Создайте список со словами из задания данного пункта. Для этого списка – определите, есть ли в нем некоторое заданное значение, и выведите соответствующее сообщение: либо о нахождении элемента, либо о его отсутствии в списке (проверить как с имеющимся, так и с отсутствующим словом).")
|
||||||
|
text = text.replace('(', ' ').replace(')', ' ').replace(',', ' ').replace('–', ' ').replace(':', ' ').replace('.', ' ')
|
||||||
|
words = text.split()
|
||||||
|
print(words)
|
||||||
|
search_word1 = "заданное"
|
||||||
|
for x in words:
|
||||||
|
if x == search_word1:
|
||||||
|
print("the word", search_word1, "was found")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("the word", search_word1, "wasn't found")
|
||||||
|
search_word2 = "информатика"
|
||||||
|
for x in words:
|
||||||
|
if x == search_word2:
|
||||||
|
print("the word", search_word2, "was found")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("the word", search_word2, "wasn't found")
|
||||||
|
|
||||||
|
#Вывод в терминал:
|
||||||
|
|
||||||
|
['Создайте', 'список', 'со', 'словами', 'из', 'задания', 'данного', 'пункта', 'Для', 'этого', 'списка', 'определите', 'есть', 'ли', 'в', 'нем', 'некоторое', 'заданное', 'значение', 'и', 'выведите', 'соответствующее', 'сообщение', 'либо', 'о', 'нахождении', 'элемента', 'либо', 'о', 'его', 'отсутствии', 'в', 'списке', 'проверить', 'как', 'с', 'имеющимся', 'так', 'и', 'с', 'отсутствующим', 'словом']
|
||||||
|
the word заданное was found
|
||||||
|
the word информатика wasn't found
|
||||||
|
|
||||||
|
# Часть 3
|
||||||
|
students = ['Terekhov', 'Zhalnin', 'Troyanov']
|
||||||
|
summer_marks = [4.25, 4.13, 4.9]
|
||||||
|
students2 = ['Troyanov', 'Terekhov', 'Zhalnin']
|
||||||
|
winter_marks = [4.1, 4.7, 3.9]
|
||||||
|
stud = input("Введите фамилию: ")
|
||||||
|
if stud in students and stud in students2:
|
||||||
|
idx_summer = students.index(stud)
|
||||||
|
idx_winter = students2.index(stud)
|
||||||
|
print("Летний средний балл: ", summer_marks[idx_summer], "\nЗимний средний балл: ", winter_marks[idx_winter])
|
||||||
|
else:
|
||||||
|
print("Такого студента нет")
|
||||||
|
|
||||||
|
#Вывод в терминал:
|
||||||
|
|
||||||
|
Введите фамилию: Terekhov
|
||||||
|
Летний средний балл: 4.25
|
||||||
|
Зимний средний балл: 4.7
|
||||||
|
|
||||||
|
Введите фамилию: Lazarev
|
||||||
|
Такого студента нет
|
||||||
|
```
|
||||||
21
TEMA5/test.md
Обычный файл
@@ -0,0 +1,21 @@
|
|||||||
|
Жалнин Вадим А-01-23 вариант 11
|
||||||
|
|
||||||
|
Создайте символьную строку с текстом: «я, великий и могучий юноша-вождь с мечом и щитом захватил и объединил эфесское царство». Напишите инструкции, позволяющие определить, каких букв русского алфавита нет в этой строке.
|
||||||
|
|
||||||
|
```python
|
||||||
|
text = "я, великий и могучий юноша-вождь с мечом и щитом захватил и объединил эфесское царство"
|
||||||
|
alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
|
||||||
|
used_letters = set()
|
||||||
|
for char in text:
|
||||||
|
if char in alphabet:
|
||||||
|
used_letters.add(char)
|
||||||
|
missing = [letter for letter in alphabet if letter not in used_letters]
|
||||||
|
print(f"В данном предложении нет следующих букв: {missing}")
|
||||||
|
print(f"Не использовано {len(missing)} букв")
|
||||||
|
```
|
||||||
|
```
|
||||||
|
вывод в терминал:
|
||||||
|
|
||||||
|
В данном предложении нет следующих букв: ['ё', 'п', 'ы']
|
||||||
|
Не использовано 3 букв
|
||||||
|
```
|
||||||
500
TEMA6/report.md
Обычный файл
@@ -0,0 +1,500 @@
|
|||||||
|
*Жалнин Вадим А-01-23*
|
||||||
|
|
||||||
|
## 1. Запуск интерактивной оболочки IDLE.
|
||||||
|
|
||||||
|
## 2. Вывод данных на экран дисплея.
|
||||||
|
### 2.1. Вывод в командной строке.
|
||||||
|
```python
|
||||||
|
>>>stroka='Автоматизированная система управления'
|
||||||
|
>>>stroka
|
||||||
|
'Автоматизированная система управления'
|
||||||
|
```
|
||||||
|
Этот способ называется «эхо-выводом». Пригоден при работе в командной строке, однако в пользовательских функциях этот способ применять нельзя.
|
||||||
|
|
||||||
|
|
||||||
|
### 2.2. Вывод с использованием функции print.
|
||||||
|
```python
|
||||||
|
>>>fff = 234.5; gg = 'Значение температуры='
|
||||||
|
>>>print(gg, fff) # Можно вывести несколько объектов за одно обращение к функции
|
||||||
|
Значение температуры= 234.5
|
||||||
|
>>>print(gg, fff, sep='/') # Указание разделителя с помощью sep
|
||||||
|
Значение температуры=/234.5
|
||||||
|
>>>print(gg, fff,sep='/',end='***'); print('____')
|
||||||
|
Значение температуры=/234.5***____
|
||||||
|
```
|
||||||
|
|
||||||
|
Для простого перехода на новую строку, можно использовать такое обращение:
|
||||||
|
```python
|
||||||
|
>>>print()
|
||||||
|
```
|
||||||
|
|
||||||
|
Оператор вывода может располагаться на нескольких строках с использованием тройных кавычек:
|
||||||
|
```python
|
||||||
|
>>>print(""" Здесь может выводиться
|
||||||
|
большой текст,
|
||||||
|
занимающий несколько строк""")
|
||||||
|
Здесь может выводиться
|
||||||
|
большой текст,
|
||||||
|
занимающий несколько строк
|
||||||
|
```
|
||||||
|
|
||||||
|
Или:
|
||||||
|
```python
|
||||||
|
>>>print("Здесь может выводиться",
|
||||||
|
"большой текст,",
|
||||||
|
"занимающий несколько строк")
|
||||||
|
Здесь может выводиться большой текст, занимающий несколько строк
|
||||||
|
```
|
||||||
|
В первом случае тройные кавычки воспроизводят текст ровно так, как он был введен. Во втором случае три выводимых объекта-строки перечислены через запятую и выведены как три объекта, разделённые пробелом.
|
||||||
|
|
||||||
|
### 2.3. Вывод с использованием метода write объекта sys.stdout.
|
||||||
|
Объект stdout представляет собой поток стандартного вывода – объект, в который программы выводят символьное представление данных.
|
||||||
|
```python
|
||||||
|
>>>import sys
|
||||||
|
>>>sys.stdout.write('Функция write')
|
||||||
|
Функция write13
|
||||||
|
```
|
||||||
|
Этот метод после вывода строки не осуществляет переход на новую строку. Если это требуется, то следует в конце строки добавить один или несколько символов “\n”:
|
||||||
|
```python
|
||||||
|
>>>sys.stdout.write('Функция write\n')
|
||||||
|
Функция write
|
||||||
|
14
|
||||||
|
```
|
||||||
|
Эта функция возвращает число - количество введенных символов (\n считается за один символ)
|
||||||
|
|
||||||
|
## 3. Ввод данных с клавиатуры.
|
||||||
|
Используем стандартную функцию input:
|
||||||
|
```python
|
||||||
|
>>>psw = input('Введите пароль:')
|
||||||
|
Введите пароль:123rkn567
|
||||||
|
>>>psw
|
||||||
|
'123rkn567'
|
||||||
|
>>>type(psw)
|
||||||
|
<class 'str'>
|
||||||
|
```
|
||||||
|
input() всегда возвращает строку. Если нужна не строка, то input надо поместить внутрь функции, изменяющей тип данных. Например, int(input()).
|
||||||
|
- Пример 1
|
||||||
|
Пусть вводится число, которое должно находиться в интервале значений от 17.5 до 23.8
|
||||||
|
```python
|
||||||
|
>>>while True:
|
||||||
|
znach=float(input('Задайте коэф.усиления = '))
|
||||||
|
if znach<17.5 or znach>23.8:
|
||||||
|
print('Ошибка!')
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
Задайте коэф.усиления = 15.4
|
||||||
|
Ошибка!
|
||||||
|
Задайте коэф.усиления = 21.6
|
||||||
|
```
|
||||||
|
|
||||||
|
- Пример 2:
|
||||||
|
Ввод и обработка выражения, подлежащего расчету
|
||||||
|
```python
|
||||||
|
>>>import math
|
||||||
|
>>>print(eval(input('введите выражение для расчета = ')))
|
||||||
|
введите выражение для расчета = math.log10(23/(1+math.exp(-3.24)))
|
||||||
|
1.34504378689765
|
||||||
|
```
|
||||||
|
Введенная строка преобразуется в исполнительные инструкции с помощью eval(), далее они выполняются и результат выводится на экран.
|
||||||
|
|
||||||
|
## 4. Ввод-вывод при работе с файлами.
|
||||||
|
### 4.1. Функции для работы с путем к файлу.
|
||||||
|
Эти функции собраны в модуле os. Текущий рабочий каталог можно узнать с помощью функции os.getcwd:
|
||||||
|
```python
|
||||||
|
>>>import os
|
||||||
|
>>>os.getcwd()
|
||||||
|
'C:\\Users\\twoth\\AppData\\Local\\Programs\\Python\\Python313'
|
||||||
|
>>>Zhalnin = os.getcwd()
|
||||||
|
>>>Zhalnin # Получаем двойные бэкслэши
|
||||||
|
'C:\\Users\\twoth\\AppData\\Local\\Programs\\Python\\Python313'
|
||||||
|
>>>print(Zhalnin) # Получаем одинарные бэкслэши
|
||||||
|
C:\Users\twoth\AppData\Local\Programs\Python\Python313
|
||||||
|
>>>os.chdir("C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6")
|
||||||
|
# Смена директории
|
||||||
|
>>>os.getcwd()
|
||||||
|
'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Создание каталога (mkdir)
|
||||||
|
```python
|
||||||
|
>>>help(os.mkdir)
|
||||||
|
Help on built-in function mkdir in module nt:
|
||||||
|
|
||||||
|
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.
|
||||||
|
>>>os.chdir("C:\\test")
|
||||||
|
>>>os.mkdir("testdir")
|
||||||
|
>>>os.chdir("C:\\test\\testdir")
|
||||||
|
>>>os.getcwd()
|
||||||
|
'C:\\test\\testdir'
|
||||||
|
```
|
||||||
|
Создаем каталог, затем опускаемся на уровень ниже, чтобы проверить, что каталог создан.
|
||||||
|
|
||||||
|
- Удаление каталога (rmdir)
|
||||||
|
Для удаления каталога необходимо подняться на уровень выше.
|
||||||
|
```python
|
||||||
|
>>>os.chdir('../')
|
||||||
|
>>>os.getcwd()
|
||||||
|
'C:\\test'
|
||||||
|
>>>os.rmdir("testdir")
|
||||||
|
>>>os.rmdir("testdir") # Проверка, что директория удалена
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#14>", line 1, in <module>
|
||||||
|
os.rmdir("testdir")
|
||||||
|
FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'testdir'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Показать список всех файлов и папок, вложенных в текущую директорию (listdir)
|
||||||
|
```python
|
||||||
|
>>>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.
|
||||||
|
>>>os.chdir("C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6")
|
||||||
|
>>>os.listdir()
|
||||||
|
['.gitkeep']
|
||||||
|
```
|
||||||
|
- Проверка существования каталога (os.path.isdir)
|
||||||
|
```python
|
||||||
|
>>>help(os.path.isdir)
|
||||||
|
Help on function isdir in module genericpath:
|
||||||
|
|
||||||
|
isdir(s)
|
||||||
|
Return true if the pathname refers to an existing directory.
|
||||||
|
>>>os.chdir("C:\\Users\\twoth\\Desktop\\python-labs")
|
||||||
|
>>>os.getcwd()
|
||||||
|
'C:\\Users\\twoth\\Desktop\\python-labs'
|
||||||
|
>>>os.path.isdir("TEMA6")
|
||||||
|
True
|
||||||
|
>>>os.path.isdir("TEMA10")
|
||||||
|
False
|
||||||
|
```
|
||||||
|
|
||||||
|
- Получение символьной строки, содержащей имя файла вместе с полным путем доступа к нему с помощью функции os.path.abspath:
|
||||||
|
```python
|
||||||
|
>>>fil=os.path.abspath("oplata.dbf")
|
||||||
|
>>>fil
|
||||||
|
'С:\\test\\oplata.dbf'
|
||||||
|
>>>fil=os.path.abspath("test.txt")
|
||||||
|
>>>fil
|
||||||
|
'С:\\test\\test.txt'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Отделение из абсолютного пути только каталога/только имени файла.
|
||||||
|
```python
|
||||||
|
>>>drkt = os.path.dirname(fil)
|
||||||
|
>>>print(drkt)
|
||||||
|
С:\test
|
||||||
|
>>>bsnm = os.path.basename(fil)
|
||||||
|
>>>print(bsnm)
|
||||||
|
test.txt
|
||||||
|
```
|
||||||
|
Функция os.path.dirname() из абсолютного пути выделяется путь доступа (от диска до последней
|
||||||
|
папки). Функция os.path.basename(), наоборот, убирает из абсолютного пути все, кроме имени
|
||||||
|
файла.
|
||||||
|
|
||||||
|
|
||||||
|
- Разделение на кортеж из пути и из имени файла.
|
||||||
|
```python
|
||||||
|
>>>help(os.path.split)
|
||||||
|
Help on function split in module ntpath:
|
||||||
|
|
||||||
|
split(p)
|
||||||
|
Split a pathname.
|
||||||
|
|
||||||
|
Return tuple (head, tail) where tail is everything after the final slash.
|
||||||
|
Either part may be empty.
|
||||||
|
|
||||||
|
>>>os.path.split(fil)
|
||||||
|
('С:\\test', 'test.txt')
|
||||||
|
>>>type(os.path.split(fil))
|
||||||
|
<class 'tuple'>
|
||||||
|
```
|
||||||
|
|
||||||
|
- Проверка существования пути, заданного в символьной строке (os.path.exists).
|
||||||
|
```python
|
||||||
|
>>>os.path.exists("С:\oldest") # Такой каталог есть
|
||||||
|
True
|
||||||
|
>>>os.path.exists("С:\bsod")
|
||||||
|
True
|
||||||
|
>>>os.path.exists("С:\lab1") # Такого каталога нету
|
||||||
|
False
|
||||||
|
```
|
||||||
|
|
||||||
|
- Проверка существования файла.
|
||||||
|
```python
|
||||||
|
>>>os.path.isfile(fil)
|
||||||
|
True
|
||||||
|
>>>os.path.isfile(os.path.dirname(fil)+'fil1.txt')
|
||||||
|
False
|
||||||
|
```
|
||||||
|
Первая строка работает корректно - проверяет существование файла fil. Вторая строка содержит ошибку - неправильное объединение путей приводит к несуществующему пути.
|
||||||
|
|
||||||
|
### 4.2. Общая схема работы с файлом
|
||||||
|
Для обмена данными с файлом необходимо выполнить следующие операции:
|
||||||
|
- Открытие файла с указанием его имени и цели (чтение, запись, добавление данных);
|
||||||
|
- Выполнение одной или нескольких операций обмена данными с файлом;
|
||||||
|
- Закрытие файла.
|
||||||
|
|
||||||
|
### 4.3. Открытие файла для записи или чтения данных – функция open.
|
||||||
|
```python
|
||||||
|
>>>fp = open(file = drkt+'\\zapis1.txt', mode = 'w')
|
||||||
|
>>>type(fp)
|
||||||
|
<class '_io.TextIOWrapper'>
|
||||||
|
>>>fp
|
||||||
|
<_io.TextIOWrapper name='C:\\test\\zapis1.txt' mode='w' encoding='cp1251'>
|
||||||
|
```
|
||||||
|
Здесь fp – это файловый объект, который в других языках программирования обычно называют файловой переменной. Он сохраняет ссылку на открываемый файл и позволяет в дальнейшем ссылаться на файл, не указывая путь и имя открытого файла. В аргументе функции с именем file указывается путь и имя открываемого файла, а в аргументе с именем mode – предполагаемая цель его использования (w=write – для записи).
|
||||||
|
|
||||||
|
Аргументы функции с их именами могут располагаться в любом порядке. Если имя файла располагается на месте первого аргумента, а цель использования – на втором, то имена аргументов можно не указывать и просто вводить:
|
||||||
|
```python
|
||||||
|
>>>fp = open(drkt+'\\zapis1.txt', 'w')
|
||||||
|
>>>fp
|
||||||
|
<_io.TextIOWrapper name='C:\\test\\zapis1.txt' mode='w' encoding='cp1251'>
|
||||||
|
```
|
||||||
|
|
||||||
|
Если путь в переменной drkt совпадает с рабочим каталогом, то его можно опустить, оставив только имя открываемого файла:
|
||||||
|
```python
|
||||||
|
>>>fp = open('zapis1.txt', 'w')
|
||||||
|
>>>fp
|
||||||
|
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
|
||||||
|
>>>type(fp)
|
||||||
|
<class '_io.TextIOWrapper'>
|
||||||
|
>>>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']
|
||||||
|
```
|
||||||
|
|
||||||
|
Если требуются другие операции с открываемым файлом, то для второго аргумента «mode=…» могут быть заданы следующие значения:
|
||||||
|
w – запись с созданием нового файла или перезапись существующего файла,
|
||||||
|
w+ - чтение и запись/перезапись файла,
|
||||||
|
r – только чтение (это значение - по умолчанию),
|
||||||
|
r+ - чтение и/или запись в существующий файл,
|
||||||
|
a – запись в конец существующего файла или, если его нет, запись с созданием файла,
|
||||||
|
a+ - то же, что и в «a», но с возможностью чтения из файла.
|
||||||
|
В зависимости от значения этого аргумента тип создаваемой файловой переменной может быть разным.
|
||||||
|
При открытии бинарного файла к указанным выше буквам надо добавить символ «b»
|
||||||
|
Пример открытия бинарного файла:
|
||||||
|
```python
|
||||||
|
>>>fp1 = open(drkt+'\\zapis2.bin', mode = 'wb+')
|
||||||
|
>>>fp1
|
||||||
|
<_io.BufferedRandom name='C:\\test\\zapis2.bin'>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4. Закрытие файла.
|
||||||
|
```python
|
||||||
|
>>>fp.close()
|
||||||
|
>>>fp
|
||||||
|
<_io.TextIOWrapper name='zapis1.txt' mode='w' encoding='cp1251'>
|
||||||
|
```
|
||||||
|
После закрытия на объект все еще можно посмотреть.
|
||||||
|
|
||||||
|
### 4.5. Запись информации в файл с помощью метода write.
|
||||||
|
Метод write относится к объекту – файловой переменной.
|
||||||
|
Создание списка с элементами-числами от 1 до 12 и запись их в файл по 4 числа на строке:
|
||||||
|
```python
|
||||||
|
>>>sps = list(range(1, 13))
|
||||||
|
>>>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]
|
||||||
|
|
||||||
|
Создание списка с элементами-списками:
|
||||||
|
```python
|
||||||
|
>>>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)
|
||||||
|
11
|
||||||
|
11
|
||||||
|
12
|
||||||
|
>>>fp3.close()
|
||||||
|
```
|
||||||
|
Файл в текстовом редакторе:
|
||||||
|
Иванов И. 1Петров П. 2Сидоров С. 3 - Видно, что вывод в файл получился некачественный
|
||||||
|
|
||||||
|
Попробуем изменить код:
|
||||||
|
```python
|
||||||
|
>>>gh=open('zapis5.txt','w')
|
||||||
|
>>>for r in sps3:
|
||||||
|
gh.write(r[0] + ' '+str(r[1]) + '\n')
|
||||||
|
12
|
||||||
|
12
|
||||||
|
13
|
||||||
|
for r in sps3: gh.write(r[0]+' '+str(r[1])+'\n')
|
||||||
|
12
|
||||||
|
12
|
||||||
|
13
|
||||||
|
gh.close()
|
||||||
|
```
|
||||||
|
Добавился перенос на следующую строку на каждой итерации цикла и пробел в нужном месте. Результат:
|
||||||
|
|
||||||
|
Иванов И. 1
|
||||||
|
Петров П. 2
|
||||||
|
Сидоров С. 3
|
||||||
|
|
||||||
|
### 4.6. Первый способ чтения информации из текстового файла.
|
||||||
|
```python
|
||||||
|
>>>sps1 = []
|
||||||
|
>>>fp = open('zapis3.txt')
|
||||||
|
>>>for stroka in fp:
|
||||||
|
stroka=stroka.rstrip('\n')
|
||||||
|
stroka=stroka.replace('[','')
|
||||||
|
stroka=stroka.replace(']','')
|
||||||
|
sps1=sps1+stroka.split(',') # В этой строке целые числа превращаются в строки
|
||||||
|
>>>fp.close()
|
||||||
|
print(sps1)
|
||||||
|
['1', ' 2', ' 3', ' 4', '5', ' 6', ' 7', ' 8', '9', ' 10', ' 11', ' 12']
|
||||||
|
```
|
||||||
|
Здесь, перед занесением строки в список с помощью метода rstrip, из неё удаляется символ конца строки, а с помощью метода replace – скобки.
|
||||||
|
Заметно, что полученный список отличается от исходного sps типом данных. В sps1 заметна некорректность работы программы(остались лишние пробелы).
|
||||||
|
Способ преобразования sps1 в sps:
|
||||||
|
```python
|
||||||
|
>>>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.
|
||||||
|
Метод read, как и write, относится к объекту – файловой переменной. В качестве аргумента этого метода может задаваться целое число – количество символов или, если открыт бинарный файл, - количество байт, которое должно быть прочитано, соответственно, из текстового или бинарного файла, начиная с текущего положения маркера. Если указанное число превышает количество оставшихся символов (байт) в файле, то считываются все оставшиеся символы (байты). Если это число не указано, то считываются вся информация от маркера до конца файла. Метод возвращает строку с символами или совокупность байт, прочитанных из файла.
|
||||||
|
```python
|
||||||
|
>>>fp = open('zapis3.txt')
|
||||||
|
>>>stroka1 = fp.read(12) # Чтение первых 12 символов(байт), курсор остановится на 13-ом (/n)
|
||||||
|
>>>stroka2 = fp.read() # Чтение всех оставшихся символов вплоть до EOF
|
||||||
|
>>>fp.close()
|
||||||
|
>>>print(stroka1)
|
||||||
|
[1, 2, 3, 4]
|
||||||
|
>>>print(stroka2)
|
||||||
|
[5, 6, 7, 8]
|
||||||
|
[9, 10, 11, 12]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.8. Чтение информации с помощью методов readline и readlines.
|
||||||
|
Эти методы позволяют прочитать из файла, начиная с текущего положения маркера, соответственно, одну строку символов (совокупность байт) или все строки (все байты).
|
||||||
|
```python
|
||||||
|
>>>file = open("zapis5.txt")
|
||||||
|
>>>file.readline()
|
||||||
|
'Иванов И. 1\n'
|
||||||
|
>>>file.close()
|
||||||
|
>>>file = open("zapis5.txt")
|
||||||
|
>>>file.readlines()
|
||||||
|
['Иванов И. 1\n', 'Петров П. 2\n', 'Сидоров С. 3\n']
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 4.9. Ввод-вывод объектов с использованием функций из модуля pickle.
|
||||||
|
```python
|
||||||
|
>>>import pickle
|
||||||
|
>>>mnoz1={'pen','book','pen','iPhone','table','book'} #Объект типа «множество»
|
||||||
|
>>>fp=open('zapis6.mnz','wb') # Бинарный файл – на запись
|
||||||
|
>>>pickle.dump(mnoz1,fp) #dump – метод записи объекта в файл
|
||||||
|
>>>fp.close()
|
||||||
|
```
|
||||||
|
|
||||||
|
Запись, произведенная в файл:
|
||||||
|
耄锣 鐨谅瑡扬斔谄扯潫钌٩偨潮斔调灥溔逮
|
||||||
|
Байты в этом файле не предназначены для текстового представления. Они могут содержать символы, которые не могут быть корректно интерпретированы в рамках текстовой кодировки.
|
||||||
|
|
||||||
|
Теперь прочитаем данные из файла в объект mnoz2:
|
||||||
|
```python
|
||||||
|
>>>fp=open('zapis6.mnz','rb')
|
||||||
|
>>>mnoz2=pickle.load(fp) #load – метод чтения объекта из бинарного файла
|
||||||
|
>>>fp.close()
|
||||||
|
>>>print(mnoz2)
|
||||||
|
{'table', 'book', 'iPhone', 'pen'}
|
||||||
|
>>>print(mnoz1)
|
||||||
|
{'table', 'book', 'iPhone', 'pen'}
|
||||||
|
>>>mnoz1 == mnoz2
|
||||||
|
True
|
||||||
|
```
|
||||||
|
mnoz1 не совпадает с изначально заданным mnoz1, потому что данный тип объекта исключает повторяющиеся элементы.
|
||||||
|
|
||||||
|
С использованием тех же функций запишем в файл, а затем прочитаем два объекта разных типов: то же множество mnoz1 и ранее созданный список sps3. При считывании объекты извлекаются из файла в той же последовательности, в которой они в него записывались.
|
||||||
|
```python
|
||||||
|
>>>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()
|
||||||
|
>>>print(obj1)
|
||||||
|
{'table', 'book', 'iPhone', 'pen'}
|
||||||
|
>>>print(obj2)
|
||||||
|
[['Иванов И.', 1], ['Петров П.', 2], ['Сидоров С.', 3]]
|
||||||
|
>>>mnoz1 == obj1
|
||||||
|
True
|
||||||
|
>>>sps3 == obj2
|
||||||
|
True
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Перенаправление потоков ввода и вывода данных.
|
||||||
|
sys.stdin — поток ввода
|
||||||
|
sys.stdout — поток вывода
|
||||||
|
sys.stderr — поток ошибок
|
||||||
|
```python
|
||||||
|
>>>import sys
|
||||||
|
>>>vr_out = sys.stdout #Запоминаем текущий поток вывода
|
||||||
|
>>>fc = open('Stroka.txt', 'w') #Откроем файл вывода
|
||||||
|
>>>sys.stdout = fc #Перенацеливаем стандартный поток вывода на файл
|
||||||
|
>>>print('запись строки в файл') #Вывод теперь будет не на экран, а в файл
|
||||||
|
>>>sys.stdout=vr_out #Восстановление текущего потока
|
||||||
|
>>>print('запись строки на экран') #Убеждаемся, что вывод на экран восстановился
|
||||||
|
запись строки на экран
|
||||||
|
>>>fc.close
|
||||||
|
<built-in method close of _io.TextIOWrapper object at 0x00000232E4FDA330>
|
||||||
|
```
|
||||||
|
В файле Stroka.txt находится: запись строки в файл
|
||||||
|
|
||||||
|
Точно также можно перенаправить поток ввода – sys.stdin – вместо клавиатуры – из файла.
|
||||||
|
```python
|
||||||
|
>>> 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:
|
||||||
|
line = input() #Считываем из файла строку
|
||||||
|
print(line) # Отображаем считанное
|
||||||
|
except EOFError:
|
||||||
|
break
|
||||||
|
запись строки в файл
|
||||||
|
>>> fd.close()
|
||||||
|
>>> sys.stdin = tmp_in #Возвращение стандартного назначения для потока ввода
|
||||||
|
```
|
||||||
|
Ошибка "EOFError: EOF when reading a line" возникает, когда программа ожидает чтения строки из входного потока, но вместо этого достигает конца файла (EOF), что означает, что необходимые данные отсутствуют.
|
||||||
|
## 6. Завершение сеанса в среде IDLE
|
||||||
77
TEMA6/task.md
Обычный файл
@@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
Жалнин Вадим, А-01-23
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
Придумайте инструкции и запишите их в файл с расширением .py , которые выполняют следующие операции:
|
||||||
|
1. Создаётся объект-кортеж со 125 целыми случайными числами из диапазона от 6 до 56, представленными в виде символьных строк.
|
||||||
|
2. Создаётся объект-список с вашей фамилией и 4 фамилиями ваших одноклассников.
|
||||||
|
3. Записывается кортеж в бинарный файл.
|
||||||
|
4. Записывается в этот же файл список и закрывается файл.
|
||||||
|
5. Открывается этот файл для чтения и считывает из него данные в 2 новых объекта.
|
||||||
|
6. Проверяется на совпадение новых объектов с исходными и выводится соответствующее сообщение.
|
||||||
|
7. Разделяется кортеж на совокупности по 5 чисел в каждой и они записываются в виде отдельных списков со своими именами.
|
||||||
|
|
||||||
|
## Выполнение
|
||||||
|
|
||||||
|
1. Создание кортежа
|
||||||
|
```python
|
||||||
|
>>> #1
|
||||||
|
>>>
|
||||||
|
>>> import random
|
||||||
|
>>> kort = tuple([str(random.randint(6, 56)) for i in range(125)])
|
||||||
|
>>> kort
|
||||||
|
('12', '34', '27', '28', '19', '38', '47', '26', '43', '32', '50', '22', '18', '15', '41', '37', '21', '37', '41', '26', '33', '55', '41', '19', '23', '11', '39', '10', '50', '56', '14', '14', '14', '43', '38', '7', '52', '24', '6', '18', '12', '31', '48', '16', '41', '19', '47', '42', '31', '20', '50', '53', '7', '41', '20', '10', '46', '44', '50', '12', '40', '13', '33', '26', '37', '55', '41', '16', '29', '36', '12', '34', '49', '31', '45', '34', '40', '54', '51', '6', '22', '53', '30', '16', '12', '46', '38', '8', '48', '47', '21', '34', '30', '54', '9', '49', '7', '12', '39', '44', '27', '50', '31', '36', '20', '24', '43', '36', '46', '37', '9', '42', '32', '8', '25', '19', '13', '39', '30', '22', '19', '20', '16', '23', '37')
|
||||||
|
>>> len(kort)
|
||||||
|
125
|
||||||
|
>>>
|
||||||
|
>>> #2
|
||||||
|
>>>
|
||||||
|
>>> lastnames = ["Zhalnin", "Khokhlov", "Troyanov", "Zheleznov", "Knyazev"]
|
||||||
|
>>>
|
||||||
|
>>> #3
|
||||||
|
>>>
|
||||||
|
>>> import os, pickle
|
||||||
|
>>> os.chdir("C:\\Users\\twoth\\Desktop\\python-labs\\TEMA6")
|
||||||
|
>>> fp = open("binary.bin", "wb")
|
||||||
|
>>> pickle.dump(kort, fp)
|
||||||
|
>>>
|
||||||
|
>>> #4
|
||||||
|
>>>
|
||||||
|
>>> pickle.dump(lastnames, fp)
|
||||||
|
>>> fp.close()
|
||||||
|
>>>
|
||||||
|
>>> #5
|
||||||
|
>>>
|
||||||
|
>>> fp = open("binary.bin", "rb")
|
||||||
|
>>> newKort = pickle.load(fp)
|
||||||
|
>>> newList = pickle.load(fp)
|
||||||
|
>>> newKort
|
||||||
|
('12', '34', '27', '28', '19', '38', '47', '26', '43', '32', '50', '22', '18', '15', '41', '37', '21', '37', '41', '26', '33', '55', '41', '19', '23', '11', '39', '10', '50', '56', '14', '14', '14', '43', '38', '7', '52', '24', '6', '18', '12', '31', '48', '16', '41', '19', '47', '42', '31', '20', '50', '53', '7', '41', '20', '10', '46', '44', '50', '12', '40', '13', '33', '26', '37', '55', '41', '16', '29', '36', '12', '34', '49', '31', '45', '34', '40', '54', '51', '6', '22', '53', '30', '16', '12', '46', '38', '8', '48', '47', '21', '34', '30', '54', '9', '49', '7', '12', '39', '44', '27', '50', '31', '36', '20', '24', '43', '36', '46', '37', '9', '42', '32', '8', '25', '19', '13', '39', '30', '22', '19', '20', '16', '23', '37')
|
||||||
|
>>> newList
|
||||||
|
["Zhalnin", "Khokhlov", "Troyanov", "Zheleznov", "Knyazev"]
|
||||||
|
>>> fp.close()
|
||||||
|
>>>
|
||||||
|
>>> #6
|
||||||
|
>>>
|
||||||
|
>>> if (newKort == kort): print("Кортежи совпадают")
|
||||||
|
>>> else: print("Кортежи не совпадают")
|
||||||
|
Кортежи совпадают
|
||||||
|
>>> if (newList == lastnames): print("Списки совпадают")
|
||||||
|
>>> else: print("Списки не совпадают")
|
||||||
|
Списки совпадают
|
||||||
|
>>>
|
||||||
|
>>> #7
|
||||||
|
>>>
|
||||||
|
>>> for i in range(0,125,5):
|
||||||
|
exec('list' + str(i//5+1) + ' = ' + str(list(kort[i:i+5])))
|
||||||
|
>>> list1
|
||||||
|
['12', '34', '27', '28', '19']
|
||||||
|
>>> list2
|
||||||
|
['38', '47', '26', '43', '32']
|
||||||
|
>>> list25
|
||||||
|
['19', '20', '16', '23', '37']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
73
TEMA6/test.md
Обычный файл
@@ -0,0 +1,73 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
M2_6
|
||||||
|
|
||||||
|
1) Создайте список с 50 целыми числами из интервала значений от 12 с шагом 4. Создайте кортеж с 25 числами, случайно отобранными из списка.
|
||||||
|
|
||||||
|
2) Выведите элементы кортежа в текстовый файл по 5 чисел в строке с разделителем -"запятая". Имя файла выберите сами.
|
||||||
|
|
||||||
|
3) Удалите из памяти ранее созданные список и кортеж.
|
||||||
|
|
||||||
|
4) Прочитайте данные из файла с записью их в кортеж. Отобразите кортеж на экране по 5 чисел в строке.
|
||||||
|
|
||||||
|
5) По значениям кортежа рассчитайте число элементов, не превышающих пороговое значение, запрашиваемое у пользователя, и число элементов, больше этого значения. Отобразите результат одной строкой на экране.
|
||||||
|
|
||||||
|
## Решение:
|
||||||
|
|
||||||
|
```python
|
||||||
|
import random
|
||||||
|
|
||||||
|
spisok = [12 + 4 * i for i in range(50)]
|
||||||
|
|
||||||
|
kortezh = tuple(random.sample(spisok, 25))
|
||||||
|
|
||||||
|
with open("chiselki.txt", "w") as fp:
|
||||||
|
|
||||||
|
for i in range(0, 25, 5):
|
||||||
|
|
||||||
|
fp.write(f"{kortezh[i]},{kortezh[i+1]},{kortezh[i+2]},{kortezh[i+3]},{kortezh[i+4]}\n")
|
||||||
|
|
||||||
|
del spisok
|
||||||
|
|
||||||
|
del kortezh
|
||||||
|
|
||||||
|
new_kortezh = []
|
||||||
|
|
||||||
|
with open('chiselki.txt', 'r') as fp:
|
||||||
|
|
||||||
|
for line in fp:
|
||||||
|
|
||||||
|
numbers = [int(x) for x in line.strip().split(',')]
|
||||||
|
|
||||||
|
new_kortezh.extend(numbers)
|
||||||
|
|
||||||
|
new_kortezh = tuple(new_kortezh)
|
||||||
|
|
||||||
|
for i in range(0, len(new_kortezh), 5):
|
||||||
|
|
||||||
|
print(new_kortezh[i:i+5])
|
||||||
|
|
||||||
|
porog = input("Введите пороговое значение: ")
|
||||||
|
|
||||||
|
if porog.isdigit():
|
||||||
|
|
||||||
|
porog = int(porog)
|
||||||
|
|
||||||
|
menshe_ravno = sum(1 for x in new_kortezh if x <= porog)
|
||||||
|
|
||||||
|
bolshe = sum(1 for x in new_kortezh if x > porog)
|
||||||
|
|
||||||
|
print(f"Элементов ≤ {porog}: {menshe_ravno}, элементов > {porog}: {bolshe}")
|
||||||
|
```
|
||||||
|
|
||||||
|
терминал:
|
||||||
|
```
|
||||||
|
PS C:\work> C:\Users\twoth\AppData\Local\Programs\Python\Python313\python.exe c:/work/importtime.py
|
||||||
|
(100, 92, 60, 20, 112)
|
||||||
|
(80, 204, 120, 116, 152)
|
||||||
|
(28, 16, 44, 176, 68)
|
||||||
|
(208, 24, 52, 64, 108)
|
||||||
|
(56, 88, 128, 40, 172)
|
||||||
|
Введите пороговое значение: 25
|
||||||
|
Элементов ≤ 25: 3, элементов > 25: 22
|
||||||
|
PS C:\work>
|
||||||
|
```
|
||||||
Двоичные данные
TEMA7/Figure_1.png
Обычный файл
|
После Ширина: | Высота: | Размер: 18 KiB |
Двоичные данные
TEMA7/Figure_2.png
Обычный файл
|
После Ширина: | Высота: | Размер: 34 KiB |
Двоичные данные
TEMA7/Figure_3.png
Обычный файл
|
После Ширина: | Высота: | Размер: 13 KiB |
606
TEMA7/report.md
Обычный файл
@@ -0,0 +1,606 @@
|
|||||||
|
|
||||||
|
Жалнин Вадим, А-01-23
|
||||||
|
|
||||||
|
# 1. Запуск интерактивной оболочки IDLE
|
||||||
|
|
||||||
|
# 2. Создание пользовательской функции
|
||||||
|
|
||||||
|
Создание функции предполагает выполнение трех операций: формирование функции, ее сохранение и использование.
|
||||||
|
В общем виде функция в языке Python представляется так:
|
||||||
|
def <Имя функции>([<Список аргументов >]):
|
||||||
|
[<отступы>"""<Комментарий по назначению функции>"""]
|
||||||
|
<отступы><Блок инструкций – тело функции>
|
||||||
|
[<отступы>return <Значение или вычисляемое выражение>]
|
||||||
|
|
||||||
|
# 2.1 Функция без аргументов
|
||||||
|
```python
|
||||||
|
ef uspeh():
|
||||||
|
"""Подтверждение успеха операции"""
|
||||||
|
print('Выполнено успешно!')
|
||||||
|
|
||||||
|
uspeh()
|
||||||
|
Выполнено успешно!
|
||||||
|
dir(uspeh)
|
||||||
|
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__']
|
||||||
|
type(uspeh)
|
||||||
|
<class 'function'>
|
||||||
|
help(uspeh)
|
||||||
|
Help on function uspeh in module __main__:
|
||||||
|
|
||||||
|
uspeh()
|
||||||
|
Подтверждение успеха операции
|
||||||
|
```
|
||||||
|
Функция uspeh не принимает аргументов и просто выводит сообщение.
|
||||||
|
## 2.2 Функция с аргументами
|
||||||
|
```python
|
||||||
|
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
|
||||||
|
sravnenie("abc", "abcd")
|
||||||
|
abc меньше abcd
|
||||||
|
```
|
||||||
|
Функция универсальна и будет работать с любыми типами данных, для которых определены операторы сравнения >, <, == (числа, строки, списки, кортежи) Сравнение строк происходит по алфавиту, так же значение имеет регистр букв (заглавные меньше строчных), более короткая строка считается меньшей.
|
||||||
|
|
||||||
|
|
||||||
|
## 2.3 Пример функции, содержащей return.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def logistfun(b,a):
|
||||||
|
"""Вычисление логистической функции"""
|
||||||
|
import math
|
||||||
|
return a/(1+math.exp(-b))
|
||||||
|
|
||||||
|
|
||||||
|
v,w=1,0.7;z=logistfun(w,v)
|
||||||
|
z
|
||||||
|
0.6681877721681662
|
||||||
|
```
|
||||||
|
Функция logistfun возвращает значение, которое можно сохранить в переменную или использовать в других вычислениях.
|
||||||
|
## 2.4 Сложение для разных типов аргументов
|
||||||
|
|
||||||
|
```python
|
||||||
|
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]
|
||||||
|
t1 = (1, 2); t2 = (3, 4); t3 = (5,); t4 = (6, 7, 8)
|
||||||
|
slozh(t1, t2, t3, t4)
|
||||||
|
(1, 2, 3, 4, 5, 6, 7, 8)
|
||||||
|
d1 = {'a': 1}; d2 = {'b': 2}
|
||||||
|
slozh(d1, d2, {}, {})
|
||||||
|
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
|
||||||
|
s1 = {1, 2}; s2 = {2, 3}
|
||||||
|
slozh(s1, s2, set(), set())
|
||||||
|
TypeError: unsupported operand type(s) for +: 'set' and 'set'
|
||||||
|
```
|
||||||
|
Сложение для множеств и словарей неприменимо. Функция работает только для тех типов данных, которые поддерживают оператор суммирования.
|
||||||
|
|
||||||
|
## 2.5 Функция, реализующая модель некоторого устройства, на вход которого в текущий момент поступает сигнал х, на выходе получается сигнал y:
|
||||||
|
|
||||||
|
```python
|
||||||
|
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 matplotlib.pyplot as plt
|
||||||
|
plt.plot(sps, 'r-', label='Вход')
|
||||||
|
[<matplotlib.lines.Line2D object at 0x000001B544DC4E10>]
|
||||||
|
plt.plot(spsy, 'b-', label='Выход')
|
||||||
|
[<matplotlib.lines.Line2D object at 0x000001B544DF5090>]
|
||||||
|
plt.grid(True)
|
||||||
|
plt.legend()
|
||||||
|
<matplotlib.legend.Legend object at 0x000001B544DD1E80>
|
||||||
|
plt.show()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Функция моделирует инерционное звено. Она использует предыдущее значение выхода ypred для расчета текущего значения.
|
||||||
|
# 3. Функции как объекты
|
||||||
|
|
||||||
|
## 3.1 Получение списка атрибутов объекта-функции
|
||||||
|
|
||||||
|
```python
|
||||||
|
dir(inerz)
|
||||||
|
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__']
|
||||||
|
inerz.__doc__
|
||||||
|
'Модель устройства с памятью:\nx- текущее значение вх.сигнала,\n T -постоянная времени,\n ypred - предыдущее значение выхода устройства'
|
||||||
|
help(inerz)
|
||||||
|
Help on function inerz in module __main__:
|
||||||
|
|
||||||
|
inerz(x, T, ypred)
|
||||||
|
Модель устройства с памятью:
|
||||||
|
x- текущее значение вх.сигнала,
|
||||||
|
T -постоянная времени,
|
||||||
|
ypred - предыдущее значение выхода устройства
|
||||||
|
```
|
||||||
|
Атрибут __doc__ содержит значение docstring, если при инициализации функции он был задан. Если не был, то inerz.__doc__ будет иметь значение None.
|
||||||
|
|
||||||
|
## 3.2 Сохранение ссылки на объект-функции в другой переменной
|
||||||
|
|
||||||
|
```python
|
||||||
|
fnkt=sravnenie
|
||||||
|
v=16
|
||||||
|
fnkt(v,23)
|
||||||
|
16 меньше 23
|
||||||
|
```
|
||||||
|
|
||||||
|
Функции можно передавать в переменные, как и любые другие объекты. После этого переменная fnkt ссылается на ту же самую функцию, что и sravnenie.
|
||||||
|
|
||||||
|
## 3.3 Возможность альтернативного определения функции в программе
|
||||||
|
|
||||||
|
```python
|
||||||
|
typ_fun=8
|
||||||
|
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 Возможность использования функции в качестве аргумента другой функции
|
||||||
|
|
||||||
|
```python
|
||||||
|
def fun_arg(fff,a,b,c):
|
||||||
|
"""fff-имя функции, используемой
|
||||||
|
в качестве аргумента функции fun_arg"""
|
||||||
|
return a+fff(c,b)
|
||||||
|
|
||||||
|
zz=fun_arg(logistfun,-3,1,0.7)
|
||||||
|
zz
|
||||||
|
-2.3318122278318336
|
||||||
|
```
|
||||||
|
|
||||||
|
Python передаёт ссылку на объект функции logistfun в переменную fff.
|
||||||
|
|
||||||
|
## 4.2 Обязательные и необязательные аргументы
|
||||||
|
|
||||||
|
```python
|
||||||
|
def logistfun(a,b=1): #Аргумент b – необязательный; значение по умолчанию=1
|
||||||
|
"""Вычисление логистической функции"""
|
||||||
|
import math
|
||||||
|
return b/(1+math.exp(-a))
|
||||||
|
|
||||||
|
logistfun(0.7) #Вычисление со значением b по умолчанию
|
||||||
|
0.6681877721681662
|
||||||
|
logistfun(0.7,2) #Вычисление с заданным значением b
|
||||||
|
1.3363755443363323
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.3 Возможность обращения к функции с произвольным (непозиционным) расположением аргументов.
|
||||||
|
При этом надо в обращении к функции указывать имена аргументов.
|
||||||
|
|
||||||
|
```python
|
||||||
|
logistfun(b=0.5,a=0.8) # Ссылки на аргументы поменялись местами
|
||||||
|
0.34498724056380625
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.4 Пример со значениями аргументов функции, содержащимися в списке или кортеже
|
||||||
|
|
||||||
|
```python
|
||||||
|
b1234=[b1,b2,b3,b4] # Список списков из п.2.4
|
||||||
|
qq=slozh(*b1234) #Перед ссылкой на список или кортеж надо ставить звездочку
|
||||||
|
qq
|
||||||
|
[1, 2, -1, -2, 0, 2, -1, -1]
|
||||||
|
```
|
||||||
|
Количество элементов в списке должно совпадать с количеством параметров функции. Оператор * выполняет распаковку списка в аргументы функции. (Эквивалентно вызову: slozh(b1, b2, b3, b4))
|
||||||
|
|
||||||
|
## 4.5 Пример со значениями аргументов функции, содержащимися в словаре
|
||||||
|
|
||||||
|
```python
|
||||||
|
dic4={"a1":1,"a2":2,"a3":3,"a4":4}
|
||||||
|
qqq=slozh(**dic4) #Перед ссылкой на словарь надо ставить две звездочки
|
||||||
|
qqq
|
||||||
|
10
|
||||||
|
slozh(*dic4)
|
||||||
|
'a1a2a3a4'
|
||||||
|
```
|
||||||
|
Для ** распаковки имена ключей должны точно совпадать с именами параметров функции
|
||||||
|
Эквивалентно вызову: slozh(a1=1, a2=2, a3=3, a4=4)
|
||||||
|
|
||||||
|
## 4.6 Смешанные ссылки
|
||||||
|
|
||||||
|
```python
|
||||||
|
e1=(-1,6);dd2={'a3':3,'a4':9}
|
||||||
|
qqqq=slozh(*e1,**dd2)
|
||||||
|
qqqq
|
||||||
|
17
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.7 Переменное число аргументов у функции
|
||||||
|
|
||||||
|
```python
|
||||||
|
def func4(*kort7):
|
||||||
|
"""Произвольное число аргументов в составе кортежа"""
|
||||||
|
smm=0
|
||||||
|
for elt in kort7:
|
||||||
|
smm+=elt
|
||||||
|
return smm
|
||||||
|
|
||||||
|
func4(-1,2) #Обращение к функции с 2 аргументами
|
||||||
|
1
|
||||||
|
func4(-1,2,0,3,6) #Обращение к функции с 5 аргументами
|
||||||
|
10
|
||||||
|
```
|
||||||
|
Функция принимает любое количество аргументов
|
||||||
|
|
||||||
|
## 4.8 Комбинация аргументов
|
||||||
|
|
||||||
|
```python
|
||||||
|
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
|
||||||
|
```
|
||||||
|
a = -1 (первый позиционный)
|
||||||
|
b = 2 (второй позиционный, переопределил значение по умолчанию 7)
|
||||||
|
*kort7 = (0, 3, 6) (все остальные аргументы в кортеж)
|
||||||
|
Если мы не хотим передавать b, придется переопределить функцию так, чтобы именованный параметр b был в конце, а позиционный кортеж - перед ним.
|
||||||
|
|
||||||
|
Подобным же образом в списке аргументов функции также можно использовать словарь.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def func5(a, b=7, *args, **kwargs):
|
||||||
|
"""a-позиционный, b-по умолчанию, *args-кортеж, **kwargs-словарь"""
|
||||||
|
print("a=" + str(a) + ", b=" + str(b))
|
||||||
|
print("args=" + str(args))
|
||||||
|
print("kwargs=" + str(kwargs))
|
||||||
|
|
||||||
|
total = a + b + sum(args)
|
||||||
|
for value in kwargs.values():
|
||||||
|
total += value
|
||||||
|
return total
|
||||||
|
|
||||||
|
result = func5(1, 2, 3, 4, x=5, y=6)
|
||||||
|
a=1, b=2
|
||||||
|
args=(3, 4)
|
||||||
|
kwargs={'x': 5, 'y': 6}
|
||||||
|
result
|
||||||
|
21
|
||||||
|
```
|
||||||
|
*args и **kwargs - способы передать не уточненное заранее число элементов:
|
||||||
|
*args — переменное количество позиционных аргументов. Переданные с одной звездочкой аргументы собираются в кортеж.
|
||||||
|
**kwargs — переменное количество именованных аргументов. Все переданные аргументы, которые указываются по имени, собираются в словарь.
|
||||||
|
*args всегда должно идти перед **kwargs.
|
||||||
|
|
||||||
|
## 4.9 Изменение значений объектов, используемых в качестве аргументов функции.
|
||||||
|
Такое изменение возможно только у объектов изменяемого типа
|
||||||
|
|
||||||
|
```python
|
||||||
|
a=90 # Числовой объект – не изменяемый тип
|
||||||
|
def func3(b):
|
||||||
|
b=5*b+67
|
||||||
|
|
||||||
|
func3(a)
|
||||||
|
a
|
||||||
|
90
|
||||||
|
```
|
||||||
|
Локальная b меняется, но внешняя a нет
|
||||||
|
|
||||||
|
Пример со списком:
|
||||||
|
|
||||||
|
```python
|
||||||
|
sps1=[1,2,3,4] #Список – изменяемый тип объекта
|
||||||
|
def func2(sps):
|
||||||
|
sps[1]=99
|
||||||
|
|
||||||
|
func2(sps1)
|
||||||
|
sps1
|
||||||
|
[1, 99, 3, 4]
|
||||||
|
```
|
||||||
|
Изменяемые типы (списки, словари, множества) передаются по ссылке
|
||||||
|
|
||||||
|
Пример с кортежем:
|
||||||
|
|
||||||
|
```python
|
||||||
|
kort=(1,2,3,4) #Кортеж – неизменяемый тип объекта
|
||||||
|
func2(kort)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#78>", line 1, in <module>
|
||||||
|
func2(kort)
|
||||||
|
File "<pyshell#74>", line 2, in func2
|
||||||
|
sps[1]=99
|
||||||
|
TypeError: 'tuple' object does not support item assignment
|
||||||
|
```
|
||||||
|
|
||||||
|
Кортеж - неизменяемый тип данных, так что переназначение в таком виде не работает.
|
||||||
|
|
||||||
|
# 5. Специальные типы пользовательских функций
|
||||||
|
|
||||||
|
## 5.1 Анонимные функции
|
||||||
|
|
||||||
|
Анонимные функции или по-другому их называют лямбда-функциями – это функции без имени, определяемые по следующей схеме:
|
||||||
|
lambda [<Аргумент1>[,<Аргумент2>,…]]:<Возвращаемое значение или выражение>
|
||||||
|
Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import math
|
||||||
|
anfun1=lambda: 1.5+math.log10(17.23) #Анонимная функция без аргументов
|
||||||
|
anfun1() # Обращение к объекту-функции
|
||||||
|
2.7362852774480286
|
||||||
|
anfun2=lambda a,b : a+math.log10(b) #Анонимная функция с 2 аргументами
|
||||||
|
anfun2(17,234)
|
||||||
|
19.369215857410143
|
||||||
|
anfun3=lambda a,b=234: a+math.log10(b) #Функция с необязательным вторым аргументом
|
||||||
|
anfun3(100)
|
||||||
|
102.36921585741014
|
||||||
|
```
|
||||||
|
Вызов лямбда-функции создает объект класса "функция". Внутри лямбда-функции не могут использоваться многострочные выражения, нельзя использовать if-else.
|
||||||
|
|
||||||
|
## 5.2 Функции-генераторы
|
||||||
|
|
||||||
|
Это – такие функции, которые используются в итерационных процессах, позволяя на каждой итерации получать одно из значений. Для этого в функцию включают инструкцию yield приостанавливающую её выполнение и возвращающую очередное значение.
|
||||||
|
Данный оператор в отличие от return не останавливает полностью выполнение программы. Когда выполнение функции возобновляется после yield, оно продолжается с того места, где было
|
||||||
|
приостановлено, до следующего оператора yield (или до конца функции).
|
||||||
|
|
||||||
|
```python
|
||||||
|
def func5(diap,shag):
|
||||||
|
""" Итератор, возвращающий значения
|
||||||
|
из диапазона от 1 до diap с шагом shag"""
|
||||||
|
for j in range(1,diap+1,shag):
|
||||||
|
yield j
|
||||||
|
|
||||||
|
for mm in func5(7,3):
|
||||||
|
print(mm)
|
||||||
|
|
||||||
|
1
|
||||||
|
4
|
||||||
|
7
|
||||||
|
alp=func5(7,3)
|
||||||
|
print(alp.__next__())
|
||||||
|
1
|
||||||
|
print(alp.__next__())
|
||||||
|
4
|
||||||
|
print(alp.__next__())
|
||||||
|
7
|
||||||
|
print(alp.__next__())
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#92>", line 1, in <module>
|
||||||
|
print(alp.__next__())
|
||||||
|
StopIteration
|
||||||
|
```
|
||||||
|
|
||||||
|
Здесь при каждом обращении к функции будет генерироваться только одно очередное значение.
|
||||||
|
При программировании задач у таких функций часто используют метод __next__, активирующий очередную итерацию выполнения функции.
|
||||||
|
__next__ помогает вывести значение, которое yield передает на каждой итерации цикла. Если функция отработала последнюю итерацию, но мы попытаемся сделать вызов, вернется ошибка.
|
||||||
|
В отличии от функций, которые возвращают список со значениями итераций, функции - генераторы генерируют значения по одному, не храня всё в памяти; а функция, возвращающая список создаёт весь список в памяти. Также генератор можно использовать только один раз - после прохождения всех значений он "опустошается" и больше не производит элементов.
|
||||||
|
|
||||||
|
# 6. Локализация объектов в функциях
|
||||||
|
|
||||||
|
По отношению к функции все объекты подразделяются на локальные и глобальные. Локальными являются объекты, которые создаются в функциях присваиванием им некоторых значений. Глобальные – это те объекты, значения которых заданы вне функции.
|
||||||
|
Локализация может быть переопределена путем прямого объявления объектов как глобальных с помощью дескриптора global.
|
||||||
|
|
||||||
|
## 6.1 Примеры на локализацию объектов
|
||||||
|
|
||||||
|
Пример 1. Одноименные локальный и глобальный объекты:
|
||||||
|
|
||||||
|
```python
|
||||||
|
glb=10
|
||||||
|
def func7(arg):
|
||||||
|
loc1=15
|
||||||
|
glb=8
|
||||||
|
return loc1*arg
|
||||||
|
|
||||||
|
res=func7(glb)
|
||||||
|
res
|
||||||
|
150
|
||||||
|
glb
|
||||||
|
10
|
||||||
|
```
|
||||||
|
Если внутри функции есть присваивание glb = ..., то создается локальная переменная, даже если есть глобальная с таким же именем.
|
||||||
|
Для изменения глобальной переменной нужно использовать global glb
|
||||||
|
|
||||||
|
Пример 2. Ошибка в использовании локального объекта.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def func8(arg):
|
||||||
|
loc1=15
|
||||||
|
print(glb)
|
||||||
|
glb=8
|
||||||
|
return loc1*arg
|
||||||
|
|
||||||
|
res=func8(glb)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#100>", line 1, in <module>
|
||||||
|
res=func8(glb)
|
||||||
|
File "<pyshell#99>", line 3, in func8
|
||||||
|
print(glb)
|
||||||
|
UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value
|
||||||
|
```
|
||||||
|
Нельзя обращаться к переменной до ее присваивания, если она считается локальной в функции.
|
||||||
|
|
||||||
|
Пример 3. Переопределение локализации объекта.
|
||||||
|
|
||||||
|
```python
|
||||||
|
glb=11
|
||||||
|
def func7(arg):
|
||||||
|
loc1=15
|
||||||
|
global glb
|
||||||
|
print(glb)
|
||||||
|
glb=8
|
||||||
|
return loc1*arg
|
||||||
|
|
||||||
|
res=func7(glb)
|
||||||
|
print(res)
|
||||||
|
print(glb)
|
||||||
|
|
||||||
|
|
||||||
|
11
|
||||||
|
165
|
||||||
|
8
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Здесь мы явно указали, что в функции используем глобальную переменную, поэтому она изменилась.
|
||||||
|
|
||||||
|
## 6.2 Выявление локализации объекта с помощью функций locals() и globals() из builtins
|
||||||
|
|
||||||
|
Эти функции возвращают словари, ключами в которых будут имена объектов, являющихся, соответственно, локальными или глобальными на уровне вызова этих функций.
|
||||||
|
|
||||||
|
```python
|
||||||
|
globals().keys() #Перечень глобальных объектов
|
||||||
|
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8'])
|
||||||
|
locals().keys() #Перечень локальных объектов
|
||||||
|
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8'])
|
||||||
|
```
|
||||||
|
Различий нет, потому что команды выполнены в глобальной области видимости, где globals() и locals() ссылаются на один и тот же словарь. Различия появляются только при вызове locals() внутри функций или методов.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def func8(arg):
|
||||||
|
loc1=15
|
||||||
|
glb=8
|
||||||
|
print(globals().keys()) #Перечень глобальных объектов «изнутри» функции
|
||||||
|
print(locals().keys()) #Перечень локальных объектов «изнутри» функции
|
||||||
|
return loc1*arg
|
||||||
|
|
||||||
|
hh=func8(glb)
|
||||||
|
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8'])
|
||||||
|
dict_keys(['arg', 'loc1', 'glb'])
|
||||||
|
'glb' in globals().keys()
|
||||||
|
True
|
||||||
|
```
|
||||||
|
locals() внутри функции показывает только её внутренние переменные, а globals() показывает все объекты модуля.
|
||||||
|
|
||||||
|
## 6.3 Локализация объектов при использовании вложенных функций
|
||||||
|
|
||||||
|
```python
|
||||||
|
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__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9'])
|
||||||
|
locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1'])
|
||||||
|
loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb'])
|
||||||
|
glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9'])
|
||||||
|
```
|
||||||
|
аждая функция имеет свою локальную область видимости, причем вложенные функции не видят локальные переменные внешних функций
|
||||||
|
## 6.4 Моделирование системы
|
||||||
|
|
||||||
|
Моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа «зона нечувствительности», при подаче на неё синусоидального входного сигнала.
|
||||||
|
Реальный двигатель: последовательное соединение усилителя с коэффициентом усиления k1,интегратора: y(t)=x(t)+y(t-1), и инерционного звена: y(t)=(x(t)+T*y(t-1)) / (T+1) с постоянной времени Т.
|
||||||
|
Тахогенератор: последовательное соединение усилителя с коэффициентом усиления k2 и интегратора: y(t)=x(t)+y(t-1).
|
||||||
|
Нелинейное звено типа «зона нечувствительности»: y=0 при -xm≤ x ≤xm, y=x-xm при x>xm, y=x+xm при x<-xm.
|
||||||
|
Таким образом, система характеризуется параметрами: k1, T, k2, xm. Входной сигнал характеризуется параметрами: A (амплитуда синусоиды) и F (период синусоиды).
|
||||||
|
Еще один параметр задачи : N – время (число тактов) подачи сигнала.
|
||||||
|
|
||||||
|
```python
|
||||||
|
znach=input('k1,T,k2,Xm,A,F,N=').split(',')
|
||||||
|
k1,T,k2,Xm,A,F,N=2,5,0.5,0.3,1,10,50
|
||||||
|
k1=float(znach[0])
|
||||||
|
k1
|
||||||
|
2.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 matplotlib.pyplot as plt
|
||||||
|
plt.figure(figsize=(10, 4))
|
||||||
|
<Figure size 1000x400 with 0 Axes>
|
||||||
|
plt.plot(vhod, 'b-', marker='o', markersize=3, label='Входной сигнал')
|
||||||
|
[<matplotlib.lines.Line2D object at 0x000001B544E58E10>]
|
||||||
|
plt.grid(True)
|
||||||
|
plt.legend()
|
||||||
|
<matplotlib.legend.Legend object at 0x000001B544E58CD0>
|
||||||
|
plt.show()
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
Создание функций реализующие компоненты системы
|
||||||
|
|
||||||
|
```python
|
||||||
|
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
|
||||||
|
```
|
||||||
|
Реализуем соединение компонент в соответствии с заданием
|
||||||
|
|
||||||
|
```python
|
||||||
|
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.3435662011497584, 0.8937007565838242, 1.2092087410156356, 0.8817313753454714, 0, -1.9132355035817665, -4.418649831257506, -6.322056754188363, -6.424186296702933, -3.708625221989286, 1.5442059920803182, 9.704061323599833, 17.99800277772674, 23.15808712030786, 21.60101426578536, 10.675050948044715, -9.28749624705183, -36.1615235441021, -62.02226858466596, -76.45563856328266, -68.45249914172874, -30.293518696411148, 37.373158630110446, 124.2547951685195, 205.6938367713173, 248.14398604455204, 216.69606070239215, 87.62148681833895, -136.666280236251, -418.37473314281556, -677.5335449808889, -804.9287317650713, -688.4371994648337, -254.1131297675378, 486.67764763779877, 1402.6733164388684, 2230.344175329904, 2612.7580871622617, 2188.8107903361088, 728.2399496559426, -1716.8860787572244, -4697.377083821688, -7340.680479213284, -8479.693381759376, -6951.99457172508, -2043.4413296742846, 6022.5141606693105, 15717.056921566687]
|
||||||
|
```
|
||||||
|
# 7. Завершение сеанса работы с IDLE
|
||||||
79
TEMA7/task.md
Обычный файл
@@ -0,0 +1,79 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
|
||||||
|
# Задание:
|
||||||
|
|
||||||
|
1. Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с задержкой на заданное время Т.
|
||||||
|
|
||||||
|
2. Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения случайной величины. Возвращаемый результат функции: список с числами элементов выборки в интервалах разбиения.
|
||||||
|
|
||||||
|
3. Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х Y=b1+b2*X и имеющую аргументы b1, b2 и X.
|
||||||
|
|
||||||
|
# Решение
|
||||||
|
|
||||||
|
## 1.
|
||||||
|
|
||||||
|
```py
|
||||||
|
>>> def delay_signal (signal, T):
|
||||||
|
... """"Расчёт выхода y(t) для устройства задержки"""
|
||||||
|
... output=[]
|
||||||
|
... for i in range(len(signal)):
|
||||||
|
if i < T:
|
||||||
|
output.append(0)
|
||||||
|
else:
|
||||||
|
output.append(signal[i-T])
|
||||||
|
return output
|
||||||
|
|
||||||
|
>>> x=[1,0.5,3.6,4.5,1,2,0.5] # Входной сигнал
|
||||||
|
>>> y= delay_signal (x, 2)
|
||||||
|
>>> y
|
||||||
|
[0, 0, 1, 0.5, 3.6, 4.5, 1]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2.
|
||||||
|
```py
|
||||||
|
>>> import random
|
||||||
|
>>> import matplotlib.pyplot as plt
|
||||||
|
>>> def histogram (sample, number):
|
||||||
|
... min_1=min(sample)
|
||||||
|
... max_1=max(sample)
|
||||||
|
... bins=(max_1-min_1)/number # Ширина одного интервала
|
||||||
|
... rows = [0]*number # Создание списка для подсчёта элементов в каждом интервале
|
||||||
|
... intervals = [] # Список для хранения границ интервалов
|
||||||
|
... for i in range(number):
|
||||||
|
... lower = min_1 + i * bins
|
||||||
|
... upper = min_1 + (i+1) * bins
|
||||||
|
... intervals.append((lower, upper))
|
||||||
|
...
|
||||||
|
... for x in sample:
|
||||||
|
... i = int((x-min_1)/bins) # Вычисление номера интервала для текущего элемента
|
||||||
|
... if i == number:
|
||||||
|
... i=number-1
|
||||||
|
... rows [i] +=1
|
||||||
|
... print("Границы интервала | Число элементов")
|
||||||
|
... for i in range(number):
|
||||||
|
... lower, upper = intervals[i]
|
||||||
|
... print(lower, "-", upper, " |", rows[i])
|
||||||
|
... plt.hist(sample, number)
|
||||||
|
... plt.xlabel('Значения выборки')
|
||||||
|
... plt.ylabel('Число элементов')
|
||||||
|
... plt.title('Гистограмма выборки')
|
||||||
|
... plt.show()
|
||||||
|
... return rows
|
||||||
|
...
|
||||||
|
>>> data = [random.gauss(1, 20) for _ in range(10)]
|
||||||
|
>>> histogram (data, 3)
|
||||||
|
Границы интервала | Число элементов
|
||||||
|
-23.534334630492655 - -11.561019750784087 | 3
|
||||||
|
-11.561019750784087 - 0.4122951289244803 | 2
|
||||||
|
0.4122951289244803 - 12.385610008633048 | 5
|
||||||
|
[3, 2, 5]
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
## 3.
|
||||||
|
```py
|
||||||
|
>>> linear_regression = lambda b1, b2, x: b1+b2 * x
|
||||||
|
>>> result = linear_regression (2,3,5)
|
||||||
|
>>> result
|
||||||
|
17
|
||||||
|
```
|
||||||
48
TEMA7/test.md
Обычный файл
@@ -0,0 +1,48 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
Вариант ИКЗ - 21
|
||||||
|
```
|
||||||
|
Разработайте функцию с 4 аргументами: K, N, A, B, создающую список с K элементами – вложенными списками, содержащими по N случайных элементов, равномерно распределенных в диапазоне от A до B. Результаты работы функции: сформированный список и кортеж со средними значениями элементов созданного списка. Проверить функцию на примере
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
import random
|
||||||
|
|
||||||
|
def sozdaniye_spiska(K, N, A, B):
|
||||||
|
|
||||||
|
vlozhenny_spisok = []
|
||||||
|
|
||||||
|
averages = []
|
||||||
|
|
||||||
|
for _ in range(K):
|
||||||
|
|
||||||
|
inner_list = [random.uniform(A, B) for _ in range(N)] # list comprehension
|
||||||
|
|
||||||
|
vlozhenny_spisok.append(inner_list)
|
||||||
|
|
||||||
|
avg = sum(inner_list) / N
|
||||||
|
|
||||||
|
averages.append(avg)
|
||||||
|
|
||||||
|
return vlozhenny_spisok, tuple(averages)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spisok, srednie = sozdaniye_spiska(2, 3, 0, 5)
|
||||||
|
|
||||||
|
print("Список:", spisok)
|
||||||
|
|
||||||
|
print("Первый вложенный список:", spisok[0])
|
||||||
|
|
||||||
|
print("Второй вложенный список:", spisok[1])
|
||||||
|
|
||||||
|
print("Средние:", srednie)
|
||||||
|
```
|
||||||
|
вывод в терминал:
|
||||||
|
```
|
||||||
|
Список: [[2.3507483092669834, 2.616161800898955, 4.195516554051458], [3.0341656938329993, 3.84693417158503, 1.2939043400526429]]
|
||||||
|
Первый вложенный список: [2.3507483092669834, 2.616161800898955, 4.195516554051458]
|
||||||
|
Второй вложенный список: [3.0341656938329993, 3.84693417158503, 1.2939043400526429]
|
||||||
|
Средние: (3.0541422214057987, 2.725001401823557)
|
||||||
|
```
|
||||||
304
TEMA8/report.md
Обычный файл
@@ -0,0 +1,304 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
|
||||||
|
## 1 Запуск IDLE
|
||||||
|
|
||||||
|
## 2 Создание и использование модулей в среде Python
|
||||||
|
|
||||||
|
### 2.1. Запуск модуля на выполнение путем его импорта.
|
||||||
|
|
||||||
|
В данном пункте используется модуль Mod1, находящийся в рабочем каталоге.
|
||||||
|
|
||||||
|
```python
|
||||||
|
perm1=input('Mod1:Введите значение = ')
|
||||||
|
Mod1:Введите значение = 12
|
||||||
|
print('Mod1:Значение perm1=',perm1)
|
||||||
|
Mod1:Значение perm1= 12
|
||||||
|
import Mod1
|
||||||
|
Mod1:Введите значение = 12
|
||||||
|
Mod1:Значение perm1= 12
|
||||||
|
import Mod1
|
||||||
|
type(Mod1)
|
||||||
|
<class 'module'>
|
||||||
|
dir(Mod1)
|
||||||
|
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1']
|
||||||
|
Mod1.perm1
|
||||||
|
'12'
|
||||||
|
import Mod1
|
||||||
|
importlib.reload(Mod1)
|
||||||
|
Mod1:Введите значение = 3
|
||||||
|
Mod1:Значение perm1= 3
|
||||||
|
<module 'Mod1' from 'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA8\\Mod1.py'>
|
||||||
|
Mod1.perm1
|
||||||
|
'3'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 Значение атрибута sys.modules
|
||||||
|
|
||||||
|
```python
|
||||||
|
print(sorted(sys.modules.keys()))
|
||||||
|
['Mod1', '__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']
|
||||||
|
sys.modules.pop('Mod1')
|
||||||
|
<module 'Mod1' from 'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA8\\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']
|
||||||
|
import Mod1
|
||||||
|
Mod1:Введите значение = 10
|
||||||
|
Mod1:Значение perm1= 10
|
||||||
|
sys.modules.pop('Mod1')
|
||||||
|
<module 'Mod1' from 'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA8\\Mod1.py'>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Запуск модуля на выполнение с помощью функции exec().
|
||||||
|
|
||||||
|
```python
|
||||||
|
exec(open('Mod1.py').read())
|
||||||
|
Mod1:Введите значение = 12
|
||||||
|
Mod1:Значение perm1= 12
|
||||||
|
exec(open('Mod1.py', encoding='utf-8').read())
|
||||||
|
Mod1:Введите значение = 11
|
||||||
|
Mod1:Значение perm1= 11
|
||||||
|
exec(open('Mod1.py', encoding='utf-8').read())
|
||||||
|
Mod1:Введите значение = 3
|
||||||
|
Mod1:Значение perm1= 3
|
||||||
|
perm1
|
||||||
|
'3'
|
||||||
|
exec(open('Mod1.py', encoding='utf-8').read())
|
||||||
|
Mod1:Введите значение = 4
|
||||||
|
Mod1:Значение perm1= 4
|
||||||
|
perm1
|
||||||
|
'4'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.4. Использование инструкции from … import …
|
||||||
|
|
||||||
|
Пример 1
|
||||||
|
|
||||||
|
```python
|
||||||
|
from Mod1 import perm1
|
||||||
|
Mod1:Введите значение = 9
|
||||||
|
Mod1:Значение perm1= 9
|
||||||
|
perm1
|
||||||
|
'9'
|
||||||
|
dir()
|
||||||
|
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'importlib', 'os', 'perm1', 'sys']
|
||||||
|
print(sorted(sys.modules.keys()))
|
||||||
|
['Mod1', '__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']
|
||||||
|
```
|
||||||
|
|
||||||
|
Как видно, в памяти объекта Mod1 нет, но в sys.modules.keys() появился. Кроме того, в рабочем пространстве появился объект perm1, импортированный из модуля, поэтому к нему можно обращаться по имени perm1.
|
||||||
|
|
||||||
|
Пример 2
|
||||||
|
|
||||||
|
```python
|
||||||
|
from Mod2 import beta
|
||||||
|
g=beta(2)
|
||||||
|
****BETA****
|
||||||
|
g
|
||||||
|
535.4916555247646
|
||||||
|
dir()
|
||||||
|
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'beta', 'g', 'importlib', 'os', 'perm1', 'sys']
|
||||||
|
print(sorted(sys.modules.keys()))
|
||||||
|
['Mod1', 'Mod2', '__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']
|
||||||
|
alpha()
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#30>", line 1, in <module>
|
||||||
|
alpha()
|
||||||
|
NameError: name 'alpha' is not defined
|
||||||
|
from Mod2 import alpha as al
|
||||||
|
al()
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=2
|
||||||
|
'2'
|
||||||
|
del al,beta
|
||||||
|
from Mod2 import alpha as al, beta as bt
|
||||||
|
del al,bt
|
||||||
|
from Mod2 import *
|
||||||
|
tt=alpha()
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=0.12
|
||||||
|
uu=beta(float(tt))
|
||||||
|
****BETA****
|
||||||
|
uu
|
||||||
|
1.4578913609506803
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Создание многомодульных программ.
|
||||||
|
|
||||||
|
### 3.1. Простая многомодульная программа.
|
||||||
|
|
||||||
|
```python
|
||||||
|
sys.modules.pop('Mod1')
|
||||||
|
<module 'Mod1' from 'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA8\\Mod1.py'>
|
||||||
|
sys.modules.pop('Mod2')
|
||||||
|
<module 'Mod2' from 'C:\\Users\\twoth\\Desktop\\python-labs\\TEMA8\\Mod2.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']
|
||||||
|
import Mod0
|
||||||
|
Mod1:Введите значение = 5
|
||||||
|
Mod1:Значение perm1= 5
|
||||||
|
perm1= 5
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=23
|
||||||
|
tt= 23
|
||||||
|
****BETA****
|
||||||
|
qq= 2.402459849485247e+31
|
||||||
|
Mod0.tt; Mod0.qq; Mod0.Mod1.perm1
|
||||||
|
'23'
|
||||||
|
2.402459849485247e+31
|
||||||
|
'5'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Еще один пример.
|
||||||
|
|
||||||
|
```python
|
||||||
|
import MM0
|
||||||
|
k1,T,k2,Xm,A,F,N=10,5,20,0.2,4,0.002,45
|
||||||
|
y= [0, 0, 0, 0, 0, 0, 0, 0, 0, -1.319802644385577, 46.01934525453105, -1405.3955775891707, 42745.94702692066, -1299970.5133264635, 39533945.50140401, -1202283133.3347626, 36563128408.478745, -1111936383153.658, 33815556107824.71, -1028378828326575.4, 3.1274452834020396e+16, -9.511002882653281e+17, 2.892430326884485e+19, -8.796289202203655e+20, 2.675075800776401e+22, -8.135283385301572e+23, 2.474054594638224e+25, -7.523949501635715e+26, 2.288139325051647e+28, -6.958554904853609e+29, 2.1161948415343663e+31, -6.435647441989787e+32, 1.9571712956052526e+34, -5.952034375513921e+35, 1.810097730681449e+37, -5.504762889302416e+38, 1.6740761536689568e+40, -5.091102059507955e+41, 1.548276052049398e+43, -4.708526180245838e+44, 1.4319293229856865e+46, -4.354699342288017e+47, 1.3243255834850482e+49, -4.02746117060638e+50, 1.2248078329844667e+52]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3. Области действия объектов в модулях.
|
||||||
|
|
||||||
|
Попробуйте вставить в функции alpha обращение к функции beta и, наоборот, из beta – к alpha.
|
||||||
|
|
||||||
|
```python
|
||||||
|
def alpha():
|
||||||
|
print('****ALPHA****')
|
||||||
|
t=input('Значение t=')
|
||||||
|
beta(t)
|
||||||
|
return t
|
||||||
|
|
||||||
|
def beta(q):
|
||||||
|
print('****BETA****')
|
||||||
|
import math
|
||||||
|
expi=q*math.pi
|
||||||
|
return math.exp(expi)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
Mod1:Введите значение = 8
|
||||||
|
Mod1:Значение perm1= 8
|
||||||
|
perm1= 8
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=6
|
||||||
|
tt= 6
|
||||||
|
****BETA****
|
||||||
|
qq= 153552935.39544657
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
def alpha():
|
||||||
|
print('****ALPHA****')
|
||||||
|
t=input('Значение t=')
|
||||||
|
return t
|
||||||
|
|
||||||
|
def beta(q):
|
||||||
|
print('****BETA****')
|
||||||
|
import math
|
||||||
|
expi=alpha()*math.pi
|
||||||
|
return math.exp(expi)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
Mod1:Введите значение = 5
|
||||||
|
Mod1:Значение perm1= 5
|
||||||
|
perm1= 5
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=8
|
||||||
|
tt= 8
|
||||||
|
****BETA****
|
||||||
|
qq= 82226315585.59491
|
||||||
|
```
|
||||||
|
|
||||||
|
Попробуйте отобразить на экране в модуле Mod0 значения объектов t и expi.
|
||||||
|
Из-за того, что функция alpha() возвращает t, проблем с её отображением нет.
|
||||||
|
А вот expi напрямую вывести нельзя, потому что это локальная переменная функции beta() и она не возвращается данной функцией.
|
||||||
|
Т.к. возвращаемая переменная qq содержит expi в показателе степени экспоненты, то один из путей решения - проделать обратную операцию (взять натуральный логарифм от qq)
|
||||||
|
|
||||||
|
```python
|
||||||
|
Mod1:Введите значение = 5
|
||||||
|
Mod1:Значение perm1= 5
|
||||||
|
perm1= 5
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=1
|
||||||
|
t= 1
|
||||||
|
****BETA****
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "C:/Users/twoth/Desktop/python-labs/TEMA8/Mod0_copy.py", line 9, in <module>
|
||||||
|
print('expi=', Mod2.expi)
|
||||||
|
NameError: name 'Mod2' is not defined. Did you mean: 'Mod1'?
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
#Модуль Mod0
|
||||||
|
import Mod1, math
|
||||||
|
print('perm1=',Mod1.perm1)
|
||||||
|
from Mod2 import alpha as al
|
||||||
|
tt=al()
|
||||||
|
print('t=',tt)
|
||||||
|
from Mod2 import beta
|
||||||
|
qq=beta(float(tt))
|
||||||
|
print('expi=', math.log(qq))
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
Mod1:Введите значение = 6
|
||||||
|
Mod1:Значение perm1= 6
|
||||||
|
perm1= 6
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=1
|
||||||
|
t= 1
|
||||||
|
****BETA****
|
||||||
|
expi= 3.141592653589793
|
||||||
|
```
|
||||||
|
|
||||||
|
Попробуйте в модуле Mod0 увеличить в 3 раза значение объекта perm1 и отобразить его после этого на экране.
|
||||||
|
Т.к. perm1 имеет строковый тип, то без приведения к целочисленному типу при умножении будет повторение введённого значения 3 раза.
|
||||||
|
|
||||||
|
```python
|
||||||
|
#Модуль Mod0
|
||||||
|
import Mod1, math
|
||||||
|
print('perm1=',Mod1.perm1)
|
||||||
|
print('3*perm1=', 3*Mod1.perm1)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
Mod1:Введите значение = 3
|
||||||
|
Mod1:Значение perm1= 3
|
||||||
|
perm1= 3
|
||||||
|
3*perm1= 333
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
#Модуль Mod0
|
||||||
|
import Mod1, math
|
||||||
|
print('perm1=',Mod1.perm1)
|
||||||
|
print('3*perm1=', 3*int(Mod1.perm1))
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
Mod1:Введите значение = 3
|
||||||
|
Mod1:Значение perm1= 3
|
||||||
|
perm1= 3
|
||||||
|
3*perm1= 9
|
||||||
|
```
|
||||||
|
|
||||||
|
Попробуйте в командной строке (в главном модуле) увеличить в 2 раза значения объектов perm1, tt, qq.
|
||||||
|
Из-за того, что perm1 и tt представлены изначально в строковом виде, то ситуация будет такой же, как и ранее. При необходимости их можно предварительно перевести в целочисленный тип
|
||||||
|
|
||||||
|
```python
|
||||||
|
import Mod0
|
||||||
|
Mod1:Введите значение = 1
|
||||||
|
Mod1:Значение perm1= 1
|
||||||
|
perm1= 1
|
||||||
|
****ALPHA****
|
||||||
|
Значение t=1
|
||||||
|
tt= 1
|
||||||
|
****BETA****
|
||||||
|
qq= 23.140692632779267
|
||||||
|
Mod0.Mod1.perm1*2
|
||||||
|
'11'
|
||||||
|
Mod0.tt*2
|
||||||
|
'11'
|
||||||
|
Mod0.qq*2
|
||||||
|
46.281385265558534
|
||||||
|
```
|
||||||
110
TEMA8/task.md
Обычный файл
@@ -0,0 +1,110 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
Разработайте программу, состоящую из трех модулей:
|
||||||
|
|
||||||
|
- Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
|
||||||
|
|
||||||
|
- Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
|
||||||
|
|
||||||
|
- Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
|
||||||
|
|
||||||
|
Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
|
||||||
|
```py
|
||||||
|
|
||||||
|
#okz1.py
|
||||||
|
|
||||||
|
def read_numbers_from_file(filename):
|
||||||
|
numbers = []
|
||||||
|
file = open(filename, 'r')
|
||||||
|
lines = file.readlines()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if line:
|
||||||
|
parts = line.split()
|
||||||
|
for part in parts:
|
||||||
|
numbers.append(float(part))
|
||||||
|
|
||||||
|
return numbers
|
||||||
|
|
||||||
|
#okz2.py
|
||||||
|
|
||||||
|
def correlation_coefficient(list1, list2):
|
||||||
|
length1 = len(list1)
|
||||||
|
length2 = len(list2)
|
||||||
|
min_length = min(length1, length2)
|
||||||
|
|
||||||
|
if min_length < 2:
|
||||||
|
return 0.0
|
||||||
|
|
||||||
|
x = list1[:min_length]
|
||||||
|
y = list2[:min_length]
|
||||||
|
|
||||||
|
sum_x = 0.0
|
||||||
|
sum_y = 0.0
|
||||||
|
for i in range(min_length):
|
||||||
|
sum_x += x[i]
|
||||||
|
sum_y += y[i]
|
||||||
|
|
||||||
|
average_x = sum_x / min_length
|
||||||
|
average_y = sum_y / min_length
|
||||||
|
|
||||||
|
top = 0.0
|
||||||
|
sum_sq_x = 0.0
|
||||||
|
sum_sq_y = 0.0
|
||||||
|
|
||||||
|
for i in range(min_length):
|
||||||
|
diff_x = x[i] - average_x
|
||||||
|
diff_y = y[i] - average_y
|
||||||
|
top += diff_x * diff_y
|
||||||
|
sum_sq_x += diff_x * diff_x
|
||||||
|
sum_sq_y += diff_y * diff_y
|
||||||
|
|
||||||
|
if sum_sq_x == 0.0 or sum_sq_y == 0.0:
|
||||||
|
return 0.0
|
||||||
|
|
||||||
|
bottom = (sum_sq_x * sum_sq_y) ** 0.5
|
||||||
|
result = top / bottom
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
#okz3.py
|
||||||
|
|
||||||
|
import okz1
|
||||||
|
import okz2
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("Введите имя первого файла:")
|
||||||
|
file_name1 = input()
|
||||||
|
|
||||||
|
print("Введите имя второго файла:")
|
||||||
|
file_name2 = input()
|
||||||
|
|
||||||
|
numbers1 = module1.read_numbers_from_file(file_name1)
|
||||||
|
numbers2 = module1.read_numbers_from_file(file_name2)
|
||||||
|
|
||||||
|
correlation = module2.correlation_coefficient(numbers1, numbers2)
|
||||||
|
|
||||||
|
correlation = round(correlation, 3)
|
||||||
|
|
||||||
|
print("Коэффициент корреляции:", correlation)
|
||||||
|
|
||||||
|
#Проверка
|
||||||
|
|
||||||
|
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.0 9.5 8.0 7.0 5.0 4.0 2.0 1.0 7.5
|
||||||
|
|
||||||
|
|
||||||
|
Введите имя первого файла: data1.txt
|
||||||
|
Введите имя второго файла: data2.txt
|
||||||
|
Коэффициент корреляции: -0.76
|
||||||
|
Process finished with exit code 0
|
||||||
|
```
|
||||||
46
TEMA8/test.md
Обычный файл
@@ -0,0 +1,46 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
Вариант ИКЗ - 19
|
||||||
|
```
|
||||||
|
По указанному преподавателем варианту контрольного задания обратитесь к индивидуальному заданию с таким номером в теме 7, разработайте функцию, на ее основе создайте модуль. Создайте второй модуль, в котором должны быть инструкции для ввода/создания исходных данных для проверки работы функции, вызов функции и отображение полученных результатов.
|
||||||
|
|
||||||
|
Разработайте функцию с аргументом – именем текстового файла с записанным в него объектом – совокупностью строк, чисел, списков и т.д. В каждой строке данные разделяются запятыми. Функция должна считывать объект из файла, формировать и возвращать список, в котором каждый элемент – это список элементов из соответствующей строки файла. Сформированный список должен возвращаться в качестве результата функции. Проверить функцию на примере нерегулярной числовой матрицы.
|
||||||
|
```
|
||||||
|
Нерегулярная матрица, или рваная матрица, — это матрица, в каждой строке которой разное количество элементов. Рваные матрицы не используются в линейной алгебре, поскольку над ними нельзя выполнять стандартные матричные преобразования, но они полезны при вычислениях в виде массивов, которые называются рваными массивами.
|
||||||
|
```
|
||||||
|
"reader.py"
|
||||||
|
```
|
||||||
|
```python
|
||||||
|
def read_file(filename):
|
||||||
|
result = []
|
||||||
|
file = open(filename, 'r')
|
||||||
|
for line in file:
|
||||||
|
parts = line.strip().split(',')
|
||||||
|
result.append(parts)
|
||||||
|
file.close()
|
||||||
|
return result
|
||||||
|
```
|
||||||
|
```
|
||||||
|
"module2.py"
|
||||||
|
```
|
||||||
|
```python
|
||||||
|
import reader
|
||||||
|
f = open("test.txt", "w")
|
||||||
|
f.write("""1,2,3
|
||||||
|
a,b,c,d
|
||||||
|
10,20,30,40,50
|
||||||
|
а, здесь, просто, строка""")
|
||||||
|
f.close()
|
||||||
|
data = reader.read_file("test.txt")
|
||||||
|
print(data)
|
||||||
|
for i in range(len(data)):
|
||||||
|
print("Строка", i, ":", data[i])
|
||||||
|
```
|
||||||
|
вывод в терминал:
|
||||||
|
```powershell
|
||||||
|
[['1', '2', '3'], ['a', 'b', 'c', 'd'], ['10', '20', '30', '40', '50'], ['а', ' здесь', ' просто', ' строка']]
|
||||||
|
Строка 0 : ['1', '2', '3']
|
||||||
|
Строка 1 : ['a', 'b', 'c', 'd']
|
||||||
|
Строка 2 : ['10', '20', '30', '40', '50']
|
||||||
|
Строка 3 : ['а', ' здесь', ' просто', ' строка']
|
||||||
|
```
|
||||||
|
Каждый элемент – это список элементов из соответствующей строки файла
|
||||||
Двоичные данные
TEMA9/Ris1.png
Обычный файл
|
После Ширина: | Высота: | Размер: 14 KiB |
Двоичные данные
TEMA9/figure1.png
Обычный файл
|
После Ширина: | Высота: | Размер: 36 KiB |
Двоичные данные
TEMA9/figure2.png
Обычный файл
|
После Ширина: | Высота: | Размер: 35 KiB |
257
TEMA9/report.md
Обычный файл
@@ -0,0 +1,257 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
|
||||||
|
## 1. Запуск IDLE
|
||||||
|
|
||||||
|
## 2. Создание классов и их наследников
|
||||||
|
### 2.1. Создание автономного класса
|
||||||
|
|
||||||
|
```py
|
||||||
|
class Class1: #Объявление класса
|
||||||
|
def zad_zn(self,znach): #Метод 1 класса1 – задание значения data
|
||||||
|
self.data=znach # self - ссылка на экземпляр класса
|
||||||
|
def otobrazh(self): # Метод 2 класса1
|
||||||
|
print(self.data)#Отображение данных экземпляра класса
|
||||||
|
|
||||||
|
z1=Class1() #Создаём 1-й экземпляр класса
|
||||||
|
z2=Class1() #Создаём 2-й экземпляр класса
|
||||||
|
z1.zad_zn('экз.класса 1') #Обращение к методу класса у 1-го экз.
|
||||||
|
z2.zad_zn(-632.453) #Обращение к методу класса у 2-го экз.
|
||||||
|
z1.otobrazh() # Обращение ко второму методу класса
|
||||||
|
экз.класса 1
|
||||||
|
z2.otobrazh()
|
||||||
|
-632.453
|
||||||
|
z1.data='Новое значение атрибута у экз.1'
|
||||||
|
z1.otobrazh()
|
||||||
|
Новое значение атрибута у экз.1
|
||||||
|
```
|
||||||
|
### 2.2. Создание класса-наследника
|
||||||
|
|
||||||
|
```py
|
||||||
|
class Class2(Class1): #Class2 - наследник класса Class1
|
||||||
|
def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя
|
||||||
|
print('значение=',self.data)#Отображение данных экземпляра
|
||||||
|
|
||||||
|
z3=Class2()
|
||||||
|
dir(z3)
|
||||||
|
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_zn']
|
||||||
|
z3.zad_zn('Совсем новое')
|
||||||
|
z3.otobrazh()
|
||||||
|
значение= Совсем новое
|
||||||
|
z1.otobrazh()
|
||||||
|
Новое значение атрибута у экз.1
|
||||||
|
```
|
||||||
|
При вызове z3.otobrazh() сработал метод класса Class2, а не родительского Class1.
|
||||||
|
|
||||||
|
## 3. Использование классов, содержащихся в модулях
|
||||||
|
Mod3:
|
||||||
|
```py
|
||||||
|
class Class1: #Объявление класса Class1 в модуле
|
||||||
|
def zad_zn(self,znach): # 1 Метод класса
|
||||||
|
self.data=znach # self - ссылка на экземпляр класса Class1
|
||||||
|
def otobrazh(self): # 2 Метод класса
|
||||||
|
print(self.data)#Отображение данных экземпляра
|
||||||
|
class Class2(Class1): #Class2 - наследник класса Class1
|
||||||
|
def otobrazh(self): # Метод класса Class2
|
||||||
|
print('значение=',self.data)#Отображение данных экземпляра
|
||||||
|
def otobrazh(objekt): #Объявление самостоятельной функции
|
||||||
|
print('значение объекта=',objekt)
|
||||||
|
```
|
||||||
|
|
||||||
|
Импортировали первый класс:
|
||||||
|
```py
|
||||||
|
from Mod3 import Class1 #Частичный импорт содержимого модуля
|
||||||
|
z4=Class1()
|
||||||
|
z4.otobrazh()
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#65>", line 1, in <module>
|
||||||
|
z4.otobrazh()
|
||||||
|
File "C:\Users\twoth\Desktop\python-labs\TEMA9\Mod3.py", line 5, in otobrazh
|
||||||
|
print(self.data)#Отображение данных экземпляра
|
||||||
|
AttributeError: 'Class1' object has no attribute 'data'
|
||||||
|
```
|
||||||
|
Ошибка возникает потому, что атрибут data еще не был создан для объекта z4.
|
||||||
|
|
||||||
|
```py
|
||||||
|
from Mod3 import Class1
|
||||||
|
z4=Class1()
|
||||||
|
z4.data='значение данного data у экз.4'
|
||||||
|
z4.otobrazh()
|
||||||
|
значение данного data у экз.4
|
||||||
|
del z4
|
||||||
|
import Mod3 #Полный импорт содержимого модуля
|
||||||
|
z4=Mod3.Class2()
|
||||||
|
z4.zad_zn('Класс из модуля')
|
||||||
|
z4.otobrazh()
|
||||||
|
значение= Класс из модуля
|
||||||
|
Mod3.otobrazh('Объект')
|
||||||
|
значение объекта= Объект
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Использование специальных методов
|
||||||
|
Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__
|
||||||
|
|
||||||
|
```py
|
||||||
|
class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1
|
||||||
|
def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса
|
||||||
|
self.data=znach
|
||||||
|
def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+»
|
||||||
|
return Class3(self.data+drug_zn)
|
||||||
|
def zad_dr_zn(self,povtor): #А это - обычный метод
|
||||||
|
self.data*=povtor
|
||||||
|
```
|
||||||
|
Метод __add__ - это один из методов, осуществляющих так называемую «перегрузку» операторов.
|
||||||
|
|
||||||
|
```py
|
||||||
|
z5=Class3('abc') #При создании экземпляра срабатывает конструктор
|
||||||
|
z5.otobrazh()
|
||||||
|
значение= abc
|
||||||
|
z6=z5+'def'
|
||||||
|
z6.otobrazh()
|
||||||
|
значение= abcdef
|
||||||
|
z6.zad_dr_zn(3)
|
||||||
|
z6.otobrazh()
|
||||||
|
значение= abcdefabcdefabcdef
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Присоединение атрибутов к классу.
|
||||||
|
|
||||||
|
```py
|
||||||
|
dir(Class3)
|
||||||
|
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn']
|
||||||
|
z7=Class3(123)
|
||||||
|
dir(z7)
|
||||||
|
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn']
|
||||||
|
dir(z7)==dir(Class3)
|
||||||
|
False
|
||||||
|
z7.fio
|
||||||
|
'Иванов И.И.'
|
||||||
|
Class3.fio
|
||||||
|
'Иванов И.И.'
|
||||||
|
z7.fio == Class3.fio
|
||||||
|
True
|
||||||
|
z7.rozden='1987'
|
||||||
|
dir(z7)
|
||||||
|
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'rozden', 'zad_dr_zn', 'zad_zn']
|
||||||
|
dir(Class3)
|
||||||
|
['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn']
|
||||||
|
```
|
||||||
|
Атрибут rozden не появился у класса Class3. Атрибуты экземпляра (z7.rozden) создаются в словаре z7.__dict__. Атрибуты класса (Class3.fio) создаются в словаре Class3.__dict__. Эти два словаря независимы друг от друга
|
||||||
|
|
||||||
|
## 6. Выявление родительских классов
|
||||||
|
Такое выявление делается с помощью специального атрибута __bases__
|
||||||
|
|
||||||
|
```py
|
||||||
|
Class3.__bases__
|
||||||
|
(<class '__main__.Class2'>,)
|
||||||
|
Class2.__bases__
|
||||||
|
(<class '__main__.Class1'>,)
|
||||||
|
Class1.__bases__
|
||||||
|
(<class 'object'>,)
|
||||||
|
```
|
||||||
|
Для получения всей цепочки наследования используйте атрибут __mro__:
|
||||||
|
```py
|
||||||
|
Class3.__mro__
|
||||||
|
(<class '__main__.Class3'>, <class '__main__.Class2'>, <class '__main__.Class1'>, <class 'object'>)
|
||||||
|
ZeroDivisionError.__mro__
|
||||||
|
(<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. Создание свойства класса
|
||||||
|
Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута.
|
||||||
|
|
||||||
|
```py
|
||||||
|
class Class4:
|
||||||
|
def __init__(sam,znach):
|
||||||
|
sam.__prm=znach
|
||||||
|
def chten(sam):
|
||||||
|
return sam.__prm
|
||||||
|
def zapis(sam,znch):
|
||||||
|
sam.__prm=znch
|
||||||
|
def stiran(sam):
|
||||||
|
del sam.__prm
|
||||||
|
svojstvo=property(chten,zapis,stiran)
|
||||||
|
exempl=Class4(12)
|
||||||
|
exempl.svojstvo
|
||||||
|
12
|
||||||
|
exempl.svojstvo=45
|
||||||
|
print(exempl.svojstvo)
|
||||||
|
45
|
||||||
|
del exempl.svojstvo
|
||||||
|
exempl.svojstvo
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<pyshell#107>", line 1, in <module>
|
||||||
|
exempl.svojstvo
|
||||||
|
File "<pyshell#101>", line 5, in chten
|
||||||
|
return sam.__prm
|
||||||
|
AttributeError: 'Class4' object has no attribute '_Class4__prm'
|
||||||
|
```
|
||||||
|
exempl.svojstvo → вызывает chten(). chten() пытается вернуть sam.__prm. Python ищет _Class4__prm (после преобразования). Атрибут удален → AttributeError
|
||||||
|
|
||||||
|
## 8. Пример модели системы автоматического регулирования (САР)
|
||||||
|
Модуль SAU.py
|
||||||
|
```py
|
||||||
|
class SAU:
|
||||||
|
def __init__(self,zn_param):
|
||||||
|
self.param=zn_param
|
||||||
|
self.ypr=[0,0]
|
||||||
|
|
||||||
|
def zdn_zn(self,upr):
|
||||||
|
self.x=upr
|
||||||
|
|
||||||
|
def model(self):
|
||||||
|
def inerz(x,T,yy):
|
||||||
|
return (x+T*yy)/(T+1)
|
||||||
|
|
||||||
|
y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2
|
||||||
|
y1=self.param[0]*y0 #Усилитель1
|
||||||
|
y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1
|
||||||
|
y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2
|
||||||
|
self.ypr[0]=y2
|
||||||
|
self.ypr[1]=y3
|
||||||
|
|
||||||
|
def otobraz(self):
|
||||||
|
print('y=',self.ypr[1])
|
||||||
|
|
||||||
|
```
|
||||||
|
Тестирование
|
||||||
|
|
||||||
|
```py
|
||||||
|
###main_SAU
|
||||||
|
prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь
|
||||||
|
from SAU import *
|
||||||
|
xx=[0]+[1]*20 #Входной сигнал – «ступенька»
|
||||||
|
SAUe=SAU(prm) # Создаём экземпляр класса
|
||||||
|
yt=[]
|
||||||
|
for xt in xx: # Прохождение входного сигнала
|
||||||
|
SAUe.zdn_zn(xt)
|
||||||
|
SAUe.model()
|
||||||
|
SAUe.otobraz()
|
||||||
|
yt.append(SAUe.ypr[1])
|
||||||
|
|
||||||
|
y= 0.0
|
||||||
|
y= 0.2173913043478261
|
||||||
|
y= 0.4763705103969754
|
||||||
|
y= 0.686594887811293
|
||||||
|
y= 0.8199324616478645
|
||||||
|
y= 0.8837201137353929
|
||||||
|
y= 0.8994188484874774
|
||||||
|
y= 0.8892777072047301
|
||||||
|
y= 0.870097963179993
|
||||||
|
y= 0.8518346102696789
|
||||||
|
y= 0.8387499784485772
|
||||||
|
y= 0.8314204114211459
|
||||||
|
y= 0.8286051955249649
|
||||||
|
y= 0.8285656555914835
|
||||||
|
y= 0.8297915186846528
|
||||||
|
y= 0.8312697736438287
|
||||||
|
y= 0.8324765218921963
|
||||||
|
y= 0.8332456979978418
|
||||||
|
y= 0.8336163607592184
|
||||||
|
y= 0.8337101315489143
|
||||||
|
y= 0.833654237067147
|
||||||
|
import pylab
|
||||||
|
pylab.plot(yt)
|
||||||
|
[<matplotlib.lines.Line2D object at 0x000001C7B00DFB10>]
|
||||||
|
pylab.show()
|
||||||
|
```
|
||||||
|

|
||||||
67
TEMA9/task.md
Обычный файл
@@ -0,0 +1,67 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
Создайте и запишите в модуль класс, содержащий следующие компоненты:
|
||||||
|
- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения;
|
||||||
|
- метод для обеспечения операции повышения оклада сотрудника на заданное значение;
|
||||||
|
- метод для обеспечения перевода сотрудника из одного отдела в другой;
|
||||||
|
- метод для изменения должности сотрудника;
|
||||||
|
- свойство, содержащее перечень (список) поощрений сотрудника.
|
||||||
|
Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобрази-те эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изме-нения должности и оклада, объявления благодарности.
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
|
||||||
|
Содержимое модуля:
|
||||||
|
|
||||||
|
```py
|
||||||
|
class Employee:
|
||||||
|
def __init__(self, fio, otdel, dolzhnost, oklad):
|
||||||
|
self.fio = fio
|
||||||
|
self.otdel = otdel
|
||||||
|
self.dolzhnost = dolzhnost
|
||||||
|
self.oklad = oklad
|
||||||
|
self.bonus = []
|
||||||
|
|
||||||
|
def give_raise(self, amount):
|
||||||
|
print(f'Оклад повышен на {amount} рублей, новый оклад: {self.oklad + amount}')
|
||||||
|
self.oklad = self.oklad + amount
|
||||||
|
|
||||||
|
def transfer(self, new_otdel):
|
||||||
|
self.otdel = new_otdel
|
||||||
|
|
||||||
|
def position(self, new_position):
|
||||||
|
self.dolzhnost = new_position
|
||||||
|
|
||||||
|
def give_bonus(self, bonus):
|
||||||
|
self.bonus.append(bonus)
|
||||||
|
|
||||||
|
def read_bonus(self):
|
||||||
|
return self.bonus
|
||||||
|
|
||||||
|
def remove_bonus(self):
|
||||||
|
if len(self.bonus) != 0:
|
||||||
|
return self.bonus.pop()
|
||||||
|
return None
|
||||||
|
|
||||||
|
svojstvo = property(read_bonus, give_bonus, remove_bonus)
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка работы:
|
||||||
|
|
||||||
|
```py
|
||||||
|
>>> import EMP
|
||||||
|
>>> de = EMP.Employee('Фридман Михаил Маратович', 'Маркетинг', 'Брокер', 130000)
|
||||||
|
>>> ya = EMP.Employee('Жалнин Вадим Юрьевич', 'Производственный', 'Арбузолитейщик', 131000)
|
||||||
|
>>> ya.dolzhnost
|
||||||
|
'Арбузолитейщик'
|
||||||
|
>>> de.svojstvo = 'Премного благодарны'
|
||||||
|
>>> de.svojstvo = 'Вы лучший'
|
||||||
|
>>> de.svojstvo
|
||||||
|
['Премного благодарны', 'Вы лучший']
|
||||||
|
>>> de.transfer('Клининговый')
|
||||||
|
>>> de.otdel
|
||||||
|
'Клининговый'
|
||||||
|
>>> ya.give_raise(70000)
|
||||||
|
Оклад повышен на 70000 рублей, новый оклад: 201000
|
||||||
|
```
|
||||||
105
TEMA9/test.md
Обычный файл
@@ -0,0 +1,105 @@
|
|||||||
|
Жалнин Вадим А-01-23
|
||||||
|
Вариант теста по модулю 3 - 18
|
||||||
|
```
|
||||||
|
M3_19
|
||||||
|
1) Создайте модуль М1, содержащий 2 функции:
|
||||||
|
- функция 1: аргумент - список или кортеж с отсчетами некоторого сигнала; функция должна определить и вернуть число элементов, значение которых превышает значение предыдущего элемента;
|
||||||
|
- функция 2: аргумент - список или кортеж с последовательностью отсчетов сигнала; функция должна рассчитать список с накопленными суммами: первый элемент равен первому элементу исходной последовательности, второй - равен сумме двух первых элементов последовательности, третий - сумме первых трех элементов и т.д.
|
||||||
|
2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
|
||||||
|
- запрашивается имя бинарного файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;
|
||||||
|
- выборка вводится из файла;
|
||||||
|
- с помощью функции 1 производится определение числа элементов со значениями, превышающими значения их предшественников;
|
||||||
|
- с помощью функции 2 рассчитывается список с кумулятивными суммами;
|
||||||
|
- выборка отображается в виде графика.
|
||||||
|
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.
|
||||||
|
4) Проведите расчеты при 2-х разных исходных файлах.
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
"m1.py"
|
||||||
|
```
|
||||||
|
```python
|
||||||
|
def count_increasing(data):
|
||||||
|
count = 0
|
||||||
|
i = 1
|
||||||
|
while i < len(data):
|
||||||
|
if data[i] > data[i-1]:
|
||||||
|
count = count + 1
|
||||||
|
i = i + 1
|
||||||
|
return count
|
||||||
|
def cumulative_sum(data):
|
||||||
|
result = []
|
||||||
|
total = 0
|
||||||
|
for x in data:
|
||||||
|
total = total + x
|
||||||
|
result.append(total)
|
||||||
|
return result
|
||||||
|
```
|
||||||
|
```
|
||||||
|
"module2.py"
|
||||||
|
```
|
||||||
|
```python
|
||||||
|
import pickle
|
||||||
|
import m1
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
while True:
|
||||||
|
filename = input("Имя файла: ")
|
||||||
|
try:
|
||||||
|
f = open(filename, 'rb')
|
||||||
|
signal = pickle.load(f)
|
||||||
|
f.close()
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
print("не найден, пробуйте еще раз.")
|
||||||
|
increasing = m1.count_increasing(signal)
|
||||||
|
cumulative = m1.cumulative_sum(signal)
|
||||||
|
plt.plot(signal)
|
||||||
|
plt.title("График выборки")
|
||||||
|
plt.show()
|
||||||
|
return signal, increasing, cumulative
|
||||||
|
```
|
||||||
|
```
|
||||||
|
main.py
|
||||||
|
```
|
||||||
|
```python
|
||||||
|
import module2
|
||||||
|
import pickle
|
||||||
|
data1 = [1, 3, 2, 5, 4, 7, 6, 9, 8]
|
||||||
|
f1 = open("file1.bin", "wb")
|
||||||
|
pickle.dump(data1, f1)
|
||||||
|
f1.close()
|
||||||
|
data2 = [10, 8, 12, 11, 15, 13, 17, 16]
|
||||||
|
f2 = open("file2.bin", "wb")
|
||||||
|
pickle.dump(data2, f2)
|
||||||
|
f2.close()
|
||||||
|
print("проверка первым файлом")
|
||||||
|
sig1, inc1, cum1 = module2.work_with_file()
|
||||||
|
print("сигнал:", sig1)
|
||||||
|
print("увеличивающихся:", inc1)
|
||||||
|
print("накопленная сумма:", cum1)
|
||||||
|
print()
|
||||||
|
print("проверка вторым файлом")
|
||||||
|
sig2, inc2, cum2 = module2.work_with_file()
|
||||||
|
print("сигнал:", sig2)
|
||||||
|
print("увеличивающихся:", inc2)
|
||||||
|
print("накопленная сумма:", cum2)
|
||||||
|
```
|
||||||
|
вывод в терминал:
|
||||||
|
```powershell
|
||||||
|
проверка первым файлом
|
||||||
|
Имя файла: file4.bin
|
||||||
|
не найден, пробуйте еще раз.
|
||||||
|
Имя файла: file1.bin
|
||||||
|
сигнал: [1, 3, 2, 5, 4, 7, 6, 9, 8]
|
||||||
|
увеличивающихся: 4
|
||||||
|
накопленная сумма: [1, 4, 6, 11, 15, 22, 28, 37, 45]
|
||||||
|
|
||||||
|
проверка вторым файлом
|
||||||
|
Имя файла: file2.bin
|
||||||
|
сигнал: [10, 8, 12, 11, 15, 13, 17, 16]
|
||||||
|
увеличивающихся: 3
|
||||||
|
накопленная сумма: [10, 18, 30, 41, 56, 69, 86, 102]
|
||||||
|
```
|
||||||
|
![[figure1.png]]
|
||||||
|
![[figure2.png]]
|
||||||
|
Каждый элемент – это список элементов из соответствующей строки файла
|
||||||