Саммерфилд - Программирование на Python 3 (1077331), страница 46
Текст из файла (страница 46)
Но если мы попытаемся использовать позиционные аргументы, например: рг101 ве1ор("А4" ), будет возбуждено исключение ТуреЕггог. Так же, как мы распаковываем последовательности для заполнения позиционных параметров, можно распаковывать и отображения— с помощью оператора распаковывания отображений (**).' Мы можем использовать оператор **, чтобы передать содержимое словаря в функцию рг!п1 ве1ор(). Например: ор11опв = отсс(рврег="А4", со1ог=тгое) ргтпт автор(**ор11опв) В данном случае пары «ключ-значение» словаря ор11опв будут распакованы, и каждое значение будет ассоциировано с параметром, чье имя соответствует ключу этого значения. Если в словаре обнаружится ключ, не совпадающий ни с одним именем параметра, будет возбуждено исключение ТуреЕггог.
Любые аргументы, для которых в словаре не Как мы уже видели э главе 2, когда * ° используется в качестве двухместного оператора, ов является аналогом функции рои(). Глава 4. Управляющие структуры и функции найдется соответствующего элемента, получат значение по умолчанию, но если такие аргументы не имеют значения по умолчанию, будет возбуждено исключение ТуреЕггог.
Кроме того, имеется возможность использовать оператор распаковывания вместе с параметрами в объявлении функции. Это позволяет создавать функции, способные принимать любое число именованных аргументов. Ниже приводится функция аоо регвоп сета!1в(), которая принимает номер карточки социального страхования и фамилию в виде позиционных аргументов, а также произвольное число именованных аргументов: Оат асо регвоп Оата11в(ввп, вогпапз, * Кнагрз): рг!пт("ввя =", взп) рг!пт(" вогпаае =", вогпааа) тог кау тп вогтео(киагов): ргтпт(" (О) = (1)'К тогаат(кау, Кнагсв[кзу])) Функциярпп10 Функция рг!пт() может принимать произвольное число позиционных аргументов и имеет три именованных аргумента: вер, епо' и Г!1е.
Все именованные аргументы имеют значение по умолчанию. В качестве значения по умолчанию для параметра вер используется пробел — если функции передано два или более позиционных аргументов, при выводе они отделяются друг от друга значением вер, но если функция получит единственный позиционный аргумент, этот параметр в выводе не участвует. В качестве значения по умолчанию для параметра епо используется символ кп, именно по этой причине функция рг1пт() завершает вывод своих аргументов переводом строки.
В качестве значения по умолчанию для параметра Г!1е используется вув. второ!, поток стандартного вывода, который обычно представляет консоль. Имеется возможность переопределять значение любого именованного аргумента, если значения по умолчанию чем-то не устраивают. Например, в аргументе т!1е можно передать объект файла, открытый на запись или на дополнение в конец, а в аргументах вер и епо' можно передавать любые строки, включая пустые.
Когда необходимо вывести несколько элементов в одной и той же строке, обычно применяется прием, когда функция рг!пт() вызывается с аргументом епо, в качестве значения которого используется требуемый разделитель, а в самом конце вызывается функция рг!пт() без аргументов, только для того, чтобы',вывести символ перевода строки.
Например, смотрите функцию рктп! о!- 01!в() (стр. 213). г1З Собственные функции Эта функция может вызываться как только с двумя позиционными аргументами, так и с дополнительной информацией, например: ад0 регяоп сета!1я(83272171, 76отйег", рогепаве="Еех1я", аце=47). Такая возможность обеспечивает огромную гибкость.
Конечно, мы можем также одновременно принимать переменное число позиционных аргументов и переменное число именованных аргуМентов: сег рыпт агця(*агдя, **княгдя). Гог 1, агд тп еповегате(агдя): рмпт("роя111опа1 агдовепт (0) = (1)".(огват(1, агц)) Гог Кеу 1п Кнагдя: рг1пт("кеуного агдовепт (О) = !1)".(огват(кеу, кнагдя[кеу])) Эта функция просто выводит полученные аргументы. Она может вызываться вообще без аргументов или с произвольным числом позиционных и именованных аргументов. Доступ к переменным в глобальной области видимости Иногда бывает удобно иметь несколько глобальных переменных, доступных из разных функций программы.
В этом нет ничего плохого, если речь идет о «константах», но в случае переменных — это не самый лучший выход, хотя для коротких одноразовых программ это в некоторых случаях можно считать допустимым. Программа г](И(1 патея.ру принимает необязательный код языка («еп» или «Гг») и число в виде аргументов командной строки и выводит названия всех цифр заданного числа. То есть если в командной строке программе было передано число «123», она выведет «опе Ьчо !атее». В программе имеется три глобальные переменные: (апдоаде = "еп" еи6ПЕн = (О: 7тего", 1.
'"опе", 2; "тно", 3: "тпгее", 4: "гоог", 5: Р(1че", 6: "я1х", 7: "яечеп", 8, "е1дот", 9: "п1пе") енеисн = (О; ртйго", 1: "оп", 2: "оеох", 3: "!готя", 4, "доя!ге", 5: "с!по", 5: "я!х", 7: "яерт", 8. "по!1", 9: "пеог') Мы следуем соглашению, в соответствии с которым имена переменных, играющих роль констант, записываются только символами верхнего регистра, и установили английский язык по умолчанию. (В языке Ру(]топ отсутствует прямой способ создания констант, вместо этого он полностью полагается на то, что программист будет неуклонно следовать общепринятым соглашениям.) В некотором другом месте программы выполняется обращение к переменной Еапцоаце, и ее значение используется при выборе соответствующего словаря: оег рмпт о1дття(о!От!я): о!ст1опагу = еид!15н (т еапдояде == "еп" е1яе ейеисн Гог О1911 тп О1911я: рг)пт(о)с11опагу[1пт(о!911)], епо=" ") ргпн() Глава 4.
Управляющие структуры и функции Когда интерпретатор Ру(]топ встречает имя переменной (апдиаде внутри функции, он пытается отыскать его в локальной области видимости (в области видимости функции) и не находит. Поэтому он продолжает поиск в глобальной области видимости (в области видимости файла .ру), где и обнаруживает его. Назначение именованного аргумента епс, используемого в первом вызове функции рг1пт(), описывается во врезке «Функция рг1п10». Ниже приводится содержимое функции аа! и() программы. Она изменяет значение переменной (апдиаде в случае необходимости и вызывает функцию рг1пт 419!тв() для вывода результата. овг аатп(); !т 1вп(вув.агдч) == 1 ог вув.агдч[1] 1п ("-П", "--Пе1р"): рг!пт("ивара: (О] [вп]тг] пиаоег".Гогват(вув.агдч[0])) вув,ехы() агдв = вув, а гдч[ 1: ] !т аг9в[0] 1п ("вп", "тг"): 91оса1 (апдиадв (апдиадв = агдв.рор(0) ргтпт О!9!(в(агдв.рор(О)) Обратите внимание на использование инструкции 91оЬа1 в этой функции.
Эта инструкция используется для того, чтобы сообщить интерпретатору, что данная переменная существует в глобальной области видимости (в области видимости файла .ру) и что операции присваивания должна применяться к глобальной переменной; без этой инструкции операция присваивания создаст локальную переменную с тем же именем. Если не использовать инструкцию 91оЬа1, программа сохранит свою работоспособность, но когда интерпретатор встретит переменную (апди аде в условной инструкции !г, он попытается отыскать ее в локальной области видимости (в области видимости функции) и, не обнаружив ее, создаст новую локальную переменную с именем [апдиаде, оставив глобальную переменную [апдиаде без изменений.
Эта малозаметная ошибка будет проявляться только в случае запуска программы с аргументом «1г», потому что в этом случае будет создана новая локальная переменная (апдиаде, в которую будет записано значение «Гг», а глобальная переменная (апдиаде, которая используется функцией рг1пт С!д!тв(), по-прежнему будет иметь значение «еп». В сложных программах лучше вообще не использовать глобальные переменные, за исключением констант, которые не требуют употребления инструкции 91ОЬа1.
Собственные функции Лямбда-функции Лямбда-функции — это функции, для создания которых используется следующий синтаксис: 1авпаа рагаватегв: ахргавюпп Часть рагавегегв является необязательной, а если она Функции- присутствует, то обычно представляет собой простой генераторы, список имен переменных, разделенных запятыми, то стр.324 есть позиционных аргументов, хотя при необходимости допускается использовать полный синтаксис определения аргументов, используемый в инструкции Оет. Выражение ехргеввуоп не может содержать условных инструкций или циклов (хотя условные выражения являются допустимыми), а также не может содержать инструкцию гете гп (или у(е10).
Результатом лямбда-выражения является анонимная функция. Когда вызывается лямбдафункция, она возвращает результат вычисления выражения ехргеввтоп. Если выражение ехргеввтоп представляет собой кортеж, оно должно быть заключено в круглые скобки. в = 1авааа х: '" тт х == 1 е1ве "в' Лямбда-выражение возвращает анонимную функцию, которая присваивается переменной в. Любая (вызываемая) переменная может вызываться как функция при помощи круглых скобок, поэтому после выполнения некоторой операции можно при помощи функции в() вывести сообщение с числом обработанных файлов, например: рг[п(("(О) (а)е(1) ргосеввет]".
тогват(соипц в(сонат) ). Лямбда-функции часто используются в виде аргумента Кеу встроенной функции вог1ее() или метода 1131. вог1(). Предположим, что имеется список, элементами которого являются трехэлементные кортежи (номер группы, порядковый номер, название), и нам необходимо отсортировать этот список различными способами. Ниже приводится пример такого списка: е!евептв = [(2, 12, "Мд"), (1, 11. "Ма"), (1, 3, УВ!"), (2, 4, "Ва")] Отсортировав список, мы получим следующий результат: [(1, 3, '[т'), (1, 11, 'Ма'), (2, 4, 'Ва'), (2, 12, 'Мд )] Ранее, когда мы рассматривали функцию вот!ее ( ), то ви дели, что имеется возможность изменить порядок сорти ровки, если в аргументе кеу передать требуемую функ о Функция аогтаа(), стр.