# Отчёт по Теме 8

Кузьменко Елена, А-02-23

## 1. Запустили интерактивную оболочку IDLE. 

```py
import os, sys, importlib
os.chdir(r"C:\Users\vaffl\Desktop\Учеба\ПОАС\TEMA8")
os.getcwd()
'C:\\Users\\vaffl\\Desktop\\Учеба\\ПОАС\\TEMA8'
```

## 2. Создание и использование модулей в среде Python.

	Модуль в Python — это отдельный файл с расширением .py, содержащий код на языке Python, который может быть повторно использован в других программах через import.

### 2.1. Запуск модуля через import

Mod1.py
```py
perm1 = input('Mod1:Введите значение = ')
print('Mod1:Значение perm1=', perm1)

```

main.py
```py
>>> import sys, os
>>> import Mod1
Mod1:Введите значение = 10
Mod1:Значение perm1= 10
>>> type(Mod1)
<class 'module'>
>>> dir(Mod1)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1']
```

Повторное обращение к Mod1 в main:
```py
>>> import Mod1 # требуется перезагрузить
>>> importlib.reload(Mod1)
Mod1:Введите значение = 6
Mod1:Значение perm1= 6
<module 'Mod1' from 'C:\\Users\\vaffl\\Desktop\\Учеба\\ПОАС\\TEMA8\\Mod1.py'>
>>> Mod1.perm1
'6'
```

### 2.2. Импортируемые модули в словаре.

Импортированные модули заносятся в словарь – значение атрибута sys.modules.

```py
>>> print(sorted(sys.modules.keys()))
['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', . . ., 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']

```
	print(sorted(sys.modules.keys())) выводит отсортированный по алфавиту список всех модулей, загруженных в память Python на данный момент.

Удаление Mod1 из словаря:

```py
>>> sys.modules.pop('Mod1')
<module 'Mod1' from 'C:\\Users\\vaffl\\Desktop\\Учеба\\ПОАС\\TEMA8\\Mod1.py'>
>>> print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', …, 'time', 'tkinter', 'tkinter.constants', 'token', 'tokenize', 'traceback', 'types', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
```

### 2.3. Запуск модуля на выполнение с помощью exec().

	Функция exec действует так, как будто на месте обращения к ней в программу вставлен код из объекта-аргумента функции. Объект-модуль при этом не создается. Созданные при выполнении модуля объекты становятся объектами главной программы.

```py
>>> exec(open('Mod1.py').read()) # читает как бинарный файл
Mod1:Р’РІРµРґРёС‚Рµ Р·РЅР°С‡РµРЅРёРµ = 3
Mod1:Р—РЅР°С‡РµРЅРёРµ perm1= 3
>>> exec(open('Mod1.py', encoding='utf-8').read())
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
>>> print(sorted(sys.modules.keys())) # Объект-модуль не появится
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', ...,'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib']
>>> perm1
'3'
```

### 2.4. Инструкция from … import …

	Можно осуществлять импорт модуля не целиком, а только часть содержащихся в нем объектов.

#### Пример 1

```py
>>> from Mod1 import perm1
Mod1:Введите значение = 1
Mod1:Значение perm1= 1
>>> "perm1" in dir()
True
>>> "Mod1" in dir()
False
>>> perm1 # Теперь переменная главной программы
'1'
```

#### Пример 2

Содержимое нового модуля Mod2:

```py
def alpha():
    print('****ALPHA****')
    t=input('Значение t=')
    return t

def beta(q):
    import math
    expi=q*math.pi
    return math.exp(expi)
```
main.py
```py
>>> from Mod2 import beta # импортирует beta из модуля
>>> g = beta(2); g
535.4916555247646
```

Случай обращения к переменной без её импорта:
```py
>>> alpha()
Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    alpha()
NameError: name 'alpha' is not defined
```

Импорт функции из модуля с псевдонимом:
```py
>>> from Mod2 import alpha as al
>>> al()
****ALPHA****
Значение t=54
'54'
```

```py
>>> del al,beta
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '__warningregistry__', 'g', 'importlib', 'os', 'perm1', 'sys']
>>> from Mod2 import * # импорт всего содержимого
>>> tt=alpha()
****ALPHA****
Значение t=0.12
>>> uu = beta(float(tt))
>>> uu
1.4578913609506803
```

## 3. Многомодульные программы.

### 3.1. Пример простой многомодульной программы.

Содержимое модуля Mod0:
```py
#Модуль Mod0
import Mod1
print('perm1=',Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq=',qq)
```

main.py
```py
>>> import Mod0
Mod1:Введите значение = 10
Mod1:Значение perm1= 10
perm1= 10
****ALPHA****
Значение t=0.1
tt= 0.1
qq= 1.369107770624847
>>> Mod0.tt; Mod0.qq; Mod0.Mod1.perm1
'0.1'
1.369107770624847
'10'
```

### 3.2. Многомодульная программа(Тема7)

