# Отчет по Теме 8 Зеленкина Ксения, А-02-23 ## 1. Начало работы. Запустила интерактивную оболочку IDLE и открыла окно текстового редактора, куда буду фиксировать мои дальнейшие действия. Начинём сеанс работы с IDLE со следующих инструкций: ```py import os,sys,imp #Импорт трёх важных вспомогательных модулей os.chdir('<Путь к рабочему каталогу>') #Делаем рабочий каталог текущим os.getcwd() #Контролируем корректность установки текущего каталога ``` _В новых версиях Python вместо модуля imp используется importlib._ ## 2. Создание и использование модулей в среде Python. Модулем в среде Python называется любая часть программного кода на этом языке, записанная в отдельном файле . В языке Python модули также являются объектами класса __module__. #### 2.1. Запуск модуля на выполнение путем его импорта. С помощью текстового редактора оболочки IDLE создайте в своем текущем каталоге файл с именем Mod1.py и запишите в него программу со следующим содержанием: _Код:_ ```py perm1=input('Mod1:Введите значение = ') print('Mod1:Значение perm1=',perm1) ``` Обратим внимание на заголовок окна редактора с текстом модуля: пока введенный или измененный текст в этом окне не сохранен в файле, в заголовке перед именем файла стоит символ «*». Запустим модуль по следующей инструкции: _Код:_ ```py import Mod1 ``` _Вывод:_ ```py Mod1:Введите значение = 5 Mod1:Значение perm1= 5 ``` Определим класс модуля __Mod1__. _Код:_ ```py type(Mod1) ``` _Вывод:_ ```py ``` Получим список атрибутов. _Код:_ ```py dir(Mod1) ``` _Вывод:_ ```py ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1'] ``` Получим доступ к значению созданного в модуле объекта __perm1__ – атрибута модуля __Mod1__ - с помощью инструкции: _Код:_ ```py Mod1.perm1 ``` _Вывод:_ ```py '5' ``` Попробуем повторно выполнить модуль с помощью инструкции импорта: _Код:_ ```py import Mod1 ``` _Вывод:_ ```py (пусто) ``` Запуск программы не происходит! Для повторного выполнения ранее импортированного модуля следует применить функцию __reload__ из модуля __imp__/__implib__: _Код:_ ```py importlib.reload(Mod1) ``` _Вывод:_ ```py Mod1:Введите значение = 3 Mod1:Значение perm1= 3 ``` Проверим, что это значение стало значением объекта __perm1__. _Код:_ ```py Mod1.perm1 ``` _Вывод:_ ```py '3' ``` #### 2.2 Атрибут sys.modules Импортированные модули заносятся в словарь – значение атрибута __sys.modules__. Их можно увидеть по инструкции _Код:_ ```py print(sorted(sys.modules.keys())) ``` _Вывод:_ ```py ['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_operator', '_pickle', '_queue', '_random', '_sha2', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_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', 'typing.io', 'typing.re', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib'] ``` Видим в словаре __Mod1__. Для обеспечения возможности повторного импорта и, следовательно, выполнения программы из модуля, его надо удалить из этого словаря: _Код:_ ```py sys.modules.pop('Mod1') ``` Еще раз отобразим словарь м убедимся, что модуль __Mod1__ из него исчез. _Код:_ ```py print(sorted(sys.modules.keys())) ``` _Вывод:_ ```py ['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_operator', '_pickle', '_queue', '_random', '_sha2', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_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', 'typing.io', 'typing.re', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib'] ``` __Mod1__ нет в словарь. Повторим импорт и проверим, что записанная в нем программа будет снова выполнена: _Код:_ ```py import Mod1 ``` _Вывод:_ ```py Mod1:Введите значение = 4 Mod1:Значение perm1= 4 ``` _Код:_ ```py Mod1.perm1 ``` _Вывод:_ ```py '4' ``` Данная программа снова выполнилась. Снова удалим __Mod1__ из словаря: _Код:_ ```py sys.modules.pop('Mod1') 'Mod1' in sys.modules ``` _Вывод:_ ```py False ``` #### 2.3. Запуск модуля на выполнение с помощью функции exec(). Запуск модуля на выполнение может быть произведен с использованием ранее изученной функции exec. При этом модуль не требуется импортировать. Функция exec действует так, как будто на месте обращения к ней в программу вставлен код из объекта-аргумента функции. __Внимание:__ объект-модуль при этом не создается! Созданные при выполнении модуля объекты становятся объектами главной программы! _Пример._ _Код:_ ```py exec(open('Mod1.py').read()) ``` Эту функцию можно вызывать любое число раз и каждый раз будет выполняться программа из модуля. Попробуем запустить модуль на выполнение 3 раза, каждый раз задавая разные значения в ответ на запрос программы. _Код:_ ```py exec(open('Mod1.py').read()) ``` _Вывод:_ ```py Mod1:Введите значение = 2 Mod1:Значение perm1= 2 ``` _Код:_ ```py exec(open('Mod1.py').read()) ``` _Вывод:_ ```py Mod1:Введите значение = 3 Mod1:Значение perm1= 3 ``` _Код:_ ```py exec(open('Mod1.py').read()) ``` _Вывод:_ ```py Mod1:Введите значение = 20 Mod1:Значение perm1= 20 ``` Выводим на экран значение объекта perm1. perm1 _Код:_ ```py perm1 ``` _Вывод:_ ```py '20' ``` #### 2.4 Использование инструкции from … import … В одном модуле может содержаться несколько программных единиц (например, функций или пользовательских объектов). Тогда можно осуществлять импорт модуля не целиком, а только часть содержащихся в нем объектов. __Пример 1.__ _Код:_ ```py from Mod1 import perm1 ``` _Вывод:_ ```py Mod1:Введите значение = 30 Mod1:Значение perm1= 30 ``` Проверим, появился ли в памяти объект __Mod1__. _Код:_ ```py print(sorted(sys.modules.keys())) ``` _Вывод:_ ```py ['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_operator', '_pickle', '_queue', '_random', '_sha2', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_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', 'typing.io', 'typing.re', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib'] ``` _Код:_ ```py perm1 ``` _Вывод:_ ```py '30' ``` Проверьте, появился ли в памяти объект Mod1? - ДА Вызвалась ли на выполнение программа из этого модуля? - ДА Какое значение имеет объект perm1 и почему? - Имеет значение '30'. perm1 имеет значение '30', потому что мы его ввели при выполнении модуля во время импорта. __Пример 1.__ С помощью текстового редактора создадим еще один модуль __Mod2__, содержащий две функции: ```py def alpha(): print('****ALPHA****') t=input('Значение t=') return t def beta(q): import math expi=q*math.pi return math.exp(expi) ``` Сохраним модуль в текущем каталоге в файле __Mod2.py__. Импортируйте из этого модуля только функцию __beta__ с помощью инструкции: _Код:_ ```py from Mod2 import beta ``` Теперь можно использовать эту функцию: _Код:_ ```py g=beta(2) ``` _Вывод:_ ```py ****BETA**** ``` Выведим на экран значение объекта __g__. _Код:_ ```py g ``` _Вывод:_ ```py 535.4916555247646 ``` Проверим, появился ли в памяти объект __Mod2__. _Код:_ ```py print(sorted(sys.modules.keys())) ``` _Вывод:_ ```py ['Mod1', 'Mod2', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_compat_pickle', '_compression', '_datetime', '_frozen_importlib', '_frozen_importlib_external', '_functools', '_heapq', '_imp', '_io', '_lzma', '_opcode', '_operator', '_pickle', '_queue', '_random', '_sha2', '_signal', '_sitebuiltins', '_socket', '_sre', '_stat', '_string', '_struct', '_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', 'typing.io', 'typing.re', 'urllib', 'urllib.parse', 'warnings', 'weakref', 'winreg', 'xml', 'xml.parsers', 'xml.parsers.expat', 'xml.parsers.expat.errors', 'xml.parsers.expat.model', 'zipimport', 'zlib'] ``` Объект __Mod2__ появился. Убедимся, что функция __alpha__ не была импортирована, попробовав запустить ее на выполнение: _Код:_ ```py alpha() ``` _Вывод:_ ```py Traceback (most recent call last): File "", line 1, in alpha() NameError: name 'alpha' is not defined ``` _Код:_ ```py from Mod2 import alpha as al al() ``` _Вывод:_ ```py ****ALPHA**** Значение t=7 '7' ``` Удалим импортированные объекты: _Код:_ ```py del al,beta ``` _Код:_ ```py from Mod2 import alpha as al, beta as bt bt(2) al() ``` _Вывод:_ ```py ****BETA**** 535.4916555247646 ****ALPHA**** Значение t=8 '8' ``` Вновь удалим импортированные объекты: _Код:_ ```py del al,bt ``` Теперь сделаем импорт всего содержимого модуля __Mod2__ инструкцией. _Код:_ ```py from Mod2 import * tt=alpha() uu=beta(float(tt)) ``` _Вывод:_ ```py ****ALPHA**** Значение t=30 >> uu=beta(float(tt)) ****BETA**** >> uu 8.536711709556478e+40 ``` ## 3. Создание многомодульных программ. #### 3.1. Пример простой многомодульной программы. С помощью редактора создадим ещё один модуль: ```py import Mod1 print('perm1=',Mod1.perm1) from Mod2 import alpha as al tt=al() print('tt=',tt) from Mod2 import beta qq=beta(float(tt)) print('qq=',qq) ``` Перед проверкой такой программы удалите из словаря sys.modules имена всех этих модулей. ```py sys.modules.pop('Mod1') sys.modules.pop('Mod2') ``` Запустим программу на выполнение инструкцией: _Код:_ ```py import Mod0 ``` _Вывод:_ ```py Mod1:Введите значение = 7 Mod1:Значение perm1= 7 perm1= 7 ****ALPHA**** Значение t=3 tt= 3 ****BETA**** qq= 12391.647807916694 ``` Отобразим в командном окне значения объектов, созданных во время выполнения программы: _Код:_ ```py import Mod0Mod0.tt;Mod0.qq;Mod0.Mod1.perm1 ``` _Вывод:_ ```py '3' 12391.647807916694 '7' ``` #### 3.2. Еще пример. Создадим модуль __MM1__, включив в него (скопировать из текста _темы 7_) разработанные при вы-полнении предыдущей темы функции, реализующие усилитель, реальный двигатель, тахогенера-тор и нелинейное звено типа «зона нечувствительности». Затем создадим модуль __ММ2__, включив в него инструкции, обеспечивающие ввод параметров задачи, формирование входного сигнала, им-порт модуля __ММ1__ и реализацию модели при расчете выходного сигнала: _Код в MM1:_ ```py def realdvig(xtt,kk1,TT,yti1,ytin1): #Модель реального двигателя yp=kk1*xtt #усилитель yti1=yp+yti1 #Интегратор ytin1=(yti1+TT*ytin1)/(TT+1) return [yti1,ytin1] def tahogen(xtt,kk2,yti2): #Модель тахогенератора yp=kk2*xtt #усилитель yti2=yp+yti2 #интегратор return yti2 def nechus(xtt,gran): #зона нечувствительности if xtt(-gran): ytt=0 elif xtt>=gran: ytt=xtt-gran elif xtt<=(-gran): ytt=xtt+gran return ytt ``` _Код в MM2:_ ```py znach=input('k1,T,k2,Xm,A,F,N=').split(',') k1=float(znach[0]) T=float(znach[1]) k2=float(znach[2]) Xm=float(znach[3]) A=float(znach[4]) F=float(znach[5]) N=int(znach[6]) import math vhod=[] for i in range(N): vhod.append(A*math.sin((2*i*math.pi)/F)) import MM1 as mod yi1=0;yin1=0;yi2=0 vyhod=[] for xt in vhod: xt1=xt-yi2 #отрицательная обратная связь [yi1,yin1]=mod.realdvig(xt1,k1,T,yi1,yin1) yi2=mod.tahogen(yin1,k2,yi2) yt=mod.nechus(yin1,Xm) vyhod.append(yt) ``` Cоздадим главную программу – модуль __ММ0__, запускающую на выполнение модуль __ММ2__ и выводящую полученный выходной сигнал. _Код в MM0:_ ```py znach=input('k1,T,k2,Xm,A,F,N=').split(',') import MM2 print('y=',MM2.vyhod) ``` Запустим модуль: _Код:_ ```py import MM0 ``` _Вывод:_ ```py k1,T,k2,Xm,A,F,N=2.0,0.5,0.1,0.3,1.0,10,50 y= [0, 0.4837136697232975, 1.9085317587281618, 3.252580419663127, 3.6116668632828017, 2.337163316303042, -0.017205672773565883, -3.9735974048495555, -7.694183730612065, -9.785915404851563, -9.20619313821322, -5.684780136463871, 0, 6.0648659051821046, 11.557535237484812, 14.327930282057972, 13.456796190056922, 9.053217875186638, 2.2250624360017253, -4.663598684084722, -10.92690153687042, -14.501117759249846, -14.721127718256962, -11.820251893705713, -6.747408907477821, -0.7946360160839683, 4.213684642786436, 8.621001586440592, 11.43851708016392, 12.64532483189202, 12.372900361759408, 10.7013921058286, 7.581031992524821, 2.9269169944267426, -2.5530669165299082, -9.51164521262539, -16.238582611807068, -21.167523715780103, -22.634796225912915, -19.405844689307024, -11.200325508823996, 0.3811399571845728, 14.28146387608062, 26.81054542912841, 34.78344511767276, 35.77611116596963, 28.84817084233142, 14.909243930400418, -2.7945777016815705, -21.65639219491944] ``` Колебания с каждым разом становятся все сильнее и сильнее. #### 3.3. Области действия объектов в модулях. В ранее созданных модулях вводятся и используются следующие объекты: __Mod1: perm1__ __Mod2:__ функции __alpha, beta;__ переменные __t, expi__ __Mod0:__ переменные __tt,qq__ Проведите следующие эксперименты: - Попробуйте вставить в функции alpha обращение к функции beta и, наоборот, из beta – к alpha. - Попробуйте отобразить на экране в модуле Mod0 значения объектов t и expi. - Попробуйте в модуле Mod0 увеличить в 3 раза значение объекта perm1 и отобразить его после этого на экране. - Попробуйте в командной строке (в главном модуле) увеличить в 2 раза значения объектов perm1, tt, qq. _Код:_ ```py >> import Mod1 #Модуль 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) # Новые строчки: perm1 = Mod1.perm1*3 print("perm1*3= ", perm1) ``` _Вывод:_ ```py Mod1:Введите значение = 5 Mod1:Значение perm1= 5 perm1= 5 ****ALPHA**** Значение t=3 tt= 3 ****BETA**** qq= 12391.647807916694 perm1*3= 555 ``` При импорте __Mod1__ выполнился его код с вводом значения 5, затем функция __alpha__ вернула tt=3, которая передалась в __beta__ для вычисления __qq__=12391.6, а умножение __perm1__ создало новую переменную со значением 15 в модуле __Mod0__, не изменяя оригинальный __perm1__=5 в модуле __Mod1__. _Код:_ ```py import Mod1 Mod1:Введите значение = 5 Mod1:Значение perm1= 5 >> Mod1.perm1 '5' >> Mod1.perm1 = Mod1.perm1 * 2 >> Mod1.perm1 '55' >> from Mod2 import alpha as al >> al() ****ALPHA**** Значение t=9 '9' qq= 573502.6262733063 >> perm1 = perm1*2 >> tt '44' >> tt = tt * 2 '4444' >> qq 573502.6262733063 >> qq = qq * 2 1147005.2525466126 >> perm1 = 8 >> perm1 = perm1 * 8 >> perm1 64 ``` Переменные из разных модулей и основного кода не связаны между собой. Переменная __Mod1.perm1__ из модуля и __perm1__ в основном коде - это совершенно разные переменные. __Mod1.perm1__ была строкой "5". __tt__ тоже была строка "44" __qq__ было числом. __perm1__ в основном коде создалась тоже как число. # Завершение работы