форкнуто от main/python-labs
Родитель
c7ec4afefe
Сommit
a83d73e78b
@ -1,398 +0,0 @@
|
|||||||
# Отчёт по Теме 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.
|
|
||||||
Загрузка…
Ссылка в новой задаче