MM1.py
```py
def realdvig(xtt,kk1,TT,yti1,ytin1):
    #Модель реального двигателя
    yp=kk1*xtt  #усилитель
    yti1=yp+yti1  #Интегратор
    ytin1=(yti1+TT*ytin1)/(TT+1)
    return [yti1,ytin1]

def tahogen(xtt,kk2,yti2):
    #Модель тахогенератора
    yp=kk2*xtt   #усилитель
    yti2=yp+yti2 #интегратор
    return yti2

def nechus(xtt,gran):
    #зона нечувствит
    if xtt<gran and xtt>(-gran):
        ytt=0
    elif xtt>=gran:
        ytt=xtt-gran
    elif xtt<=(-gran):
        ytt=xtt+gran
    return ytt
```

MM2.py
```py
znach=input('k1,T,k2,Xm,A,F,N=').split(',')
k1=float(znach[0])
T=float(znach[1])
k2=float(znach[2])
Xm=float(znach[3])
A=float(znach[4])
F=float(znach[5])
N=int(znach[6])

import math
vhod=[]
for i in range(N):
	vhod.append(A*math.sin((2*i*math.pi)/F))

import MM1 as mod
yi1=0;yin1=0;yi2=0
vyhod=[]
for xt in vhod:
	xt1=xt-yi2   #отрицательная обратная связь
	[yi1,yin1]=mod.realdvig(xt1,k1,T,yi1,yin1)
	yi2=mod.tahogen(yin1,k2,yi2)
	yt=mod.nechus(yin1,Xm)
	vyhod.append(yt)
```

MM0.py
```py
import MM2
print("y =", MM2.vyhod)
```

main.py
```py
>>> import MM0
k1,T,k2,Xm,A,F,N=5,4,3,10,13,40,20
y = [0, 0, 0, 0, 0, 2.477949838924891, 0, -20.53441412153191, 17.715970981372855, 60.985241346827166, -100.52605254589719, -130.44369177973613, 361.76845433684196, 191.5984158258393, -1110.3384817523201, 0, 3063.4072561608186, -1492.2961077606046, -7685.482903314702, 7891.808692887814]
```


### 3.3. Области действия объектов в модулях.

#### Пример 1

	Попробуйте вставить в функции alpha обращение к функции beta и, наоборот, из beta – к alpha.

Mod2.py
```py
def alpha():
    print('****ALPHA****')
    t=input('Значение t=')
    print('Результат beta(2) из alpha:', beta(2))
    return t

def beta(q):
    import math
    print('Результат alpha() из beta:', alpha())
    expi=q*math.pi
    return math.exp(expi)
```
	Одновременно нельзя функциям обращаться друг к другу, так как возникает рекурсия(обращение функции к самой себе) - происходит зацикливание вывода(пока не прервать)

В отдельных случаях:
main.py
```py
>>> Mod2.alpha()
****ALPHA****
Значение t=10
Результат beta(2) из alpha: 535.4916555247646
'10'
```

```py
>>> Mod2.beta(3)
****ALPHA****
Значение t=10
Результат alpha() из beta: 10
12391.647807916694
```

#### Пример 2

	Попробуйте отобразить на экране в модуле Mod0 значения объектов t и expi.

Mod2.py
```py
#Модуль Mod0
import Mod1
print('perm1=',Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq =',qq)
print('t =',t)
print('expi =',expi)
```

main.py
```py
>>> import Mod0
Mod1:Введите значение = 2
Mod1:Значение perm1= 2
perm1= 2
****ALPHA****
Значение t=1
tt= 1
qq = 23.140692632779267
Traceback (most recent call last):
  File "<pyshell#96>", line 1, in <module>
    import Mod0
  File "C:\Users\vaffl\Desktop\Учеба\ПОАС\TEMA8\Mod0.py", line 10, in <module>
    print('t =',t)
NameError: name 't' is not defined. Did you mean: 'tt'
```
	Переменные t и expi -локальные, они не существуют в Mod0(только во время выполнения функций alpha() и beta())

#### Пример 3

	Попробуйте в модуле Mod0 увеличить в 3 раза значение объекта perm1 и отобразить его после этого на экране.

Mod0.py
```py
#Модуль Mod0
import Mod1
print('perm1=',Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq =',qq)
Mod1.perm1 *= 3 # с указанием модуля
print("perm1 = ", Mod1.perm1)
```

main.py
```py
>>> import Mod0
perm1= 2
****ALPHA****
Значение t=10
tt= 10
qq = 44031505860631.98
perm1 =  222
```

#### Пример 4

	Попробуйте в командной строке (в главном модуле) увеличить в 2 раза значения объектов perm1, tt, qq.

```py
>>> import Mod0
perm1= 222
****ALPHA****
Значение t=1
tt= 1
qq = 23.140692632779267
perm1 =  222222222
>>> perm1*2
Traceback (most recent call last):
  File "<pyshell#112>", line 1, in <module>
    perm1
NameError: name 'perm1' is not defined
>>> tt*2
Traceback (most recent call last):
  File "<pyshell#113>", line 1, in <module>
    tt
NameError: name 'tt' is not defined
>>> qq*2
Traceback (most recent call last):
  File "<pyshell#114>", line 1, in <module>
    qq*2
NameError: name 'qq' is not defined
```
	perm1,tt,qq - локальные объекты, к ним можно обращаться только в модулях, где они были заданы изначально.

## 4. Завершение сеанса работы с IDLE.