Files
python-labs/TEMA8/report.md
2026-03-01 19:45:06 +03:00

302 строки
20 KiB
Markdown
Исходник Ответственный История

Этот файл содержит неоднозначные символы Юникода
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Отчет по теме 8. Модули и структурирование программы.
Филиппова Евгения, А-01-23
## 1. Запуск интерактивной оболочки IDLE.
Цель работы: Изучение способов разработки программ, состоящих из нескольких частей – модулей, и обеспечения взаимодействия этих частей при выполнении программы.
```py
import os,sys,importlib
os.chdir(r'C:\Users\filip\Desktop\python-labs\TEMA8')
os.getcwd()
'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8'
```
## 2. Создание и использование модулей в среде Python.
Модуль - любая часть программного кода на этом языке, записанная в отдельном вайле. В языке Python модули также являютс объектами класса module.
## 2.1. Запуск модуля на выполнение путем его импорта.
```py
import Mod1
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
type(Mod1)
<class 'module'>
dir(Mod1)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'perm1']
Mod1.perm1
'5'
importlib.reload(Mod1)
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
<module 'Mod1' from 'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8\\Mod1.py'>
Mod1.perm1
'3'
```
## 2.2. Cловарь - значение атрибута sys.modules.
Импортированные модули заносятся в словарь:
```py
print(sorted(sys.modules.keys()))
['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_distutils_hack', '_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', '_suggestions', '_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', 'encodings.utf_8_sig', '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']
```
Для возможности повторного импорта и выполнения программы из модуля, его нужно удалить:
```py
sys.modules.pop('Mod1')
<module 'Mod1' from 'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8\\Mod1.py'>
```
Проверим, исчез ли модуль из словаря:
```py
print(sorted(sys.modules.keys()))
['__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_distutils_hack', '_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', '_suggestions', '_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', 'encodings.utf_8_sig', '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 из словаря:
```py
import Mod1
Mod1:Введите значение = 3
Mod1:Значение perm1= 3
print(sorted(sys.modules.keys()))
['Mod1', '__future__', '__main__', '_abc', '_ast', '_bisect', '_bz2', '_codecs', '_collections', '_collections_abc', '_colorize', '_compat_pickle', '_compression', '_datetime', '_distutils_hack', '_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', '_suggestions', '_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', 'encodings.utf_8_sig', '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\\filip\\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', '_distutils_hack', '_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', '_suggestions', '_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', 'encodings.utf_8_sig', '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']
```
## 2.3. Запуск модуля на выполнение с помощью функции exec().
При запуске модуля с функцией exec() не требуется его импортировать. При этом объект-модуль не создается. Созданные при выполнении модуля объекты становятся объектами главной программы.
```py
exec(open('Mod1.py').read())
Mod1:РведиСРµ Р·РЅР°Сение = 1
Mod1:РРЅР°Сение perm1= 1
perm1
'1'
exec(open('Mod1.py').read())
Mod1:РведиСРµ Р·РЅР°Сение = 2
Mod1:РРЅР°Сение perm1= 2
perm1
'2'
exec(open('Mod1.py').read())
Mod1:РведиСРµ Р·РЅР°Сение = 3
Mod1:РРЅР°Сение perm1= 3
perm1
'3'
```
## 2.4. Использование инструкции from... import...
Импорт части содержащихся в модуле объектов, пример 1:
```py
from Mod1 import perm1
Mod1:Введите значение = 5
Mod1:Значение perm1= 5
'Mod1' in sys.modules
True
'Mod1' in dir()
False
'perm1' in dir()
True
```
Объект Mod1 есть в памяти, так как даже если осуществляется импорт не модуля целиком, а только 1 переменная, Python загружает его в память полностью при любом импорте. Но в пространстве имен Mod1 нет. Объект perm1 имеет заданное значение, потому что в модуле написано input().
Пример 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)
```
Далее в командной строке:
```py
from Mod2 import beta
g=beta(2)
print(g)
535.4916555247646
'Mod2' in sys.modules
True
alpha()
Traceback (most recent call last):
File "<pyshell#64>", 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))
print(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)
```
Затем:
```py
#Удаление всех имен модулей
sys.modules.pop('Mod1')
Traceback (most recent call last):
File "<pyshell#93>", line 1, in <module>
sys.modules.pop('Mod1')
KeyError: 'Mod1'
sys.modules.pop('Mod2')
<module 'Mod2' from 'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8\\Mod2.py'>
import Mod0
Mod1:Введите значение = 1
Mod1:Значение perm1= 1
perm1= 1
****ALPHA****
Значение t=2
tt= 2
qq= 535.4916555247646
#все значения объектов
Mod0.tt;Mod0.qq;Mod0.Mod1.perm1
'2'
535.4916555247646
'1'
```
## 3.2. Пример:
Были созданы модули MM1 - функции усилитель, реальный двигатель, тахогенератор и нелинейное звено; MM2 - ввод параметров задачи, формирование входного сигнала, импрорт ММ1 и расчет выходного сигнала; ММ0 - запуск модуля ММ2 и вывод выходного сигнала (из Темы 7):
```py
import MM0
k1,T,k2,Xm,A,F,N=2, 5, 0.5, 0.2, 5, 20, 100
y= [0, 0.3150283239582457, 1.6380226270845315, 3.6967043784742186, 5.955740810204715, 7.437355146693178, 6.916652739856338, 3.3045117204053454, -3.436632999762453, -13.377122400429725, -23.902573625399846, -31.413425757013954, -31.607821447858264, -20.772586100222156, 2.11270692631765, 35.30602439138285, 70.91993062949682, 96.93440494343562, 99.12900473346, 65.38348872784154, -8.327676904827948, -114.14057608527706, -226.85021011146713, -307.0967019203927, -308.8377256916654, -193.5696660101084, 51.01933507765006, 395.33583228776763, 756.133884648419, 1004.146305096583, 990.2646197776188, 592.5453813658195, -223.89399528084132, -1353.0198741465508, -2517.0845917069096, -3290.799148701165, -3190.6404746339663, -1830.2106297066937, 885.4823487918924, 4584.145494231121, 8338.074558072989, 10748.861155895518, 10249.31678648254, 5616.61253286302, -3395.8903138692544, -15492.862030077773, -27577.795704976375, -35056.60179382386, -32854.53664822822, -17109.753979655143, 12771.37059301769, 52304.40329194675, 91162.46093366834, 114263.89381920217, 105190.55370550934, 51773.02890240319, -47226.37305314174, -176340.0737276588, -301158.2756604727, -372203.3514180253, -336403.0484315321, -155497.20672475465, 172246.2163168153, 593647.6564708133, 994156.0382059023, 1211560.9131300563, 1074452.5986176156, 462840.9230725401, -621330.3758980577, -1995747.4630206777, -3279411.6114615267, -3940880.1907856367, -3427039.528661954, -1362601.5792743566, 2221100.4359796937, 6700673.051886699, 10810025.37459586, 12809190.093940038, 10915000.463542966, 3957182.5623847847, -7879855.109776793, -22469600.257783413, -35608334.0947499, -41603169.08800506, -34710893.26010073, -11294209.422974238, 27775182.21076063, 75259300.4364765, 117212473.34737757, 135021112.4400896, 110205787.39593415, 31502860.45670514, -97356878.23581645, -251787814.75216538, -385563446.86640865, -437865750.882735, -349295989.55543554, -85116841.91247615, 339589601.3143321, 841470525.1399062]
```
## 3.3. Области действия объектов в модуле.
В функции alpha обращение к beta:
```py
importlib.reload(Mod2)
<module 'Mod2' from 'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8\\Mod2.py'>
from Mod2 import alpha
alpha()
****ALPHA****
Значение t=2
beta : 535.4916555247646
'2'
```
В функции beta обращение к alpha:
```py
importlib.reload(Mod2)
<module 'Mod2' from 'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8\\Mod2.py'>
from Mod2 import beta
beta(0.12)
****ALPHA****
Значение t=2
1.4578913609506803
```
Попытка отобразить t и expi в Mod0:
```py
importlib.reload(Mod0)
perm1= 1
****ALPHA****
Значение t=2
tt= 2
qq= 535.4916555247646
Traceback (most recent call last):
File "<pyshell#140>", line 1, in <module>
importlib.reload(Mod0)
File "C:\Users\filip\AppData\Local\Programs\Python\Python313\Lib\importlib\__init__.py", line 129, in reload
_bootstrap._exec(spec, module)
File "<frozen importlib._bootstrap>", line 866, in _exec
File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "C:\Users\filip\Desktop\python-labs\TEMA8\Mod0.py", line 10, in <module>
print(t)
NameError: name 't' is not defined. Did you mean: 'tt'?
```
t и expi локальны внутри функций, не видны снаружи.
Увеличение perm1 в 3 раза в Mod0:
```py
importlib.reload(Mod0)
perm1*3= 3
```
Увеличение perm1, tt, qq в командной строке:
```py
importlib.reload(Mod0)
perm1= 1
****ALPHA****
Значение t=2
tt= 2
qq= 535.4916555247646
<module 'Mod0' from 'C:\\Users\\filip\\Desktop\\python-labs\\TEMA8\\Mod0.py'>
Mod1.perm1=Mod1.perm1*2
tt=tt*2
Traceback (most recent call last):
File "<pyshell#161>", line 1, in <module>
tt=tt*2
NameError: name 'tt' is not defined
qq=qq*2
Traceback (most recent call last):
File "<pyshell#162>", line 1, in <module>
qq=qq*2
NameError: name 'qq' is not defined
Mod0.tt=Mod0.tt*2
Mod0.tt
'22'
Mod0.qq=Mod0.qq*2
Mod0.qq
1070.9833110495292
```
Выводы о видимости объектов:
- perm1 in Mod1(global),
- alpha and beta in Mod2(global),
- t in Mod2(local) - только внутри alpha,
- expi in Mod2(local) - только внутри beta,
- tt in Mod0(global),
- qq in Mod0(global).
## 4. Сеанс работы с IDLE закончен.