# Отчет по теме 7 Лыкова Елизавета, А-01-23 ## 1. Запуск IDLE, привязка католога, создание файла отчета. ```py import os os.chdir("C:\\Users\\Home\\Desktop\\python-labs\\TEMA7") ``` ## 2. Создание пользовательской функции. ## 2. 1 Функция без аругментов. ```py def uspeh(): '''Подтверждение успеха операции''' print('Выполнено успешно!') type(uspeh) dir() ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh'] help(uspeh) Help on function uspeh in module __main__: uspeh() Подтверждение успеха операции ``` ## 2.2 Функция с аргументами. ```py 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('a','b') a меньше b ``` ## 2.3 Функция с return. ```py 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. Сложение для разных типов аргументов. ```py 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,-1]; b3= [0,2]; b4 = [-1,-1] q = slozh(b1,b2,b3,b4) q [1, 2, -1, -1, 0, 2, -1, -1] k1 = (0, 1); k2 = (2,3); k3 = (4,5); k4 = (6,7) qk = slozh(k1,k2,k3,k4) qk (0, 1, 2, 3, 4, 5, 6, 7) s1 = {'aaa':1,'bbb':2}; s2 = {'ccc':3,'ddd':4}; s3 = {'eee':5,'fff':6}; s4 = {'ggg':7,'hhh':8} qs = slozh(s1,s2,s3,s4) Traceback (most recent call last): File "", line 1, in qs = slozh(s1,s2,s3,s4) File "", line 3, in slozh return a1 + a2 + a3 + a4 TypeError: unsupported operand type(s) for +: 'dict' and 'dict' m1 = {'a','b'}; m2 = {'c','d'}; m3 = {'e','f'}; m4 = {'g','h'} qm = slozh(m1,m2,m3,m4) Traceback (most recent call last): File "", line 1, in qm = slozh(m1,m2,m3,m4) File "", line 3, in slozh return a1 + a2 + a3 + a4 TypeError: unsupported operand type(s) for +: 'set' and 'set' ``` ## 2.5 На вход функции поступает сигнал x, а на выходе получает сигнал y. ```py 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 pylab as plt plt.plot(spsy,label = 'Выходной сигнал') [] plt.show() ``` ![рисуночек](ris1.png) ## 3. Функции как объекты. ## 3.1 Получение списка атрибутов объекта-функции. ```py 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- текущее значение вх.сигнала,\nT -постоянная времени,\nypred - предыдущее значение выхода устройства' help(inerz) Help on function inerz in module __main__: inerz(x, T, ypred) Модель устройства с памятью: x- текущее значение вх.сигнала, T -постоянная времени, ypred - предыдущее значение выхода устройства ``` ## 3.2 Сохранение ссылки на объект-функцию в другой переменной. ```py fnkt = sravnenie v = 16 fnkt(v,23) 16 меньше 23 ``` ## 3.3 Возможность альтернативного определения функции в программе. ```py 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 Функция в качестве аргумента другой функции. ```py 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 ``` ## 4.2 Обязательные и необязательные аргументы. ```py def logistfun(a,b=1): '''Вычисление логистической функции''' import math return b/(1+math.exp(-a)) logistfun(0.7) 0.6681877721681662 logistfun(0.7,2) 1.3363755443363323 ``` ## 4.3 Функция с произвольным положением элементов. ```py logistfun(b = 0.5, a = 0.8) 0.34498724056380625 ``` ## 4.4 Аргументы функции, содержащиеся в списке или кортеже. ```py b1234 = [b1,b2,b3,b4] qq = slozh(*b1234) qq [1, 2, -1, -1, 0, 2, -1, -1] ``` ## 4.5 Аргументы функции, содержащиеся в словаре. ```py dic4={"a1":1,"a2":2,"a3":3,"a4":4} qqq = slozh(**dic4) qqq 10 ``` ## 4.6 Смешанные ссылки. ```py e1=(-1,6);dd2={'a3':3,'a4':9} qqqq=slozh(*e1,**dd2) qqqq 17 ``` ## 4.7 Переменное число аргументов у функции. ```py def func4(*kort7): '''Произвольное число аргументов в составе кортежа''' smm = 0 for elt in kort7: smm += elt return smm func4(-1,2) 1 func4(-1,2,0,3,6) 10 ``` ## 4.8 Комбинация аргументов. ```py def func4(a,b=7,*kort7): '''Кортеж - сборка аргументов - должен быть последним!''' smm = 0 for elt in kort7: smm += elt return a*smm + b func4(-1,2,0,3,6) -7 def func4(a,b=7,**dicc): '''Словарь - сборка аргументов - должен быть последним!''' smm = 0 smm = sum(dicc.values()) return a*smm + b func4(-1,2,x=3,y=4,z=5) -10 ``` ## 4.9 Изменение значений объектов, используемых в качестве аргументов функции. ```py a = 90 def func3(b): b = 5*b + 67 func3(a) a 90 sps1 = [1,2,3,4] def func2(sps): sps[1] = 99 func2(sps1) print(sps1) [1, 99, 3, 4] kort = (1,2,3,4) func2(kort) Traceback (most recent call last): File "", line 1, in func2(kort) File "", line 2, in func2 sps[1] = 99 TypeError: 'tuple' object does not support item assignment ``` ## 5. Специальные типы пользовательских функций. ## 5.1 Анонимные функции. ```py anfun1 = lambda: 1.5 + math.log10(17.23) anfun1() 2.7362852774480286 anfun2 = lambda a,b: a+math.log10(b) anfun2(17,234) 19.369215857410143 anfun3 = lambda a,b = 234: a+math.log10(b) anfun3(100) 102.36921585741014 ``` ## 5.2 Функции генераторы. ```py 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 "", line 1, in print(alp.__next__()) StopIteration ``` Функции - генераторы генерируют значения по одному, не храня всё в памяти. Генератор можно использовать только один раз - после прохождения всех значений он "опустошается" и больше не производит элементов. ## 6. Локализация объектов в функциях. ## 6.1 Локализация объектов. ```py glb = 10 def func7(arg): locl = 15 glb = 8 return locl*arg res = func7(glb) res 150 glb 10 ``` Глобальное значение glb не изменилось. ```py def func8(arg): locl=15 print(glb) glb=8 return locl*arg res = func8(glb) Traceback (most recent call last): File "", line 1, in res = func8(glb) File "", line 3, in func8 print(glb) UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value ``` Локальная переменная была инициализирована только после той строки, где функция её выводит. ```py glb = 11 def func7(arg): locl = 15 global glb print(glb) glb = 8 return locl*arg res = func7(glb) 11 glb 8 ``` ## 6.2 Выявление локализации объекта. ```py globals().keys() dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) locals().keys() dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) ``` Различий нет, поскольку эти методы возвращают обхекты на уровне вызова этиъ функций. ```py def func8(arg): locl = 15 glb = 8 print(globals().keys()) print(locals().keys()) return locl*arg hh = func8(glb) dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) dict_keys(['arg', 'locl', 'glb']) def func8(arg): locl = 15 glb = 8 print(globals().keys()) print(locals().keys()) return locl*arg hh = func8(glb) dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) dict_keys(['arg', 'locl', 'glb']) 'glb' in globals().keys() True ``` ## 6.3 Локализация при использовании вложенных функций. ```py def func9(arg2,arg3): def func9_1(arg1): locl = 15 glbl = 8 print('glob_func9_1:',globals().keys()) print('locl_func9_1:',locals().keys()) return locl*arg1 locl = 5 glb = func9_1(locl) 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__', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9', 'locl']) locl_func9_1: dict_keys(['arg1', 'locl', 'glbl']) loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'locl', 'glb']) glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9', 'locl']) ``` ## 6.4 ```py znach = input('k1,T,k2,Xm,A,F,N=').split(',') k1,T,k2,Xm,A,F,N=4,2,8,6,9,0.5,1000 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)) vhod [0.0, -9.797174393178826e-16, -1.959434878635765e-15, -2.9391523179536475e-15, -3.91886975727153e-15, -4.898587196589413e-15, -5.878304635907295e-15, -6.858022075225178e-15, -7.83773951454306e-15, -8.817456953860943e-15, -9.797174393178826e-15, -3.919860126290071e-14, -1.175660927181459e-14, 1.5685382719271533e-14, -1.3716044150450356e-14, -4.3117471020172244e-14, -1.567547902908612e-14, 1.1766512962000004e-14, -1.7634913907721887e-14, ...] ``` Создание функций, реализующих компоненты системы. ```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): ytt=0 elif xtt>=gran: ytt=xtt-gran elif xtt<=(-gran): ytt=xtt+gran return ytt ``` Соединение компонент. ```py 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0183086292055208, 0, 26.39885775889784, -36.65029553691161, -34.19982663883278, 196.29963397615063, -151.6919482160481, -388.32493988337274, 1057.8073200868555, -308.3186572590445, -2798.051869998873, 5004.749701095182, 1362.331454336744, ...] ```