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

29 KiB

Отчёт по Теме 7

Похил Анастасия, А-02-23

1. Запуск интерактивной оболочки IDLE

2. Создание пользовательской функции

Создание функции предполагает выполнение трех операций: формирование функции, ее сохра-нение и использование. В общем виде функция в языке Python представляется так: def <Имя функции>([<Список аргументов >]): [<отступы>"""<Комментарий по назначению функции>"""] <отступы><Блок инструкций – тело функции> [<отступы>return <Значение или вычисляемое выражение>]

2.1 Функция без аргументов

ef uspeh():
	"""Подтверждение успеха операции"""
	print('Выполнено успешно!')

uspeh()
Выполнено успешно!
dir(uspeh)
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__']
type(uspeh)
<class 'function'>
help(uspeh)
Help on function uspeh in module __main__:

uspeh()
    Подтверждение успеха операции

2.2 Функция с аргументами

def sravnenie(a,b):
	"""Сравнение a и b"""
	if a>b:
		print(a,' больше ',b)
	elif a<b:
		print(a, ' меньше ',b)
	else:
		print(a, ' равно ',b)

n,m=16,5;sravnenie(n,m)
16  больше  5
sravnenie("abc", "abcd")
abc  меньше  abcd

Функция универсальна и будет работать с любыми типами данных, для которых определены операторы сравнения >, <, == (числа, строки, списки, кортежи и др.)Сравнение строк происходит по алфавиту, так же значение имеет регистр букв (заглавные меньше строчных), более короткая строка считается меньшей.

2.3 Пример функции, содержащей return.

def logistfun(b,a):
	"""Вычисление логистической функции"""
	import math
	return a/(1+math.exp(-b))

    
v,w=1,0.7;z=logistfun(w,v)
z
0.6681877721681662

2.4 Сложение для разных типов аргументов

def slozh(a1,a2,a3,a4):
	""" Сложение значений четырех аргументов"""
	return a1+a2+a3+a4
slozh(1,2,3,4)
10
slozh('1','2','3','4')
'1234'
b1=[1,2];b2=[-1,-2];b3=[0,2];b4=[-1,-1]
q=slozh(b1,b2,b3,b4)
q
[1, 2, -1, -2, 0, 2, -1, -1]
t1 = (1, 2); t2 = (3, 4); t3 = (5,); t4 = (6, 7, 8)
slozh(t1, t2, t3, t4)
(1, 2, 3, 4, 5, 6, 7, 8)
d1 = {'a': 1}; d2 = {'b': 2}
slozh(d1, d2, {}, {})
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
s1 = {1, 2}; s2 = {2, 3}
slozh(s1, s2, set(), set())
TypeError: unsupported operand type(s) for +: 'set' and 'set'

Как видно сложение для множеств и словарей не применимо. ункция slozh работает только для тех типов данных, которые поддерживают оператор +.

2.5 Функция, реализующая модель некоторого устройства, на вход которого в текущий момент поступает сигнал х, на выходе получается сигнал y:

def inerz(x,T,ypred):
	""" Модель устройства с памятью:
x- текущее значение вх.сигнала,
	T -постоянная времени,
	ypred - предыдущее значение выхода устройства"""
	y=(x+T*ypred)/(T+1)
	return y

sps=[0]+[1]*100
spsy=[] #Заготовили список для значений выхода
TT=20 #Постоянная времени
yy=0  #Нулевое начальное условие
for xx in sps:
	yy=inerz(xx,TT,yy)
	spsy.append(yy)

import matplotlib.pyplot as plt
plt.plot(sps, 'r-', label='Вход')
[<matplotlib.lines.Line2D object at 0x000001B544DC4E10>]
plt.plot(spsy, 'b-', label='Выход')
[<matplotlib.lines.Line2D object at 0x000001B544DF5090>]
plt.grid(True)
plt.legend()
<matplotlib.legend.Legend object at 0x000001B544DD1E80>
plt.show()

График

3. Функции как объекты

3.1 Получение списка атрибутов объекта-функции

dir(inerz)
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__']
inerz.__doc__
'Модель устройства с памятью:\nx- текущее значение вх.сигнала,\n        T -постоянная времени,\n        ypred - предыдущее значение выхода устройства'
help(inerz)
Help on function inerz in module __main__:

inerz(x, T, ypred)
    Модель устройства с памятью:
    x- текущее значение вх.сигнала,
            T -постоянная времени,
            ypred - предыдущее значение выхода устройства

Атрибут doc содержит значение docstring, если при инициализации функции он был задан. Если не был, то inerz.doc будет иметь значение None.

3.2 Сохранение ссылки на объект-функции в другой переменной

fnkt=sravnenie
v=16
fnkt(v,23)
16  меньше  23

