From 161ce307fd10aabf6c374d0a293e187d3fb6b88c Mon Sep 17 00:00:00 2001 From: MelnikovDM Date: Mon, 24 Nov 2025 10:47:38 +0300 Subject: [PATCH] Add new files --- TEMA7/figure_0.png | Bin 0 -> 15309 bytes TEMA7/report.md | 530 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 530 insertions(+) create mode 100644 TEMA7/figure_0.png create mode 100644 TEMA7/report.md diff --git a/TEMA7/figure_0.png b/TEMA7/figure_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0e4f388df9c768e6cf8ad267a4eaa7d144bfcdbc GIT binary patch literal 15309 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 Y{>@DP7T1ssVmG9#Wpuq%^X}vS2Do#=b^rhX literal 0 HcmV?d00001 diff --git a/TEMA7/report.md b/TEMA7/report.md new file mode 100644 index 0000000..407a3c1 --- /dev/null +++ b/TEMA7/report.md @@ -0,0 +1,530 @@ +# Отчет по теме 7 +Мельников Дмитрий, А-01-23 + +## 1. Запуск интерактивной оболочки IDLE. Создание рабочего каталога. +``` +>>>import os +>>>os.chdir("C:/Users/dimoo/OneDrive/Рабочий стол/lab01/python-labs/TEMA7") +``` + +## 2. Создание пользовательской функции. +В общем виде функция в языке Python представляется так: +def <Имя функции>([<Список аргументов >]): +[<отступы>"""<Комментарий по назначению функции>"""] +<отступы><Блок инструкций – тело функции> +[<отступы>return <Значение или вычисляемое выражение>] + +Функция считается оконченной, если в очередной строке нет отступов или их число меньше, чем в отступах в функции. Если при выполнении функции будет выполнена инструкция return, то выполнение функции прекращается с возвратом значения, следующего за этой инструкцией. Однако наличие этой инструкции в функции является необязательным. + +### 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() + Подтверждение успеха операции +``` +Видно, что help вернуло имя функции и то описание, которое было указано в тройных кавычках +при её определении. Это называется docstring или документ-строка. Они используются +для написания документации. Она должна быть первой строкой внутри блока. + +### 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("big", "small") +big меньше small +``` +Из-за не конкретизированной функции, мы можем задать любые данные, которые можно сравнить. Если что-то нельзя сравнить, +вернется TypeError. + +### 2.3. Пример функции, содержащей return. +``` +>>>def logistfun(b, a): + """Вычисление логистической функции""" + import math + return a / (1 + math.exp(-b)) + +>>>v, w = 1, 0.7; z = logistfun(w, v) +>>>print(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) #Сложение списков +>>>print(q) +[1, 2, -1, -2, 0, 2, -1, -1] +>>>slozh((1, 2), (5, 0), (-1, -3), (-6, 2)) # Сложение кортежей +(1, 2, 5, 0, -1, -3, -6, 2) +>>>slovar1 = {'a' : 1}; slovar2 = {'b' : 2}; slovar3 = {'c' : 3}; slovar4 = {'d' : 4} +>>>slozh(slovar1, slovar2, slovar3, slovar4) # Сложение словарей +Traceback (most recent call last): + File "", line 1, in + slozh(slovar1, slovar2, slovar3, slovar4) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 +TypeError: unsupported operand type(s) for +: 'dict' and 'dict' +>>>slozh({1,1,1,1}, {2}, {"abc", True, None}, {6, 6, "a"}) # Сложения множеств +Traceback (most recent call last): + File "", line 1, in + slozh({1,1,1,1}, {2}, {"abc", True, None}, {6, 6, "a"}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 +TypeError: unsupported operand type(s) for +: 'set' and 'set' +``` +Как видим, операции сложений множеств и словарей не применимы. Если нужно объединить два множества, для этого есть специальная операция set union вида set1 | set2 | set3. Для объединения словарей есть оператор распаковывания +**dict1. + +### 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 as plt +>>>plt.plot(spsy, label = "Выходной сигнал") +[] +>>>plt.show() +``` +![График](figure0.png) + + +## Пункт 3. Функции как объекты. + +### Пункт 3.1. Получение списка атрибутов объекта-функции. +``` +>>>dir(inerz) +['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] +>>>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 +``` +В данном случае происходит присвоение функции sravnenie переменной fnkt. Функции можно передавать в +переменные, как и любые другие объекты. После этого переменная 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 определена как выводящая. Функция становится доступной только после того, как интерпретатор достигает +строки с её определением. + +## 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) +>>>print(zz) +-2.3318122278318336 +``` +Python передаёт ссылку на объект функции logistfun в переменную fff. Внутри +функции выполняется операция: a + fff(c, b), что эквивалентно -3 + logistfun(0.7, 1) + +### 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) #Перед ссылкой на список или кортеж надо ставить звездочку +>>>print(qq) +[1, 2, -1, -2, 0, 2, -1, -1] +``` +Создается список b1234, содержащий 4 элемента: b1, b2, b3, b4. Затем Оператор * выполняет распаковку списка b1234. Вместо передачи одного аргумента (списка), передаются 4 отдельных аргумента. + +### 4.5. Пример со значениями аргументов функции, содержащимися в словаре. +``` +>>>dic4 = {"a1":1,"a2":2,"a3":3,"a4":4} +>>>qqq = slozh(**dic4) #Перед ссылкой на словарь надо ставить две звездочки +>>>print(qqq) +10 +``` + +### 4.6. Смешанные ссылки. +``` +>>>e1=(-1,6);dd2={'a3':3,'a4':9} +>>>qqqq=slozh(*e1,**dd2) +>>>print(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 +``` + +Подобным же образом в списке аргументов функции также можно использовать словарь, предварив его имя двумя звездочками: +``` +>>>def func5(a,b=7,**slovar7): #Аргументы: a-позиционный, b- по умолчанию + кортеж + """Словарь - сборка именованных аргументов!""" + smm = 0 + for key, value in slovar7.items(): + smm += value + return a * smm + b + +>>>func5(-1, 2, x=0, y=3, z=6) +-7 +``` + +### 4.9. Изменение значений объектов, используемых в качестве аргументов функции. +Такое изменение возможно только у объектов изменяемого типа. +``` +>>>a=90 # Числовой объект – не изменяемый тип +>>>def func3(b): + b = 5*b + 67 + print(b) + +>>>func3(a) +517 +>>>print(a) +90 +``` +Значени a не изменилось + +- Пример со списком: +``` +>>>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. Анонимные функции. +Анонимные функции или по-другому их называют лямбда-функциями – это функции без имени (поэтому их и называют анонимными), определяемые по следующей схеме: +lambda [<Аргумент1>[,<Аргумент2>,…]]:<Возвращаемое значение или выражение> +Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту. + +``` +>>>import 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 +``` + +### 5.2. Функции-генераторы. +Это – такие функции, которые используются в итерационных процессах, позволяя на каждой итерации получать одно из значений. Для этого в функцию включают инструкцию 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 +``` + +Здесь при каждом обращении к функции будет генерироваться только одно очередное значение. +При программировании задач у таких функций часто используют метод __next__, активирующий очередную итерацию выполнения функции. +``` +>>>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. Локализация объектов в функциях. +По отношению к функции все объекты подразделяются на локальные и глобальные. Локальными являются объекты, которые создаются в функциях присваиванием им некоторых значений. Они записываются в пространство имен, создаваемое в функции. Глобальные – это те объекты, значения которых заданы вне функции. Они определены в пространствах имен вне функции. +Локализация может быть переопределена путем прямого объявления объектов как глобальных с помощью дескриптора global. + +- Одноименные локальный и глобальный объекты: +``` +>>>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: local variable 'glb' referenced before assignment +``` +Мы получили ошибку потому, что на локальную переменную glb код ссылается перед назначением. +Если переменной присваивается значение внутри функции, она считается локальной для всей функции. Даже если такое же имя есть в глобальной области, внутри функции будет создана новая локальная переменная. + + +- Переопределение локализации объекта: +``` +>>>glb = 11 +>>>def func7(arg): + locl = 15 + global glb + print(glb) + glb = 8 + return locl * arg + +>>>res = func7(glb) +11 +>>>print(res) +165 +>>>print(glb) +8 +``` +Здесь мы явно указали, что в функции имеем в виду глобальную переменную, так что она изменилась. + +### 6.2. Выявление локализации объекта с помощью функций locals() и globals() из builtins. + +Эти функции возвращают словари, ключами в которых будут имена объектов, являющихся, соответственно, локальными или глобальными на уровне вызова этих функций. + +``` +>>>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', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'slovar1', 'slovar2', 'slovar3', 'slovar4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'func8', 'res']) +dict_keys(['arg', 'loc1', 'glb']) +``` +Как мы видим, перечень глобальных объектов остался без изменений, а перечень локальных объектов вывел только локальные объекты функции. + +Проверка наличие объекта glb в перечне глобальных объектов: +``` +>>>'b' 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', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'slovar1', 'slovar2', 'slovar3', 'slovar4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'func8', 'res', 'hh', 'func9']) +locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1'])# Содержит только объекты, определенные внутри func9_1, + а также объект, переданный как аргумент функции + + +loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb'])# Содержит все то же, что и locl_func9_1, + но еще и arg3, переданный func9, + и саму func9_1 +glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'slovar1', 'slovar2', 'slovar3', 'slovar4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'plt', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'func8', 'res', 'hh', 'func9']) # Тоже самое, что и glob_func9_1 +``` + +### 6.4. Большой пример – моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа «зона нечувствительности», при подаче на неё синусоидального входного сигнала. + +``` +>>>znach=input('k1,T,k2,Xm,A,F,N=').split(',') +k1,T,k2,Xm,A,F,N=6, 5, 8, 10, 3, 0.5, 1500 +>>>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)) + +>>>print(vhod) +[0.0, -1.4695761589768238e-15, -2.9391523179536475e-15, …, 2.9174217636433927e-12, -4.033155768249364e-12, -6.979687886698152e-14, -7.0203744107597384e-12] + + +>>>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 -gran <= xtt <= gran: + ytt = 0 + elif xtt > gran: + ytt = xtt - gran + else: # 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.421883254961507, -159.8455361225524, 760.8726454041447, -3488.73566888214, 15869.602621377877, -72062.25788892987, 327102.1123783949, -1484643.5574000787, 6738340.865317245,..., nan, nan, nan, nan, nan] +``` +## 7. Завершение сеанса в среде IDLE \ No newline at end of file