Здравствуйте, дорогие друзья. Я Сергей Балакирев, и мы продолжаем серию занятий по функциям языка Python. На данный момент мы с вами уже знаем, как объявлять функции, которым можно передавать произвольное количество позиционных или именованных аргументов. Для этого в параметрах прописываются соответствующие коллекции ARCS и KWorks. Давайте для примера объявим такую вот функцию Box ND, который будет вычислять либо периметр многомерного прямоугольного параллелепипеда, либо его объём. в зависимости от значения вот этого вот параметра периметр. То есть если периметр труue, то вычисляется периметр, а иначе вычисляется объём. Делается это очень просто. Значит, у него есть вот три обычных параметра ABC. Соответственно, это длина вот этих вот сторон ABC. Но если вот это вот прямоугольный пролепипед у нас будет представлен не в трёхмерном пространстве, а, скажем, в четырёхмерном или в пятимерном, соответственно, у него будет большее количество этих сторон. И это большее количество сторон будет помещаться вот в эту коллекцию ARКС. Ну и, соответственно, мы вот здесь вот подсчитываем либо периметр этого многомерного прямоугольного параллепипеда, либо, соответственно, его объём. Для этого здесь вот в программе мы её так и прописываем. Значит, три параметра. Потом звёздочка ARКС - это коллекция, которая принимает произвольное количество позиционных аргументов. Ну и вот такой вот именованный параметр периметр с начальным значением true. То есть по умолчанию вычисляется периметр. Теперь вот эту вот функцию боx n мы с вами можем вызвать разными способами, например, такими. Значит, пусть у нас будет переменная RS1. Значит, вызываем функцию бокс ND. И обязательно здесь должны указать аргументы для вот этих вот первых трёх параметров А, B и C. Ну, например, как позиционные 5 7 3. В итоге у нас вот эти вот параметры ABC будут принимать соответствующие значения. И здесь вычисляться периметр, потому что по умолчанию вот этот вот параметр периметр у нас значение тру принимает. Ну и вычисленное значение, соответственно, возвращается и сохраняется с помощью переменной RS1. Или мы можем сделать так: вызвать вот эту вот функцию бук, но указав большее количество позиционных аргументов. Ну, например, 5 7 3. Ну и ещё два каких-нибудь 5 и 2. То есть у нас получается уже вот такой вот многомерный прямоугольный параллерепипед. У него пять сторон. То есть он как бы представлен в пятимерном пространстве. Соответственно, первые три вот этих вот аргумента 573 попадают в параметры ABC, а остальные 5 и2 вот в эту коллекцию ARКS. Соответственно, здесь также подсчитывается у нас периметр и возвращается. Или можем сделать так. Вызываем функцию box. Здесь указываем какие-либо позиционные аргументы, ну, допустим, те же самые. И дополнительно ещё можем прописать вот этот вот параметр периметр и указать у него значение false. Вот все эти варианты, как вы понимаете, вполне работоспособны. Если мы запустим программу, то никаких ошибок у нас с вами не будет. И обратите внимание, что вот в этом последнем вызове вот этот вот аргумент, периметр мы можем задавать только как именованный. То есть, если бы мы его прописали просто вот так вот fse, то он воспринимался бы как обычный позиционный аргумент и, соответственно, попал бы вот в эту коллекцию ARКS. И на значение вот этого вот параметра это никак бы не повлияло. И это здесь ключевой момент. То есть получается, что параметры функции, которые записаны после вот этой вот коллекции ARКС, мы можем в них передавать значения только с помощью именованных аргументов и никак иначе. а именно вот таким вот образом прописать имя параметра и потом его значение. Давайте теперь вот в эту функцию Boxd добавим ещё один параметр, пусть он будет называться initial и коллекцию KWorks, которая у нас будет сохранять переданные именованные аргументы. И обратите внимание, я вот у этого параметра специально не указал начальное значение, чтобы показать, что это не приведёт к ошибке. Хотя, если бы вот этой вот коллекции АРКС у нас с вами не было, то вот такая вот запись была бы недопустима. Она сейчас сработает только по той причине, что интерпретатор языка Python понимает, что все параметры, которые записаны после вот такой вот коллекции ARCs, следует воспринимать как именованные. То есть мы в них можем передавать значение только с помощью именованных аргументов. Ну и, соответственно, вот здесь вот, когда вызывается функция Boxn, мы должны указать дополнительно значение вот этого вот параметра. Соответственно, это можно сделать только так: прописать его имя, intial и, соответственно, некое начальные значение. Ну и чтобы он играл здесь какую-то роль, давайте мы его прибавим к конечному значению. То есть вот здесь плюс иниal и здесь тоже плюс. То есть вот так вот будет вполне допустимо делать. Соответственно, вот здесь вот в следующем вызове функции мы также должны прописать initial, допустим, со значением ноль. Ну и давайте для примера ещё пропишем какой-нибудь параметр. Пусть это будет Verbus со значением true. То есть вот этот вот параметр, который здесь не фигурирует, он автоматически будет попадать вот в эту коллекцию KWorks. Ну
Segment 2 (05:00 - 09:00)
или можем сделать так: прописать initial, допустим, значением -1, а потом вот этот вот параметр-периметр. То есть вот эти вот именованные аргументы, как вы понимаете, могут быть записаны в самом разном порядке. Запускаем программу и видим, что всё работает, никаких ошибок нету. То есть действительно, когда у нас присутствует вот эта вот коллекция, специальная коллекция ARC, то все параметры, которые идут после неё, они становятся автоматически именованные. Если мы вот здесь вот коллекцию Arc уберём, то, соответственно, возникнет ошибка. Ошибка уже при определении вот этой вот функции, потому что вот этот параметр и просто так уже записать нельзя. Он воспринимается как обычный параметр. Если перед ним фигурирует параметр с неким начальным значением, то у этого тоже должно быть некое начальное значение. А вот если здесь мы дополнительно прописываем вот эту вот коллекцию ARКS, то все эти параметры сразу автоматически интерпретатором языка Python воспринимается как именованные, и, соответственно, начальное значение, например, вот у initial можно не прописывать. То есть вот такая вот особенность существует, когда мы используем вот такую вот коллекцию Arcs. Но смотрите, вот это вот имя ARCs, которое мы постоянно прописывали после звёздочки- это некий стандарт, принятый в языке Python. И, конечно же, никто нам не мешает использовать любое другое. Например, оставить просто первые две буквы и прописать вот так вот R. Соответственно, вот здесь вот в теле функции мы тоже везде меняем это на R. И при этом ничего кардинально не меняется. Хотя делать так не рекомендуется, чтобы не ухудшать читабельность программы. Но мы можем пойти ещё дальше и вообще убрать символы перед звёздочкой и всё записать вот в таком вот виде. Соответственно, вот здесь вот в теле функции у нас уже не будет этой коллекции. Мы ей не можем воспользоваться, поэтому остаются только первые три вот эти вот параметры, а звёздочка R вынуждены убрать. Что же в итоге получилось? Смотрите, теперь функция боx. Нет коллекции, которая бы сохраняла дополнительные переданные позиционные аргументы, кроме вот этих вот первых трёх, то есть которые сохраняются с помощью параметров А BC. И вызов функции вот этой вот бок теперь можно делать следующим образом. Ну, например, мы вот эти вот первые три параметра можем передать как нам угодно. Ну, например, используя обычный позиционный аргумент, а здесь, допустим, именованные аргументы C и B. Так вполне допустимо делать. Или можем прописать по-простому, просто три аргумента A BC. Давайте вот здесь вот инициал поставим ноль для простоты. И у нас получается, что мы можем вызывать функцию боксн, просто передавая первые три аргумента. А вот так вот, например, делать мы уже не можем. Например, если мы хотим, чтобы вот этот вот параметр, периметр принимал значение fф, то просто fse прописать уже не получится, потому что вот эта вот звёздочка накладывает ограничение на параметры, которые прописаны после неё. И, в частности, параметры периметр инициал мы можем менять только с помощью именованных аргументов. То есть прописывать вот так вот периметр равняется false. И то же самое и сни. Если мы хотим поменять его значение, то, соответственно, должны прописать initial и соответствующие значения. Либо использовать оба эти параметра. Допустим, со значением 10 и периметр со значением фолs эти варианты вполне допустимы. В итоге у нас с вами получается, что вот этот символзвёздочка, который можно прописывать в параметрах функции, разделяет эти параметры на обычные и именованные. То есть те параметры, которые записаны перед звёздочкой, в них можно передавать данные и с помощью позиционных аргументов, и с помощью именованных. А вот в те, которые записаны после звёздочки, мы можем передавать данные только через именованные аргументы. При этом картина кардинально не меняется, если вместо звёздочки будет использована вот такая вот коллекция Arcs. Всё то же самое. Все те параметры, которые идут до коллекции ARКС - это обычные параметры, и у них могут быть какие-либо начальные значения даже. А вот те, которые идут после коллекции ARC, то есть после вот этой вот звёздочки, в них мы можем передавать значение только с помощью именованных аргументов. Вот такую вот роль выполняет символ звёздочка в параметрах функции. เฮ