Функции можно передавать в переменные, как и любые другие объекты. После этого переменная fnkt ссылается на ту же самую функцию, что и sravnenie.

3.3 Возможность альтернативного определения функции в программе

typ_fun=8
if typ_fun==1:
	def func():
		print('Функция 1')
else:
	def func():
		print('Функция 2')

func()
Функция 2

Программа выводит сообщение "Функция 2", потому что переменная typ_fun не равна 1, и выполняется блок else, в котором функция func определена как выводящая "Функция 2".

4. Аргументы функции

4.1 Возможность использования функции в качестве аргумента другой функции

def fun_arg(fff,a,b,c):
	"""fff-имя функции, используемой 
	в качестве аргумента функции fun_arg"""
	return a+fff(c,b)

zz=fun_arg(logistfun,-3,1,0.7)
zz
-2.3318122278318336

Python передаёт ссылку на объект функции logistfun в переменную fff.

4.2 Обязательные и необязательные аргументы

def logistfun(a,b=1):   #Аргумент b – необязательный; значение по умолчанию=1
	"""Вычисление логистической функции"""
	import math
	return b/(1+math.exp(-a))

logistfun(0.7)     #Вычисление со значением b по умолчанию
0.6681877721681662
logistfun(0.7,2)  #Вычисление с заданным значением b
1.3363755443363323

4.3 Возможность обращения к функции с произвольным (непозиционным) расположением аргументов.

При этом надо в обращении к функции указывать имена аргументов.

logistfun(b=0.5,a=0.8)  # Ссылки на аргументы поменялись местами
0.34498724056380625

4.4 Пример со значениями аргументов функции, содержащимися в списке или кортеже

b1234=[b1,b2,b3,b4]  # Список списков из п.2.4
qq=slozh(*b1234)  #Перед ссылкой на список или кортеж надо ставить звездочку
qq
[1, 2, -1, -2, 0, 2, -1, -1]

Количество элементов в списке должно совпадать с количеством параметров функции. Оператор * выполняет распаковку списка в аргументы функции.

4.5 Пример со значениями аргументов функции, содержащимися в словаре

dic4={"a1":1,"a2":2,"a3":3,"a4":4}
qqq=slozh(**dic4)  #Перед ссылкой на словарь надо ставить две звездочки
qqq
10
slozh(*dic4)
'a1a2a3a4'

Для ** распаковки имена ключей должны точно совпадать с именами параметров функции

4.6 Смешанные ссылки

e1=(-1,6);dd2={'a3':3,'a4':9}
qqqq=slozh(*e1,**dd2)
qqqq
17

4.7 Переменное число аргументов у функции

def func4(*kort7):
	"""Произвольное число аргументов в составе кортежа"""
	smm=0
	for elt in kort7:
		smm+=elt
	return smm

func4(-1,2)  #Обращение к функции с 2 аргументами
1
func4(-1,2,0,3,6)  #Обращение к функции с 5 аргументами
10

Функция принимает любое количество аргументов

4.8 Комбинация аргументов

def func4(a,b=7,*kort7): #Аргументы: a-позиционный, b- по умолчанию + кортеж
	"""Кортеж - сборка аргументов - должен быть последним!"""
	smm=0
	for elt in kort7:
		smm+=elt
	return a*smm+b

func4(-1,2,0,3,6)
-7

a = -1 (первый позиционный) b = 2 (второй позиционный, переопределил значение по умолчанию 7) *kort7 = (0, 3, 6) (все остальные аргументы в кортеж) Если мы не хотим передавать b, придется переопределить функцию так, чтобы именованный параметр b был в конце, а позиционный кортеж - перед ним.

Подобным же образом в списке аргументов функции также можно использовать словарь.

def func5(a, b=7, *args, **kwargs):
    """a-позиционный, b-по умолчанию, *args-кортеж, **kwargs-словарь"""
    print("a=" + str(a) + ", b=" + str(b))
    print("args=" + str(args))
    print("kwargs=" + str(kwargs))
    
    total = a + b + sum(args)
    for value in kwargs.values():
        total += value
    return total

result = func5(1, 2, 3, 4, x=5, y=6)
a=1, b=2
args=(3, 4)
kwargs={'x': 5, 'y': 6}
result
21

*args и **kwargs - способы передать не уточненное заранее число элементов: *args — переменное количество позиционных аргументов. Переданные с одной звездочкой аргументы собираются в кортеж. **kwargs — переменное количество именованных аргументов. Все переданные аргументы, которые указываются по имени, собираются в словарь. *args всегда должно идти перед **kwargs.

4.9 Изменение значений объектов, используемых в качестве аргументов функции.

Такое изменение возможно только у объектов изменяемого типа

a=90    # Числовой объект – не изменяемый тип
def func3(b):
	b=5*b+67

func3(a)
a
90

