Лутц М. - Изучаем Python (1077325), страница 91
Текст из файла (страница 91)
Однако на основе этой модели язык РуФ]топ обеспечивает дополнительные возможности влиять на способ, которым объекты аргументов сопоставляются с именами аргументов в заголовке функции. Эти возможности можно и не использовать, но они позволяют писать функции, поддерживающие более гибкие схемы вызова.
По умолчанию сопоставление аргументов производится в соответствии с их позициями, слева направо, и функции должно передаваться столько аргументов, сколько имен указано в заголовке функции. Но кроме этого существует возможность явно указывать соответствия между аргументами и именами, определять значения по умолчанию и передавать дополнительные аргументы.
Это достаточно сложный раздел, и прежде чем окунуться в обсуждение синтаксиса, я хотел бы подчеркнуть, что эти специальные режимы не являются обязательными и имеют отношение только к сопоставлению объектов и имен — основным механизмом передачи аргументов по- прежнему остается операция присваивания. Фактически некоторые из этих режимов предназначены в первую очередь для разработчиков библиотек, а не для разработчиков приложений. Но, так как вы можете столкнуться с этими режимами, даже не используя их в своих программах, я коротко опишу их: Сопоставление по позиции: значения и имена ставятся в соответствие по порядку, слева направо Обычный случай, который мы использовали до сих пор: значения и имена аргументов ставятся в соответствие в порядке их следования слева направо.
Специальные режимы сопоставления аргументов 424 Глава 16. Области видимости и аргументы Сопоставление по ключам: соответствие определяется по указанным именам аргументов Вызывающая программа имеет возможность указать соответствие между аргументами функции и их значениями в момент вызова, используя синтаксис паае=ча1ое. Значения по умолчанию: указываются значения аргументов, которые могут не передаваться Функции могут определять значения аргументов по умолчанию на тот случай, если вызывающая программа передаст недостаточное количество значений. Здесь также используется синтаксис паве=чз1ое.
Переменное число аргументов: передача произвольного числа аргументов, позиционных или ввиде ключей Вызывающая программа также может использовать символ * для передачи коллекции аргументов в виде отдельных аргументов. В данном случае символ * имеет обратный смысл по отношению к символу * в заголовке функции — в заголовке он означает коллекцию произвольного числа аргументов, тогда как в вызывающей программе— передачу коллекции в виде произвольного числа отдельных аргументов. В табл.
16.1 приводится синтаксис использования специальных режи- мов сопоставления. Таблица 16.1. Виды сопоставления аргументов функций Синтаксис Местоположение Интерпретация Обычный аргумент: сопоставление про- изводится по позиции Вызывающая программа топо(чз1ое) По ключу: сопоставление производится по указанному имени Вызывающая программа бюс(саае=ча1ое) Все объекты а указанном имени пере- даются как отдельные позиционные ар- гументы топо(*паке) Вызывающая программа голо( "паке) Вызывающая программа Все пары ключ/значение з указанном имени передаются как отдельные аргу.
менты по ключевым словам Обычный аргумент: сопоставление про- изводится по позиции клп по имени сег топо(пзае) Функция Переменное число аргументов: прием произвольного числа аргументов, позиционных или в виде ключей Функции могут использовать специальный аргумент, имени которого предшествует символ *, для объединения произвольного числа дополнительных аргументов в коллекцию (эта особенность часто называется оагагдз, как в языке С, где также поддерживаются списки аргументов переменной длины).
425 Специальные режимы сопоставления аргументов Интерпретация Местоположение Функция Синтаксис еет Гвпс(паве=ча1ве) Значение аргумента по умолчанию, нв случай, если аргумент ве передается функции Определяет н объединяет все допол- нвтельяые аргументы в коллекцию (в кортеж) Функция пег гвпс(*паве) Определяет н объединяет все дополни- тельные аргументы по ключам (в сло- варь) Функция еег гвпс(**паве) В вызывающей программе (первые четыре строки таблицы) при использовании простых значений соответствие именам аргументов определяется по позиции, но при использовании формы павегта1це соответствие определяется по именам аргументов — это называется передачей аргументов по ключам.
Использование символов * и ** в вызывающей программе позволяет передавать произвольное число объектов по позиции или по ключам в виде последовательностей и словарей соответственно. В заголовке функции при использовании простых значений соответствие определяется по позиции илн по имени (в зависимости от того, как вызывающая программа передает значения), но при использовании формы пзве=ча1це определяются значения по умолчанию. При использовании формы паве все дополнительные аргументы объединяются в кортеж, а при использовании формы **паве — в словарь. Наиболее часто в программном коде на языке Ру(Ьоп используются форма передачи аргументов по ключам и по умолчанию. Возможность передачи аргументов по ключам позволяет указывать значения аргументов вместе с их именами, чтобы придать вызову функции больше смысла. Со значениями по умолчанию мы уже встречались, когда рассматривали способы передачи значений из объемлющей области видимости, но на самом деле эта форма имеет более широкую область применения — она позволяет определять необязательные аргументы и указывать значения по умолчанию в определении функции.
Специальные режимы сопоставления позволяют обеспечить свободу выбора числа аргументов, которые должны передаваться функции в обязательном порядке. Если функция определяет значения по умолчанию, они будут использоваться, когда функции передается недостаточное число аргументов. Если функция использует форму * определения списка аргументов переменной длины, она сможет принимать большее число аргументов — дополнительные аргументы будут собраны в структуру данных под именем с символом *. 426 Глава 16. Области видимости и аргументы Примеры использования ключей и значений по умолчанию Предыдущие пояснения в программном коде выглядят гораздо проще.
В языке Ру()топ по умолчанию сопоставление значений и имен аргументов производится по позиции, как и в большинстве других языков. Например, если определена функция, которая требует передачи трех аргументов, она должна вызываться с тремя аргументами: »> Сот т(а, Ь, с). рггпт а, Ь, с Здесь значения передаются по позиции — имени а соответствует значение 1, имени Ь соответствует значение 2 и т.
д.: »> Г(1, г, 3) 123 Ключи В языке Ру()гоп существует возможность явно определить соответствия между значениями и именами аргументов при вызове функции. Ключи позволяют определять соответствие по именам, а не по позициям; »> т(с=з, Ь=2, а=1) 123 В этом вызове 0=3, например, означает, что значение 3 передается функции в аргументе с именем с. Говоря более формальным языком, интерпретатор сопоставляет имя с в вызове функции с именем аргумента о в заголовке определения функции и затем передает значение 3 в этот аргумент.
Результат этого вызова будет тем же, что и предыдущего. Обратите внимание, что при использовании ключей порядок следования аргументов не имеет никакого значения, потому что сопоставление производится по именам, а не по позициям. Существует даже возможность объединять передачу аргументов по позициям и по ключам в одном вызове. В этом случае сначала будут сопоставлены все позиционные аргументы, слева направо, а потом будет выполнено сопоставление ключей с именами: »> т(1, с=з, Ь=2) 123 Большинство из тех, кто впервые сталкивается с такой возможностью, задаются вопросом: где такая возможность может пригодиться7 В языке Ру1)гоп ключи обычно играют две роли.
Первая: они делают вызовы функций более описательными (представьте, что вы используете имена аргументов более осмысленные, чем простые з, ь и с). Например, такой вызов: топо(папе='ВоЬ', есе440, )оЬ= 'Оеч') 427 Специальные режимы сопоставления аргументов несет больше смысла„чем вызов с тремя простыми значениями, разделенными запятыми, — ключи играют роль меток для данных, участвующих в вызове. Вторая: ключи используются вместе со значениями по умолчанию, о которых мы поговорим далее.
Значения по умолчанию О значениях по умолчанию мы немного говорили ранее, когда обсуждали области видимости вложенных функций. Если коротко, значения по умолчанию позволяют сделать отдельные аргументы функции необязательными — если значение не передается при вызове, аргумент получит значение по умолчанию, перед тем как будет запущено тело функции. Например, ниже приводится функция, в которой один аргумент является обязательным, а два имеют значения по умолчанию: »> сат Г(а, Ь=2, с=3): рг1лт а, Ь, с При вызове такой функции мы обязаны передать значение для аргумента а, по позиции или по ключу, а значения для аргументов Ь и с можно опустить.
Если значения аргументов Ь и с будут опущены, они примут значения по умолчанию 2 и 3, соответственно: »> г(1) !23 »> Г(а=т) 1 2 3 Если функции передать только два значения, аргумент с примет значение по умолчанию, а если три — ни одно из значений по умолчанию не будетиспользовано: »> Г(1, 4) 143 »> Г(1, 4, 5) 145 Наконец, ниже приводится пример взаимодействия режимов передачи значений по ключу и по умолчанию. Поскольку ключи могут нарушать обычный порядок отображения аргументов слева направо, они, по сути, позволяют «перепрыгивать» через аргументы со значениями по умолчанию: »> Г(1, с=6) 126 Здесь значение 1 будет сопоставлено с аргументом по позиции, аргумент с получит значение 6, а аргумент Ь, в середине, — значение по умолчанию 2.