# Отчет по теме 8 Володин Денис, А-02-23 ## Пункт 1. Импорт библиотек ```py >>> import os >>> os.getcwd() 'C:\Users\denvo\OneDrive\Рабочий стол\python-labs\TEMA8' >>> import sys, importlib ``` ## Пункт 2. Создание и использование модулей в среде Python. ## Пункт 2.1. Запуск модуля на выполнение путем его импорта. Файл mod1.py содержит команды: ```py perm1 = input('Mod1: Введите значение = ') print('Mod1: Значение perm1 = ', perm1) ``` Файл mod2.py содержит команды: ```py def alpha(): print('****ALPHA****') t=input('Значение t=') return t def beta(q): print('****BETA****') import math expi=q\*math.pi return math.exp(expi) ``` Вызов файла как импортируемого модуля: ```py >>> import mod1 Mod1: Введите значение = 5 Mod1: Значение perm1 = 5 >>> mod1.perm1 '5' >>> import mod1 >>> import mod1 >>> importlib.reload(mod1) Mod1: Введите значение = 6 Mod1: Значение perm1 = 6 >>> mod1.perm1 '6' ``` ## Пункт 2.2. Словарь импортированных модулей ```py >>> print(sorted(sys.modules.keys())) \['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', ' \_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins', 'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools' , 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar shal', 'mod1', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport'] >>> sys.modules.pop('mod1') >>> import mod1 Mod1: Введите значение = 9 Mod1: Значение perm1 = 9 >>> mod1.perm1 '9' ``` Пояснение: принципиальное отличие importlib.reload() от sys.modules.pop() заключается в следующем: importlib.reload() перезагружает модуль, выполняя его код заново, но не удаляет модуль из кэша. Он имеет тот же адрес в памяти и все зависимости от него остаются в силе. sys.modules.pop() убирает модуль из кэша, при повторном импорте он уже будет иметь другой адрес, а старые зависимости ссылаются на пустой объект. ## Пункт 2.3. Запуск модуля на выполнение с помощью функции exec(). ```py >>> exec(open('mod1.py', encoding='utf-8').read()) Mod1: Введите значение = 7 Mod1: Значение perm1 = 7 >>> mod1.perm1 '9' >>> perm1 '7' >>> exec(open('mod1.py', encoding='utf-8').read()) Mod1: Введите значение = 88 Mod1: Значение perm1 = 88 >>> perm1 '88' >>> exec(open('mod1.py', encoding='utf-8').read()) Mod1: Введите значение = 43 Mod1: Значение perm1 = 43 >>> perm1 '43' ``` ## Пункт 2.4. Использование инструкции from … import … ```py >>> sys.modules.pop('mod1') >>> print(sorted(sys.modules.keys())) \['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', ' \_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins', 'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools' , 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar shal', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport'] >>> from mod1 import perm1 Mod1: Введите значение = 90 Mod1: Значение perm1 = 90 >>> print(sorted(sys.modules.keys())) \['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', ' \_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins', 'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools' , 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar shal', 'mod1', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport'] >>> perm1 '90' ``` Как видно, объект mod1 всё же появился в sys.modules.keys(). Аналогично обычному import, при первом импорте команда инициализирует ввод, но при последующих ничего не делает. ```py >>> from mod2 import beta >>> g = beta(2) >>> g ****BETA**** 535.4916555247646 >>> print(sorted(sys.modules.keys())) \['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', ' \_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins', 'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools' , 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar shal', 'math', 'mod1', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport'] >>> h = alpha(2) Traceback (most recent call last): File "", line 1, in NameError: name 'alpha' is not defined >>> from mod2 import alpha as al >>> al() ****ALPHA**** Значение t=90 >>> alpha() Traceback (most recent call last): File "", line 1, in NameError: name 'alpha' is not defined >>> del al, beta >>> from mod2 import alpha as al, beta as bt >>> sys.modules.pop('mod2') >>> sys.modules.pop('mod1') >>> from mod2 import * >>> print(sorted(sys.modules.keys())) \['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', ' \_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins', 'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools' , 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar shal', 'math', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport'] >>> tt = alpha() ****ALPHA**** Значение t=0.12 >>> uu = beta(float(tt)) >>> uu ****BETA**** 1.4578913609506803 ``` ## Пункт 3. Создание многомодульных программ. ## Пункт 3.1. Пример простой многомодульной программы. Создадим файл mod0.py: ```py import Mod1 print('perm1=',Mod1.perm1) from Mod2 import alpha as al tt=al() print('tt=',tt) from Mod2 import beta qq=beta(float(tt)) print('qq=',qq) ``` Вызовем его в терминале, предварительно убедившись, что ни один из трех модулей не упоминается в sys.modules.keys(): ```py >>> print(sorted(sys.modules.keys())) \['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', ' \_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins', 'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools' , 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar shal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport'] >>> import mod0 Mod1: Введите значение = 8 Mod1: Значение perm1 = 8 perm1 = 8 ****ALPHA**** Значение t=2 tt = 2 qq = 535.4916555247646 >>> mod0.tt '2' >>> mod0.qq 535.4916555247646 >>> mod0.perm1 Traceback (most recent call last): File "", line 1, in AttributeError: module 'mod0' has no attribute 'perm1' >>> mod0.mod1.perm1 '8' ``` ## Пункт 3.2. Файл mm0.py: ```py import mm2 print('y =', mm2.vyhod) ``` Файл 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) ``` Тестирование: ```py k1,T,k2,Xm,A,F,N= 5,7,12,0.5,1,7,10 y = [0, 0, -1.6392963604380273, 7.712320198368783, -31.71370650817329, 123.69447513123887, -478.0052891423595, 1843.3538071543967, -7102.275502531218, 27360.667286801297] ``` ## Пункт 3.3. Области действия объектов в модулях ```py #пример 1 def alpha(): print('****ALPHA****') t=input('Значение t=') beta(int(t)) return t def beta(q): import math expi=q*math.pi return math.exp(expi) Mod1: Введите значение = 8 Mod1: Значение perm1 = 8 perm1 = 8 ****ALPHA**** Значение t=5 tt = 5 qq = 6635623.99934113 # пример 2 def alpha(): print('****ALPHA****') t=input('Значение t=') return t def beta(q): import math expi = int(alpha())*math.pi return math.exp(expi) Mod1: Введите значение = 8 Mod1: Значение perm1 = 8 perm1 = 8 ****ALPHA**** Значение t=5 tt = 5 ****ALPHA**** Значение t=5 qq = 6635623.99934113 # пример 3 #Модуль mod0 import mod1 print('perm1 = ', mod1.perm1) from mod2 import alpha as al tt = al() print('tt = ', tt) from mod2 import beta qq=beta(float(tt)) print('qq = ', qq) print(f't = {al.t}, expi = {beta.expi}') Traceback (most recent call last): File "C:\\Users\\denvo\\OneDrive\\Рабочий стол\\python-labs\\TEMA8\\mod0.py", line 10, in print(f't = {al.t}, expi = {beta.expi}') ^^^^ AttributeError: 'function' object has no attribute 't' Traceback (most recent call last): File "C:\\Users\\denvo\\OneDrive\\Рабочий стол\\python-labs\\TEMA8\\mod0.py", line 10, in print(f't = {al}, expi = {beta.expi}') ^^^^^^^^^ AttributeError: 'function' object has no attribute 'expi' ``` Не получится вызвать эти переменные по их непосредственному имени (t и expi), упоминая объекты, атрибутами которых они являются, без изменения кода (например, объявления t в alpha как глобальную переменную. Но, так как мы знаем, что alpha возвращает t, то узнать t можем по имени al. С expi и beta так не получится: ```py # пример 4 #Модуль 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 * 3 =", Mod1.perm1) Mod1: Введите значение = 1 Mod1: Значение perm1 = 1 perm1 = 1 ****ALPHA**** Значение t = 2 tt = 2 ****BETA**** qq = 535.4916555247646 perm1 * 3 = 111 # пример 5 >>> mod0.mod1.perm1 \* 2 '99' >>> mod0.tt * 2 '77' >>> mod0.qq * 2 7106642561.694082 >>> int(mod0.mod1.perm1)\*2 18 >>> int(qq)*2 Traceback (most recent call last): File "", line 1, in qq *= 2 NameError: name 'qq' is not defined ``` perm1 и tt, как упоминалось ранее, имеют строковый тип, так что умножение дублирует содержимое строки. Чтобы именно увеличить значение надо использовать int. Без использования указания на модуль не получится увеличить