Локальная b меняется, но внешняя a нет

Пример со списком:

sps1=[1,2,3,4]  #Список – изменяемый тип объекта
def func2(sps):
	sps[1]=99

func2(sps1)
sps1
[1, 99, 3, 4]

Изменяемые типы (списки, словари, множества) передаются по ссылке

Пример с кортежем:

kort=(1,2,3,4)   #Кортеж – неизменяемый тип объекта
func2(kort)
Traceback (most recent call last):
  File "<pyshell#78>", line 1, in <module>
    func2(kort)
  File "<pyshell#74>", line 2, in func2
    sps[1]=99
TypeError: 'tuple' object does not support item assignment

Кортеж - неизменяемый тип данных, так что переназначение в таком виде не работает.

5. Специальные типы пользовательских функций

5.1 Анонимные функции

Анонимные функции или по-другому их называют лямбда-функциями – это функции без имени, определяемые по следующей схеме: lambda [<Аргумент1>[,<Аргумент2>,…]]:<Возвращаемое значение или выражение> Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту.

mport math
anfun1=lambda: 1.5+math.log10(17.23)  #Анонимная функция без аргументов
anfun1()   # Обращение к объекту-функции
2.7362852774480286
anfun2=lambda a,b : a+math.log10(b)  #Анонимная функция с 2 аргументами
anfun2(17,234)
19.369215857410143
anfun3=lambda a,b=234: a+math.log10(b) #Функция с необязательным вторым аргументом
anfun3(100)
102.36921585741014

Вызов лямбда-функции создает объект класса "функция". Внутри лямбда-функции не могут использоваться многострочные выражения, нельзя использовать if-else.

5.2 Функции-генераторы

Это – такие функции, которые используются в итерационных процессах, позволяя на каждой итерации получать одно из значений. Для этого в функцию включают инструкцию yield приостанавливающую её выполнение и возвращающую очередное значение. Данный оператор в отличие от return не останавливает полностью выполнение программы. Когда выполнение функции возобновляется после yield, оно продолжается с того места, где было приостановлено, до следующего оператора yield (или до конца функции).

def func5(diap,shag):
	""" Итератор, возвращающий значения
	из диапазона от 1 до diap с шагом shag"""
	for j in range(1,diap+1,shag):
		yield j

for mm in func5(7,3):
	print(mm)

1
4
7
alp=func5(7,3)
print(alp.__next__())
1
print(alp.__next__())
4
print(alp.__next__())
7
print(alp.__next__())
Traceback (most recent call last):
  File "<pyshell#92>", line 1, in <module>
    print(alp.__next__())
StopIteration

Здесь при каждом обращении к функции будет генерироваться только одно очередное значение. При программировании задач у таких функций часто используют метод next, активирующий очередную итерацию выполнения функции. next помогает вывести значение, которое yield передает на каждой итерации цикла. Если функция отработала последнюю итерацию, но мы попытаемся сделать вызов, вернется ошибка. В отличии от функций, которые возвращают список со значениями итераций, функции - генераторы генерируют значения по одному, не храня всё в памяти; а функция, возвращающая список создаёт весь список в памяти. Также генератор можно использовать только один раз - после прохождения всех значений он "опустошается" и больше не производит элементов.

6. Локализация объектов в функциях

По отношению к функции все объекты подразделяются на локальные и глобальные. Локальными являются объекты, которые создаются в функциях присваиванием им некоторых значений. Глобальные – это те объекты, значения которых заданы вне функции. Локализация может быть переопределена путем прямого объявления объектов как глобальных с помощью дескриптора global.

6.1 Примеры на локализацию объектов

Пример 1. Одноименные локальный и глобальный объекты:

glb=10
def func7(arg):
	loc1=15
	glb=8
	return loc1*arg

res=func7(glb)
res
150
glb
10

Если внутри функции есть присваивание glb = ..., то создается локальная переменная, даже если есть глобальная с таким же именем. Для изменения глобальной переменной нужно использовать global glb

Пример 2. Ошибка в использовании локального объекта.

def func8(arg):
	loc1=15
	print(glb)  
	glb=8
	return loc1*arg

res=func8(glb)
Traceback (most recent call last):
  File "<pyshell#100>", line 1, in <module>
    res=func8(glb)
  File "<pyshell#99>", line 3, in func8
    print(glb)
UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value

Нельзя обращаться к переменной до ее присваивания, если она считается локальной в функции.

Пример 3. Переопределение локализации объекта.

glb=11
def func7(arg):
	loc1=15
	global glb
	print(glb)
	glb=8
	return loc1*arg

res=func7(glb)
11

Здесь мы явно указали, что в функции используем глобальную переменную, поэтому она изменилась.

6.2 Выявление локализации объекта с помощью функций locals() и globals() из builtins

