Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

398 строки
11 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Отчёт по Теме 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.