# Отчет по теме 7 Девятова Мария, А-03-23 ## 1 Запуск IDLE ## 2 Создание пользовательской функции ### 2.1 Первый пример: функция – без аргументов. ``` def uspeh(): """Подтверждение успеха операции""" print('Выполнено успешно!') uspeh() Выполнено успешно! type(uspeh) dir() ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh'] 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", line 1, in mm=slozh(m1,m2,m3,m4); mm File "", line 3, in slozh return a1+a2+a3+a4 TypeError: unsupported operand type(s) for +: 'set' and 'set' d1={'fruit': ['orange', 'apple']}; d2={'coffee': ['espresso', 'latte'], 'tea': ['black tea', 'green tea']}; d3={'antonyms': ['ice', 'fire']}; d4={'colour': ['white', 'yellow']} dd=slozh(d1,d2,d3,d4); dd Traceback (most recent call last): File "", line 1, in dd=slozh(d1,d2,d3,d4); dd File "", line 3, in slozh return a1+a2+a3+a4 TypeError: unsupported operand type(s) for +: 'dict' and 'dict' ``` ### 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 pylab pylab.plot(spsy) [] pylab.xlabel('t, time'); pylab.ylabel('y, output signal') Text(0.5, 0, 't, time') Text(0, 0.5, 'y, output signal') pylab.show() ``` ![График](Figure_1.png) ## 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- текущее значение вх.сигнала,\nT -постоянная времени,\nypred - предыдущее значение выхода устройства' help(inerz) Help on function inerz in module __main__: inerz(x, T, ypred) Модель устройства с памятью: x- текущее значение вх.сигнала, T -постоянная времени, ypred - предыдущее значение выхода устройства ``` ### 3.2 Сохранение ссылки на объект-функцию в другой переменной ``` fnkt=sravnenie v=16 fnkt(v,23) 16 меньше 23 ``` ### 3.3 Возможность альтернативного определения функции в программе ``` typ_fun=8 if typ_fun==1: def func(): print('Функция 1') else: def func(): print('Функция 2') 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 ``` ### 4.2 Обязательные и необязательные аргументы ``` 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 Возможность обращения к функции с произвольным (непозиционным) расположением аргументов Для этого необходимо в обращении к функции указывать имена аргументов ``` logistfun(b=0.5,a=0.8) 0.34498724056380625 ``` ### 4.4 Пример со значениями аргументов функции, содержащимися в списке или кортеже ``` b1234=[b1,b2,b3,b4]; b1234 [[1, 2], [-1, -2], [0, 2], [-1, -1]] 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 ``` ### 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) 1 func4(-1,2,0,3,6) 10 ``` ### 4.8 Комбинация аргументов ``` 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 func44(a,b=7,**dict11): """Словарь - сборка аргументов - должен быть последним!""" smm=0 for elt in dict11.values(): smm+=elt return a*smm+b dddd={'c1': 2, 'c2': 0, 'c3': 3, 'c4': 6} func44(-1, **dddd) -4 ``` ### 4.9 Изменение значений объектов, используемых в качестве аргументов функции. Такое изменение возможно только у объектов изменяемого типа (например, списки). ``` 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) 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 Анонимные функции Анонимные функции или по-другому лямбда-функции – функции без имени ``` 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 Функции-генераторы ``` 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 ``` ## 6 Локализация объектов в функциях ### 6.1 Примеры на локализацию объектов Пример 1. Одноименные локальный и глобальный объекты ``` glb=10 def func7(arg): loc1=15 glb=8 return loc1*arg res=func7(glb); res 150 glb 10 ``` Пример 2. Ошибка в использовании локального объекта. ``` def func8(arg): loc1=15 print(glb) glb=8 return loc1*arg res=func8(glb); res Traceback (most recent call last): File "", line 1, in res=func8(glb); res File "", line 3, in func8 print(glb) UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value ``` В данном примере локальной переменной glb внутри пользовательской функции присваивается значение, поэтому print принимает именно локальную переменную. Но из-за того, что присваивание значения происходит после print, происходит ошибка. Пример 3. Переопределение локализации объекта ``` glb=11 def func7(arg): loc1=15 global glb print(glb) glb=8 return loc1*arg res=func7(glb); res; glb 11 165 8 ``` ### 6.2 Выявление локализации объекта с помощью функций locals() и globals() из builtins ``` globals().keys() dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) locals().keys() dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) ``` В возвращенных списках элементы совпадают, т.к. 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__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) dict_keys(['arg', 'loc1', 'glb']) 'glb' in globals().keys() True ``` В данном примере списки отличаются, т.к. на уровне пользовательской функции глобальные и локальные объекты разные ### 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__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', '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__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) ``` Глобальные объекты для обеих функций совпадают. Список локальных объектов функции func9 содержит имена arg2,arg3,loc1, glb и имя вложенной функции func9_1. Среди локальных объектов вложенной функции arg1,loc1,glb1, при этом loc1 в функциях func9 и func9_1 - две разные переменные ### 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=15,10,30,0.2,5,0.001,50 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]) vhod=[] for i in range(N): vhod.append(A*math.sin((2*i*math.pi)/F)) vhod [0.0, -3.2141664592756336e-12, -6.428332918551267e-12, -5.09502586896226e-12, -1.2856665837102534e-11, -2.428411769784245e-12, -1.019005173792452e-11, -1.7951691706064795e-11, -2.571333167420507e-11, -3.347497164234534e-11, -4.85682353956849e-12, -4.8998251578625896e-11, -2.038010347584904e-11, 8.238044626927816e-12, -3.590338341212959e-11, -8.004481145118699e-11, -5.142666334841014e-11, -2.2808515245633285e-11, -6.694994328469069e-11, -3.833179518191383e-11, -9.71364707913698e-12, -5.385507511819438e-11, -9.799650315725179e-11, -1.421379311963092e-10, -4.076020695169808e-11, 6.061751729291303e-11, 1.647608925385563e-11, -2.7665338785201775e-11, -7.180676682425918e-11, 2.957095742035194e-11, -1.6008962290237398e-10, -5.871189865776288e-11, -1.0285332669682028e-10, -1.4756024522091648e-12, -4.561703049126657e-11, -8.975845853032398e-11, -1.3389988656938137e-10, -3.2522162324770265e-11, -7.666359036382766e-11, -1.2080501840288506e-10, -1.942729415827396e-11, -2.0908787448099986e-10, -1.0771015023638876e-10, -1.5185157827544617e-10, -1.9599300631450358e-10, 5.090387021377606e-11, -2.842758623926184e-10, -3.7378985864338755e-11, -8.152041390339616e-11, -1.2566184194245356e-10] 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 vyhod=[] yi1=0;yin1=0;yi2=0 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.28235063576021646, -18.09317618367068, 693.569780896497, -26311.05967697136, 997855.8681822185, -37843749.77748839, 1435226439.7890663, -54431047009.38599, 2064300653896.8462, -78288723509751.45, 2969104436030480.0, -1.126034600750363e+17, 4.2704928351466476e+18, -1.6195869152587386e+20, 6.142292885938634e+21, -2.3294681835969964e+23, 8.834521764361373e+24, -3.3504975665500395e+26, 1.2706781694446622e+28, -4.8190544187315804e+29, 1.8276292179353242e+31, -6.931294540413311e+32, 2.62869752433907e+34, -9.969350796127492e+35, 3.780882143191306e+37, -1.433901772847203e+39, 5.438080893044959e+40, -2.0623953717959402e+42, 7.821646557419368e+43, -2.966364049581635e+45, 1.1249953075805503e+47, -4.266551309697657e+48, 1.6180920894178406e+50, -6.136623750159777e+51, 2.3273181605240858e+53, -8.826367789232948e+54, 3.3474051666947687e+56, -1.269505374983769e+58, 4.81460658885228e+59, -1.8259423758419422e+61, 6.9248971818694355e+62, -2.626271322354932e+64] ``` ## 7 Завершение работы