Эти функции возвращают словари, ключами в которых будут имена объектов, являющихся, соответственно, локальными или глобальными на уровне вызова этих функций.

globals().keys()  #Перечень глобальных объектов
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8'])
locals().keys()  #Перечень локальных объектов
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8'])

Различий нет, потому что команды выполнены в глобальной области видимости, где globals() и locals() ссылаются на один и тот же словарь. Различия появляются только при вызове locals() внутри функций или методов.

def func8(arg):
	loc1=15
	glb=8
	print(globals().keys())  #Перечень глобальных объектов «изнутри» функции
	print(locals().keys())  #Перечень локальных объектов «изнутри» функции
	return loc1*arg

hh=func8(glb)
dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8'])
dict_keys(['arg', 'loc1', 'glb'])
'glb' in globals().keys()
True

locals() внутри функции показывает только её внутренние переменные, а globals() показывает все объекты модуля.

6.3 Локализация объектов при использовании вложенных функций

def func9(arg2,arg3):
	def func9_1(arg1):
		loc1=15
		glb1=8
		print('glob_func9_1:',globals().keys())
		print('locl_func9_1:',locals().keys())
		return loc1*arg1
	loc1=5
	glb=func9_1(loc1)
	print('loc_func9:',locals().keys())
	print('glob_func9:',globals().keys())
	return arg2+arg3*glb

kk=func9(10,1)
glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9'])
locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1'])
loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb'])
glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'result', 'a', 'func3', 'sps1', 'func2', 'kort', 'math', 'anfun1', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9'])

аждая функция имеет свою локальную область видимости, причем вложенные функции не видят локальные переменные внешних функций

6.4 Моделирование системы

Моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа «зона нечувствительности», при подаче на неё синусоидального входного сигнала. Реальный двигатель: последовательное соединение усилителя с коэффициентом усиления k1,интегратора: y(t)=x(t)+y(t-1), и инерционного звена: y(t)=(x(t)+T*y(t-1)) / (T+1) с постоянной времени Т. Тахогенератор: последовательное соединение усилителя с коэффициентом усиления k2 и интегратора: y(t)=x(t)+y(t-1). Нелинейное звено типа «зона нечувствительности»: y=0 при -xm≤ x ≤xm, y=x-xm при x>xm, y=x+xm при x<-xm. Таким образом, система характеризуется параметрами: k1, T, k2, xm. Входной сигнал характеризуется параметрами: A (амплитуда синусоиды) и F (период синусоиды). Еще один параметр задачи : N – время (число тактов) подачи сигнала.

znach=input('k1,T,k2,Xm,A,F,N=').split(',')
k1,T,k2,Xm,A,F,N=2,5,0.5,0.3,1,10,50
k1=float(znach[0])
k1
2.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 matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
<Figure size 1000x400 with 0 Axes>
plt.plot(vhod, 'b-', marker='o', markersize=3, label='Входной сигнал')
[<matplotlib.lines.Line2D object at 0x000001B544E58E10>]
plt.grid(True)
plt.legend()
<matplotlib.legend.Legend object at 0x000001B544E58CD0>
plt.show()

График2

Создание функций реализующие компоненты системы

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

Реализуем соединение компонент в соответствии с заданием

yi1=0;yin1=0;yi2=0
vyhod=[]
for xt in vhod:
		xt1=xt-yi2   #отрицательная обратная связь
		[yi1,yin1]=realdvig(xt1,k1,T,yi1,yin1)
		yi2=tahogen(yin1,k2,yi2)
		yt=nechus(yin1,Xm)
		vyhod.append(yt)

print('y=',vyhod)
y= [0, 0, 0.3435662011497584, 0.8937007565838242, 1.2092087410156356, 0.8817313753454714, 0, -1.9132355035817665, -4.418649831257506, -6.322056754188363, -6.424186296702933, -3.708625221989286, 1.5442059920803182, 9.704061323599833, 17.99800277772674, 23.15808712030786, 21.60101426578536, 10.675050948044715, -9.28749624705183, -36.1615235441021, -62.02226858466596, -76.45563856328266, -68.45249914172874, -30.293518696411148, 37.373158630110446, 124.2547951685195, 205.6938367713173, 248.14398604455204, 216.69606070239215, 87.62148681833895, -136.666280236251, -418.37473314281556, -677.5335449808889, -804.9287317650713, -688.4371994648337, -254.1131297675378, 486.67764763779877, 1402.6733164388684, 2230.344175329904, 2612.7580871622617, 2188.8107903361088, 728.2399496559426, -1716.8860787572244, -4697.377083821688, -7340.680479213284, -8479.693381759376, -6951.99457172508, -2043.4413296742846, 6022.5141606693105, 15717.056921566687]

7. Завершение сеанса работы с IDLE