From a5bd414ae32eadc2beb91fc554f84646b7e9e15c Mon Sep 17 00:00:00 2001 From: Dmitry Kolomeytsev Date: Sat, 29 Nov 2025 21:26:06 +0300 Subject: [PATCH] report done --- TEMA7/pictures/Figure_1.png | Bin 0 -> 19767 bytes ...{1E0E40B4-99EF-4436-9890-9562FE3626D8}.png | Bin 0 -> 28712 bytes TEMA7/report.md | 610 +++++++++++++++++- 3 files changed, 608 insertions(+), 2 deletions(-) create mode 100644 TEMA7/pictures/Figure_1.png create mode 100644 TEMA7/pictures/{1E0E40B4-99EF-4436-9890-9562FE3626D8}.png diff --git a/TEMA7/pictures/Figure_1.png b/TEMA7/pictures/Figure_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e6fc9974c81c64a0d1cf7b54e3fb74102fb4f3 GIT binary patch literal 19767 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�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 a`3s@TSEj5%XV~g~FQmlf#mYY#eEUDRp_yd> literal 0 HcmV?d00001 diff --git a/TEMA7/report.md b/TEMA7/report.md index 488d9fa..4658ceb 100644 --- a/TEMA7/report.md +++ b/TEMA7/report.md @@ -2,6 +2,612 @@ Коломейцев Дмитрий, А-02-23 -## Тема 7. Создание пользовательских функций +## Создание пользовательских функций -## 1. \ No newline at end of file +### 1. Установка рабочего каталога. Создание рабочего протокола. + +В оболочке IDLE установил актуальный рабочий каталог, а затем в нём создал рабочий протокол. + +![alt text](pictures/{1E0E40B4-99EF-4436-9890-9562FE3626D8}.png) + +### 2. Создание пользовательской функции. + +Создание функции предполагает выполнение трех операций: формирование функции, ее сохранение и использование. +В общем виде функция в языке Python представляется так:
+__def <Имя функции>([<Список аргументов >]):__
+<отступы> """<Комментарий по назначению функции>"""
+<отступы> <Блок инструкций – тело функции>
+<отступы> return <Значение или вычисляемое выражение>
+ +Именование пользовательских функций производится в соответствии с теми же правилами, что используются при именовании переменных. Также важно заметить, что наличие инструкции __return__ не обязательно для работы функции. + +#### 2.1. Функция без аргументов. + +Функции могут быть без аргументов, как в примере ниже. + +```py +>>> def uspeh(): # Аргументы отсутствуют +... """Подтверждение успеха операции""" +... print("Выполнено успешно!") +... +>>> uspeh() + Выполнено успешно! +``` + +Важно заметить, что многострочный комментарий в начале функции выступает в качестве описания её работы, выводимого при запросе __help__ для этой функции. Поэтому данная справочная информация о функции должна быть хорошо и точно структурирована и расписана, чтобы пользователь мог понять как работать с функцией. + +```py +>>> 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 +``` + +Данную функцию можно применять и для аргументов, являющихся символьными строками. В таком случае будут поэлементно сравниваться символы строк, до первого различия, в соответствии с кодами символов в таблице Unicode/ASCII. + +```py +>>> sravnenie("Text", "Text but bigger") + Text меньше Text but bigger +>>> sravnenie("abc", "ABC") + abc больше ABC +``` + +#### 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, -2]; b3 = [0, 2]; b4 = [-1, -1] +>>> q = slozh(b1, b2, b3, b4) +>>> q + [1, 2, -1, -2, 0, 2, -1, -1] +``` + +Данная функция может работать и с кортежами, но вот при работе со словарями и множествами уже получается ошибка: + +```py +>>> slozh((1, 2), (3, 4), (5, 6), (7, 8)) # Сложение кортежей + (1, 2, 3, 4, 5, 6, 7, 8) +>>> slozh({"A" : 1, "B" : 2}, {"C" : 3, "D" : 4}, {"E" : 5, "F" : 6}, {"G" : 7, "H" : 8}) # Сложение словарей + Traceback (most recent call last): + File "", line 1, in + slozh({"A" : 1, "B" : 2}, {"C" : 3, "D" : 4}, {"E" : 5, "F" : 6}, {"G" : 7, "H" : 8}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 + TypeError: unsupported operand type(s) for +: 'dict' and 'dict' +>>> slozh({1, 2}, {3, 4}, {5, 6}, {7, 8}) # Сложение множеств + Traceback (most recent call last): + File "", line 1, in + slozh({1, 2}, {3, 4}, {5, 6}, {7, 8}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 + TypeError: unsupported operand type(s) for +: 'set' and 'set' +``` + +#### 2.5. Функция, реализующая некоторую модель. + +С помощью функций можно легко реализовывать модели некоторых устройств. Так, например, следующая функция реализует модель устройства, преобразующего вид входного сигнала. + +```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 +>>> pylab.plot(spsy) + [] +>>> pylab.xlabel("Время, сек.") + Text(0.5, 0, 'Время, сек.') +>>> pylab.ylabel("Выходной сигнал") +... Text(0, 0.5, 'Выходной сигнал') +>>> pylab.grid(True) +>>> pylab.show() +``` + +Полученный график выходного сигнала: + +![Скриншот полученного графика работы устройства](pictures/Figure_1.png) + +### 3. Функции как объекты. + +#### 3.1. Атрибуты объекта-функции. + +Так как функции являются объектами, то у них есть некоторые атрибуты. Получить их список можно с помощью инструкции dir(). + +```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__'] +>>> inerz.__doc__ # Использование атрибута объекта-функции + 'Модель устройства с памятью:\n x - текущее значение вх. сигнала,\n T - постоянная времени,\n ypred - предыдущее значение выхода устройства' +>>> 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 +``` + +### 4. Аргументы функции. + +#### 4.1. Использование фунции в качестве аргумента. + +В качестве аргумента функции может выступать и другая функция: + +```py +>>> def fun_arg(fff, a, b, c): +... """fff - имя функции, используемой в качестве аргумента""" +... 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 +>>> logistfun(0.8, 0.5) + 0.34498724056380625 +``` + +#### 4.4. Аргументы функции, содержащиеся в списке или кортеже. + +Аргументы функции могут содержаться в списке или кортеже, в таком случае при их передаче в функцию необходима распаковка с помощью оператора " __*__ ". + +```py +>>> b1234 = [b1, b2, b3, b4] +>>> slozh(*b1234) + [1, 2, -1, -2, 0, 2, -1, -1] +>>> slozh(b1, b2, b3, b4) + [1, 2, -1, -2, 0, 2, -1, -1] +``` + +#### 4.5. Аргументы функции, содержащиеся в словаре. + +Аналогичная ситуация происходит и с аргументами, представленными в виде словаря. Однако распаковка в таком случае проводится с помощью оператора " __**__ ". Важно также заметить, что имена ключей словаря с аргументами не должны совпадать с именами остальных переданных аргументов, иначе произойдет ошибка. + +```py +>>> dic4 = {"a1" : 1, "a2" : 2, "a3" : 3, "a4" : 4} +>>> slozh(**dic4) + 10 +``` + +#### 4.6. Смешанные ссылки. + +Данные способы передачи аргументов в функцию можно комбинировать: + +```py +>>> e1 = (-1, 6) +>>> dd2 = {"a3" : 3, "a4" : 4} +>>> slozh(*e1, **dd2) + 12 +``` + +#### 4.7. Переменное число аргументов у функции. + +Число аргументов у функции может быть произвольным, что осуществляется с помощью того же оператора " __*__ ". + +```py +>>> def func4(*kort7): +... """Произвольное число элементов в составе кортежа""" +... smm = 0 +... for el in kort7: +... smm += el +... 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 el in kort7: +... smm += el +... return a * smm + b +... +>>> func4(-1, 2, 0, 3, 6) + -7 +``` +Пример реализации аналогичной функции для произвольного количества аргументов, переданного в виде словаря: + +```py +>>> def func4(a, b = 7, **dict7): +... """Словарь - сборка аргументов - должен быть последним!""" +... smm = 0 +... for el in dict7.values(): +... smm += el +... return a * smm + b +... +>>> func4(-1, 2, **{"a1" : 0, "a2" : 3, "a3" : 6}) + -7 +``` + +#### 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) +>>> 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 [<Список аргументов >]: <Возвращаемое значение или выражение>__
+Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту. + +```py +>>> anfun1 = lambda: 1.5 + math.log10(12.23) +>>> anfun1() + 2.5874264570362855 +>>> 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. Функции-генераторы. + +Функции-генераторы - функции, использующиеся в итерационных процессах, позволяющие на каждой из итераций получать значение с помощью инструкции __yield__, приостанавливающей выполнение функции. + +```py +>>> def func5(diap, shag): +... """Итератор, возвращающий значения из диапазона от 1 до diap с шагом shag""" +... for i in range(1, diap + 1, shag): +... yield i +... +>>> for mm in func5(7, 3): +... print(mm) +... + 1 + 4 + 7 +``` + +При работе с такими функциями часто используют метод "__ next __", активирующий очередную итерацию выполнения функции: + +```py +>>> 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): +... loc1 = 15 +... glb = 8 +... return loc1 * arg +... +>>> func7(glb) + 150 +>>> glb # Значение не измени лось, т.к. операции проводились над локальной переменной + 10 +``` + +При использовании локального объекта до его определения будет ошибка: + +```py +>>> def func8(arg): +... loc1 = 15 +... print(glb) +... glb = 8 +... return loc1 * arg +... +>>> func8(glb) + Traceback (most recent call last): + File "", line 1, in + func8(glb) + File "", line 3, in func8 + print(glb) + UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value +``` + +Локализацию объекта можно переопределить с помощью дескриптора __global__: + +```py +>>> glb = 11 +>>> def func7(arg): +... loc1 = 15 +... global glb +... print(glb) +... glb = 8 +... return loc1 * arg +... +>>> func7(glb) + 11 + 165 +>>> glb # Значение изменилось, т.к. была переопределена локализация объекта + 8 +``` + +#### 6.2. Функции для выявления локализации объектов. + +Чтобы узнать текущую локализацию объекта можно использовать функции __globals()__ и __locals()__, которые возвращают словари с ключами - именами объектов, являющихся, соответственно, глобальными или локальными на уровне вызова этих функций. + +```py +>>> globals().keys() + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) +>>> locals().keys() + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) +``` + +Пример просмотра локальных и глобальных объектов изнутри функциии: + +```py +>>> def func8(arg): +... loc1 = 15 +... glb = 8 +... print(globals().keys()) +... print(locals().keys()) +... return loc1 * arg +... +>>> func8(glb) + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) + dict_keys(['arg', 'loc1', 'glb']) + 150 +>>> "glb" in globals().keys() + True +``` + +#### 6.3. Локализация объектов во вложенных функциях. + +Локальные переменные будут различаться на разных уровнях вложенных функций: + +```py +>>> 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("glob_func9:", globals().keys()) +... print("locl_func9:", locals().keys()) +... return arg2 + arg3 * glb +... +>>> func9(10, 1) + glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8', 'func9']) + locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1']) + glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8', 'func9']) + locl_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb']) + 85 +``` + +#### 6.4. Моделирование некоторой системы с помощью нескольких функций. + +Моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа "зона нечувствительности", при подаче на нее синусоидального входного сигнала. + +Этап 1 - запрос и обработка введенных параметров системы: + +```py +>>> znach = input("k1, T, k2, Xm, A, F, N = ").split(",") +>>> k1, T, k2, Xm, A, F, N = 7, 4, 2, 5, 2, 0.01, 100 +>>> 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]) +``` + +Этап 2 - реализация входного сигнала: + +```py +>>> import math +>>> vhod = [] +>>> for i in range(N): +... vhod.append(A * math.sin((2 * i * math.pi) / F)) +... +>>> vhod + [0.0, 7.857546894913888e-15, 1.5715093789827776e-14, -2.038010347584904e-13, 3.143018757965555e-14, -6.428332918551267e-13, -4.076020695169808e-13, -1.081865548951763e-12, ..., -7.666359036382766e-12, -6.521633112271693e-12, -5.376907188160619e-12, -1.8784096492416397e-11, -3.0874553399384703e-12] +``` + +Этап 3 - создание функций, реализующих компоненты системы: + +```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): +... return 0 +... elif xtt >= gran: +... return xtt - gran +... elif xtt <= (-gran): +... return xtt + gran +``` + +Этап 4 - соединение компонент в соответствии с заданием и получение выходного сигнала: + +```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, 2.0750309723388316, 0, -12.800524758874488, 11.328734010636943, 37.9986846091337, -51.695128234754044, -93.73359277523646, 176.80628109766909, 206.3512386278131, -546.6832050741272, -399.06819555417735, 1598.4573240949626, 604.2307443815814, -4487.243599090263, -296.234076116122, 12162.217953139934, -2805.586281370296, -31870.75393905672, 17036.29869407474, 80623.4912164512, -69802.97975583967, -195996.03820751337, 245998.54033834403, 453751.31553486304, -796405.0354457049, -982958.5881199688, 2433666.144586724, 1918572.300755354, -7113910.846421458, -3041359.0662945407, 20031038.041300073, 2216408.8952286365, -54513798.16041583, 10262153.3054456, 143509014.33326405] +``` + + +### 7. Завершение работы со средой. + +Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE.