diff --git a/TEMA8/report.md.txt b/TEMA8/report.md.txt new file mode 100644 index 0000000..f168b85 --- /dev/null +++ b/TEMA8/report.md.txt @@ -0,0 +1,398 @@ +# Отчёт по Теме 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) + +>>> dir(Mod1) +['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1'] +``` + +Повторное обращение к Mod1 в main: +```py +>>> import Mod1 # требуется перезагрузить +>>> importlib.reload(Mod1) +Mod1:Введите значение = 6 +Mod1:Значение perm1= 6 + +>>> 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') + +>>> 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 "", line 1, in + 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): + 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 "", line 1, in + import Mod0 + File "C:\Users\vaffl\Desktop\Учеба\ПОАС\TEMA8\Mod0.py", line 10, in + 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 "", line 1, in + perm1 +NameError: name 'perm1' is not defined +>>> tt*2 +Traceback (most recent call last): + File "", line 1, in + tt +NameError: name 'tt' is not defined +>>> qq*2 +Traceback (most recent call last): + File "", line 1, in + qq*2 +NameError: name 'qq' is not defined +``` + perm1,tt,qq - локальные объекты, к ним можно обращаться только в модулях, где они были заданы изначально. + +## 4. Завершение сеанса работы с IDLE. \ No newline at end of file