Здравствуйте, дорогие друзья. Я Сергей Балакирев, и мы продолжаем серию занятий по функциям языка Python. На предыдущем занятии мы с вами познакомились с особенностями использования символа звёздочка в параметрах функции. Продолжая эту тему, мы увидим работу ещё одного символа слш, который тоже позволяет настраивать вызовы функции. Давайте вначале для примера объявим очень простую функцию, которая пусть называется triangle и вычисляет периметр треугольника. То есть у неё будет три обычных параметра. ABC. И, соответственно, возвращается сумма длин сторон треугольника, то есть а + b и + c. Вот такая вот простая функция. И мы с вами уже знаем, как можно вызвать эту функцию. То есть здесь множество разных способов. Ну, например, пусть, значит, вот первый результат S1 переменная. Потом вызываем функцию. И здесь можно передать просто позиционные аргументы. Ну, например, 10, 20 и 30. Или можем сделать так. Значит, пусть здесь будет переменная RS2. И такие аргументы. Значит, мы воспользуемся именованными аргументами C20 и B30. Так, очевидно, тоже можно делать. Ну и так далее. То есть все вот эти вот варианты, они вполне допустимы. Если мы запустим программу, то она выполнится без каких-либо ошибок. Но что если бы мы захотели запретить вызов функций с именованными аргументами, оставить только позиционные? Как это можно было бы сделать? Вот для этого как раз и используется вот этот вот символ слш. Все параметры, которые прописаны до этого символа, в них можно передавать только позиционные аргументы, именованные запрещается. И, соответственно, вот этот вот второй вызов функции triangle приведёт к ошибке. Значит, если мы выполним программу, то как раз вот эту вот ошибку мы здесь с вами и видим. При этом, обратите внимание, сами вот эти вот параметры могут быть объявлены со значением по умолчанию. Это никто не запрещает делать. Если мы объявим функцию триангла вот таким вот образом, то, соответственно, вызвать её можно вот так вот. Либо три аргумента прописать, либо только два. Соответственно, последний будет принимать значение по умолчанию. Давайте выведем на экран то, что у нас получится. С 2. Запустим программу и видим в значении 34. Действительно, 10 + 20 и + 4, получается 34. А вот после слэш можно прописывать любые параметры, в которые можно будет передавать как позиционные, так и именованные аргументы. Значит, вот это вот C = 4 мы уберём. Здесь мы пропишем дополнительно параметр мол. Ну и пусть у нас будет ещё один параметр, который называется offset со значением ноль. Соответственно, вот здесь вот мы с вами умножим всю эту сумму на МУ, чтобы использовались эти параметры. Ну и прибавим вот этот вот офсет. То есть у нас стала вот такая вот функция. Теперь мы можем совершенно спокойно с вами вот здесь вот передавать три позиционных аргумента. И дополнительно, соответственно, вот в этот параметр мол мы тоже должны передать значение. И сделать это можно так. Либо как обычный позиционный аргумент, прописать его, либо с помощью именованного аргумента. То есть, допустим, равно 2. И так, и так будет правильно. Запускаем программу и видим вот такой вот результат. Или дополнительно ещё можем поменять значение вот этого вот параметра оset. Давайте поставим здесь какое-нибудь значение 10. И у нас получится уже вот такой вот вызов функции. Это тоже вполне допустимо делать. получаем значение уже 130. То есть у нас вот здесь вот получается следующее. Все параметры, которые прописаны до вот этого вот символа слэш, в них можно передавать только позиционные аргументы. А вот в те параметры, которые записаны после этого слэш, мы можем передавать как позиционные аргументы, так и именованные, без разницы. То есть это обычные параметры функции. Давайте теперь посмотрим, как можно комбинировать символразделитель слш со специальными параметрами ARКS и KWorks. Предположим, что нам нужно вычислять длину ломанной линии, состоящей из двух и более сегментов. И эта функция у нас будет выглядеть следующим образом. Значит, ниже вот здесь вот я её пропишу с именем poline. У неё будет первые два сегмента. И будем предполагать, что в эти сегменты передаются значения аргументов как позиционные. Поэтому я поставлю слш. То есть мы это будем гарантировать. Дальше после слш мы с вами можем прописать вот такую вот коллекцию ARCS, в которую добавляются дополнительные позиционные аргументы, если они будут. Ну и затем можно прописать различные именованные параметры, допустим, M со значением о, а offset со значением ноль и далее в конце прописать вот такую вот коллекцию keyworks, в которой будут попадать все остальные именованные аргументы. Ну а сама функция полай, предположим, будет делать следующее. Значит, мы будем складывать все вот эти вот сегменты, которые у нас с вами здесь есть. Здесь у нас будет сум ARC. Всё это будем умножать на вот это вот значение MOL и прибавлять осе. И обратите ещё раз внимание на порядок запись параметров. Произвольный набор позиционных аргументов, то есть вот такая вот коллекция, звёздочка ARКС, должна прописываться строго после символа слш. Если мы пропишем ARК перед слш, то будет
Segment 2 (05:00 - 10:00)
ошибка. То есть вот такая вот запись, она приведёт к ошибке. Интегрированная среда здесь сразу подчёркивает, что так объявлять функцию нельзя. Если мы запустим программу, то, соответственно, увидим вот эту вот ошибку. Коллекция ARCS всегда должна прописываться после вот этого вот символа слш, если этот символ, конечно, присутствует при объявлении параметров функции. Ну а вот эта вот коллекция keywork всегда прописывается самый последний. В результате мы получаем следующее. Вот в эти параметры А мы можем передавать только позиционные аргументы. Сюда, соответственно, дополнительные позиционные аргументы, если они у нас будут. А вот в эти параметры M и осем передавать значения только с помощью именованных аргументов. Если будут какие-то дополнительные именованные аргументы, то они автоматом будут впадать в коллекцию keywords. То есть вот так вот работает набор параметров данной функции. Ну и давайте посмотрим, как можно было бы вызвать её. Значит, вот здесь вот мы с вами вызовем функцию polyлайine и передадим, соответственно, два аргумента 0 и 5. Эти первые два аргумента 0 и5 будут впадать вот в эти параметры А и B. Далее, если у нас будут какие-то ещё позиционные аргументы, ну, допустим, вот такие, то они, соответственно, будут впадать уже в эту коллекцию ARCКС. Интегрированная среда нам здесь это всё чётко показывает. Если же нужно изменить ещё вот эти вот параметры, то их можно менять только с помощью именованных аргументов. Ну, например, вот так вот мол со значением 2. И мы с вами получаем уже вот это вот значение RS1. Давайте запустим программу и убедимся, что всё это работает. Действительно, в данном случае получаем значение 28. Или мы можем вообще здесь не указывать никакие дополнительные позиционные аргументы. Просто 0 5, потом мол 2, и тоже всё будет работать. Значит, запускаем, получаем значение действия в данном случае. А вот указать один позиционный аргумент уже нельзя, потому что вот здесь вот стоят параметры А и B. И в эти параметры обязательно нужно передать позиционные аргументы, а здесь у нас только один. Из-за этого возникнет ошибка. Если мы запустим программу, то эту ошибку как раз и увидим. То есть вот так вот срабатывают все вот эти вот параметры, которые прописаны в функцией полилай. Ну и давайте я приведу ещё один пример, который будет показывать, что в функциях языка Python можно прописывать оба управляющих символа: и слэш, и просто обычную звёздочку. Ну и предположим, что у нас есть функция, которая называется rect, и она у нас будет вычислять либо периметр прямоугольника, либо его площадь. Сделаем это следующим образом. У нас будут первые два параметра with и, которые мы сделаем строго позиционными. То есть их значение можно будет задавать только с помощью позиционных аргументов. Далее после слш у нас будет один параметр, который пусть называется вот так вот offset. Затем поставим обычную звёздочку, после которой пропишем именованный параметр периметр с начальным значением true. Ну и вот такую вот коллекцию KWorks, чтобы вы в целом представляли, как это всё можно задавать. Ну а сама функция будет делать следующее. Будем проверять в начале. Если вот этот вот параметр, периметр принимает значение true, то, соответственно, мы должны вычислить периметр треугольника. И сделаем это следующим образом. Значит, ширина плюс высота умноженная на 2. Ну и прибави вот этого значения в set. А иначе мы с вами будем вычислять его площадь. Значит, здесь у нас будет реон. Ширина умножается на высоту. Ну и тоже прибавим вот это вот смещение offset, чтобы вот этот параметр оset у нас здесь тоже использовался. Вот у нас получилась следующая функция ре. Значит, вот в эти параметры мы можем передавать только позиционные аргументы. В параметр асет мы можем передавать как позиционный аргумент, так и именованный. А вот это вот параметр, периметр, сюда мы можем передавать значение только с помощью именованного аргумента. То есть всё следует интерпретировать вот именно таким образом. Ну и давайте проверим, как это будет работать. Значит, что здесь? Вот мы с вами вызовем вот эту функцию, передадим два позиционных аргумента 1020. И, соответственно, вот здесь вот в третий параметр офсе мы тоже должны что-то передать. Ну вот, допустим, тоже с помощью позиционного аргумента это сделаем. Запускаем программу и в данном случае получаем значение 60. Или можем сделать так. Значит, пусть у нас будет переменна RS2. Первые два параметра 1020, они должны быть позиционные. А далее я пропишу следующим образом. Зададим параметр периметр со значением false. Мы здесь должны использовать только именованный аргумент, потому что этот параметр меняется с помощью именованного аргумента. Ну и, соответственно, дальше можно прописать так: Offset со значением 5. Тоже вполне допустимая конструкция. Если вывезем на экран значение, то у нас в данном случае получится 205. Пусть у нас здесь будет переменна RS3. Два первых аргумента 10 и 20. Потом третий аргумент тоже пусть будет позиционный со значением 10. И далее можно прописать вот такой вот именованный аргумент со значением false. Тоже вполне допустимые конструкции. Запустим программу и видим значение 210. Причём, обратите внимание, если мы вот здесь вот пропишем позиционный аргумент, то уже будет ошибка, потому что вот этот вот параметр, периметр стоит после
Segment 3 (10:00 - 12:00)
символа звёздочки. И как мы с вами уже знаем, все параметры функции, которые прописаны после звёздочки, их значение можно передавать только с помощью именованных аргументов. Поэтому здесь вот должно указать вот так вот периметр со значением false. То есть вот таким вот образом при объявлении функции мы с вами можем использовать специальный символы слэш и звёздочка. Причём символ слэш всегда должен быть прописан перед символом звёздочка. Это строго обязательно. Конечно, мы можем использовать либо только слыш, либо только звёздочку. Это тоже вполне допустимо, и мы с вами уже видели, как это работает. Либо всё это комбинировать. Либо вот здесь вот у звёздочки можем ещё прописать вот так вот arcs. Это по сути дела будет то же самое. только дополнительно здесь мы можем ещё использовать множество позиционных аргументов, которые передаются функции rect. И возможно здесь у вас возникает вопрос, зачем вообще нужны такие управляющие символы в параметрах функции? Здесь есть, по крайней мере, две весткие причины. Во-первых, когда в параметры функции можно передавать только позиционные аргументы, например, вот для этих двух параметров и, то имена этих параметров при вызове вот здесь вот не используются. А значит, в будущем программист вполне может поменять значение этих параметров, допустим, на а и b, и далее в программе за пределами этой функции всё будет по-прежнему работать. Вот это вот слэш это будет гарантировать. И, во-вторых, параметры, прописанные после звёздочки, могут следовать в произвольном порядке, потому что значения в них будут передаваться с помощью именованных аргументов и никак иначе. Всё это даёт некоторую гибкость при разработке и дальнейшего развития программного продукта. Надо сказать, что в программах на Python нередко встречаются вот такие вот управляющие символы слш и звёздочка. Поэтому важно понимать их назначение при вызове соответствующих функций. เฮ