Как передать словарь в функцию python

от admin

Как передать словарь в функцию python

Одной из распространенных сфер, где применяются упаковка и распаковка — это параметры функций. Так, в определениях различных функций нередко можно увидеть, что они принимают такие параметры как *args и **kwargs .

Термины args и kwargs — это соглашения по программированию на Python, в реальности вместо них можно использовать любые именования. *args представляет параметры, которые передаются по позиции. А **kwargs означает параметры, которые передаются по имени. обозначает аргументы ключевого слова.

Оператор * применяется с любым итерируемым объектом (например, кортежем, списком и строками). Тогда как оператор ** можно использовать только со словарями.

Оператор * позволяет передать в функцию несколько значений, и все они будут упакованы в кортеж:

Здесь функция fun принимает кортеж значений. При вызове мы можем передать ей различное количество значений. Так, в примере выше передается четыре строки, которые образуют кортеж. Консольный вывод программы:

Благодаря такой возможности мы можем передавать в функцию переменное количество значений:

Оператор **

Оператор ** упаковывает аргументы, переданные по имени, в словарь. Имена параметров служат ключами. Например, определим функцию, которая просто будет выводить все переданные параметры

Консольный вывод программы:

Поскольку аргументы передаются в функцию в виде словаря, то внутри функции через ключи мы можем получить их значения:

Консольный вывод программы:

Распаковка аргументов

Выше было описано, как операторы * и ** применяются для упаковки аругментов в кортеж и словарь соответственно. Но эти же операторы могут использоваться для распаковки.

Оператор * и распаковка

Сначала рассмотрим ситуацию, где это может пригодиться.Пусть мы передаем в функцию кортеж:

Здесь в вызов функции sum передается кортеж. Параметр *args по сути тоже представляет кортеж, и кажется, все должно работать. Тем не менее мы столкнемся с ошибкой

То есть в данном случае кортеж numbers передается как элемент кортежа *args .

И чтобы элементы кортежа были переданы в кортеж *args как отдельные значения, необходимо выполнить их распаковку:

Здесь при передачи кортежа numbers в функцию sym применяется распаковка: *numbers

Другим случаем распаковки может быть ситуация, когда функция принимает несколько параметров, а мы передаем один кортеж или список:

В данном случае выражение *person раскладывает кортеж person на отдельные значения, которые передаются параметрам name, age и company.

Оператор ** и распаковка

Оператор ** применяется для распаковки словарей:

Здесь выражение **tom раскладывает словарь на отдельные значения, которые передаются параметрам name, age и company по названию ключей.

Сочетание параметров

Параметры *args и *kwargs могут использоваться в функции вместе с другими параметрами. Например:

Дополнительно¶

К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся использовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.

Передача кортежей¶

Хотелось ли вам когда-нибудь, чтобы функция возвращала не один результат, а два? Это возможно. Всё, что для этого нужно, — использовать кортеж.

Обратите внимание, что использование выражения » a, b = <некоторое выражение> » интерпретирует результат как кортеж из двух значений.

Чтобы интерпретировать результат как » (a, <всё остальное>) «, нужно просто поставить звёздочку, как это делалось для параметров функций:

Это также подразумевает, что поменять местами два значения в Python быстрее всего можно так:

Специальные методы¶

Есть ряд методов, играющих особую роль для классов. Например, __init__ и __del__ .

Специальные методы служат для того, чтобы имитировать поведение встроенных типов данных. Например, всё, что потребуется для использования операции индексирования x[индекс] применительно к своему классу (в таком виде, как это делалось для списков и кортежей), это реализовать метод __getitem__() . Кстати, именно этот метод Python использует для самого класса list !

Некоторые полезные специальные методы перечислены в таблице ниже. Все другие методы можно посмотреть в документации.

Имя Описание
init(self, . ) Этот метод вызывается прямо перед тем, как вновь созданный объект возвращается для использования.
del(self) Вызывается перед уничтожением объекта
str(self) Вызывается при использовании функции print или str() .
lt(self, other) Вызывается, когда используется оператор «меньше» (<). Существуют и аналогичные методы для всех операторов (+, >, и т.д.)
getitem(self, key) Вызывается при использовании оператора индексирования x[индекс]
len(self) Вызывается при обращении к встроенной функции len() для объекта-последовательности.

Блоки в одно выражение¶

Мы неоднократно говорили, что каждый блок команд отделяется от других своим собственным уровнем отступа. Однако, существует и исключение. Если блок команд содержит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:

Обратите внимание, что единственный оператор расположен в той же строке, а не отдельным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но я настоятельно рекомендую избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.

Lambda-формы¶

Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы. lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвращается новой функцией.

Пример: (сохраните как lambda.py )

Вывод:

Как это работает:

Обратите внимание на то, что метод sort класса list может принимать параметр key , определяющий способ сортировки списка (обычно мы думаем только о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдельный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.

Генераторы списков¶

Генераторы списков служат для создания новых списков на основе существующих. Представьте, что имеется список чисел, на основе которого требуется получить новый список, состоящий из всех чисел, умноженных на 2, но только при условии, что само число больше 2. Генераторы списков подходят для таких задач как нельзя лучше.

Пример: (сохраните как list_comprehension.py )

Вывод:

Как это работает:

В этом примере мы создаём новый список, указав операцию, которую необходимо произвести ( 2 * i ), когда выполняется некоторое условие ( if i > 2 ). Обратите внимание, что исходный список при этом не изменяется.

Преимущество использования генераторов списков состоит в том, что это заметно сокращает объёмы стандартного кода, необходимого для циклической обработки каждого элемента списка и сохранения его в новом списке.

Передача кортежей и словарей в функции¶

Для получения параметров, переданных функции, в виде кортежа или словаря, существуют специальные приставки » * » или » ** » соответственно. Это особенно полезно в случаях, когда функция может принимать переменное число параметров.

Поскольку перед переменной args указана приставка » * «, все дополнительные аргументы, переданные функции, сохранятся в args в виде кортежа. В случае использования приставки » ** » все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.

exec и eval¶

Функция exec служит для выполнения команд Python, содержащихся в строке или файле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec :

Аналогично, функция eval позволяет вычислять корректные выражения Python, содержащиеся в строке. Вот простой пример.

Оператор assert¶

Оператор assert существует для того, чтобы указать, что нечто является истиной. Например, если требуется гарантировать, что в списке будет хотя бы один элемент, и вызвать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи. Когда заявленное выражение ложно, вызывается ошибка AssertionError . Метод pop() возвращает последний элемент списка, одновременно удаляя его оттуда.

Тем не менее, оператор assert следует использовать благоразумно. В большинстве случаев гораздо лучше «отлавливать» исключения и либо решать соответствующую проблему автоматически, либо выдавать пользователю сообщение об ошибке и завершать работу программы.

Функция repr¶

Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object .

По большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод __repr__ в собственном классе, можно указать, что он будет возвращать по вызову функции repr .

Управляющие последовательности¶

Попробуйте ответить на вопрос: Как указать строку, содержащую одинарную кавычку ( ‘ )? Например, строку » What’s your name? «. Её ведь нельзя записать просто как » ‘What’s your name?’ «, потому что тогда Python не сможет определить, где начало строки, и где конец. В таком случае придётся каким-то образом указать, что данная одинарная кавычка не обозначает конца строки. Это можно сделать при помощи так называемой управляющей последовательности. Укажите одинарную кавычку как \’ — через обратную косую черту. Теперь наша строка будет выглядеть так: ‘What\’s your name?’ .

Другой способ записи такой специфической строки — «What’s your name?» , т.е. с использованием двойных кавычек. Аналогично следует использовать управляющую последовательность для вставки двойной кавычки в строку, ограниченную двойными кавычками. Сама же обратная наклонная черта указывается управляющей последовательностью \\ .

А как записать двустрочную строку? Один из вариантов нам уже знаком — заключить строку в тройные кавычки, как было показано :ref: ранее <triple-quotes> . Но есть и другой — использовать управляющую последовательность для символа перевода строки \n . Например: » Это первая строка\nЭто вторая строка «. Полезно знать ещё одну управляющую последовательность — табуляцию ( \t ). Управляющих последовательностей существует намного больше, но здесь упомянуты только наиболее важные.

Следует отметить, что одинарная наклонная черта в конце строки лишь указывает на то, что продолжение идёт строкой ниже, но не вставляет перевода строки. Например:

эквивалентно записи «Это первое предложение. Это второе предложение.» .

Необрабатываемые строки¶

Для записи строки, в которой не будет проводиться никакой специальной обработки, как, например, управляющих последовательностей, перед строкой указывается приставка » r » или » R » 1 . Например, r»Перевод строки обозначается \n» .

Замечание для пользователей регулярных выражений

Для работы с регулярными выражениями всегда используйте необрабатываемые строки. В противном случае вас ждёт много возни с обратными косыми чёрточками. Например, обратные ссылки можно обозначать как ‘\\1′ или r’\1’ .

Резюме¶

Итак, в настоящей главе мы рассмотрели некоторые дополнительные возможности Python, хотя по-прежнему, не охватили всего. Тем не менее, к настоящему моменту мы уже прошли почти всё, что вам когда-либо понадобится использовать на практике. Этого вполне достаточно для начала работы над любыми программами.

Далее мы обсудим, как продолжать исследовать Python.

«r» — от англ. «raw» — «сырой, необработанный» (прим. перев.) ↩

Python. Аргументы в функциях. Передача аргументов в функцию. Изменение аргументов в теле функции

В функцию могут передаваться аргументы. Аргументы – это изменяемые или неизменяемые объекты. В языке Python имеет значение, к какой категории объектов (изменяемых или неизменяемых) принадлежит аргумент.

Например, к изменяемым объектам относятся списки и словари. К неизменяемым объектам относятся числа, строки, кортежи.

Если в функцию передается неизменяемый объект, то этот объект передается «по значению». Это значит, что изменение этого объекта внутри функции не изменит его в вызывающем коде.

Если в функцию передается изменяемый объект, то этот объект передается по «указателю». Изменение такого объекта внутри функции повлияет на этот объект в вызывающем коде.

2. Примеры передачи неизменяемых объектов в функцию
2.1. Передача числа в функцию.

В примере, в демонстрационных целях реализована функция Mult2() , которая получает параметром число. В теле функции это число удваивается. Полученный результат выводится.

После запуска программа выдаст следующий результат

Как видно из результата, в функции значение числа num умножается на 2 и составляет 50. Однако, этот результат не передается в вызывающий код, здесь значение num остается равным 25 как до вызова функции. Это подтверждает передачу «по значению» неизменяемого объекта, которым есть число.

2.2. Передача строки в функцию

Демонстрируется работа функции ReverseStr() , которая реверсирует строку, получаемую параметром.

Результат выполнения программы

Так же, как и в предыдущих двух примерах, передача кортежа в функцию происходит по значению.

3. Примеры передачи изменяемых объектов в функцию
3.1. Передача списка в функцию

Демонстрируется функция, которая получает список в качестве параметра. Затем в теле функции этот список изменяется (изменяются первый и второй элементы списка).

Результат работы программы

Как видно из результата, изменение списка в теле функции приводит к изменению этого списка в вызывающем коде. Это означает, что список передается по принципу указателя языка C.

3.2. Передача словаря в функцию

Демонстрируется функция ChangeDict() которая получает словарь в качестве параметра. В теле функции изменяются отдельные элементы словаря, лежащие на позициях с номерами 0 и 2.

Результат работы программы

4. Способы избежания изменения объектов-аргументов в вызывающем коде

В случаях, когда нужно запретить изменение объекта списка внутри функции, можно использовать способы которые описаны ниже.

Способ 1. При передаче списка в функцию можно конвертировать этот список в кортеж с помощью операции tuple() . После этого изменить список в теле функции не удастся.

Нижеследующий код демонстрирует использование операции tuple() для конвертирования списка в кортеж.

Список LL передается в функцию PassList() как кортеж

После этого, изменить элемент списка LL в функции PassList() не удастся. Если запустить программу, то будет сгенерировано исключение с сообщением

Способ 2. При передаче списка в функцию можно использовать операцию среза [:] , как показано в следующей программе

В вышеприведенном коде при вызове функции с помощью строки

срез LL[:] осуществляет копию списка. Таким образом, изменения списка внутри функции не приведут к изменению списка в вызывающем коде, поскольку эти изменения будут выполняться над копией.

После запуска на выполнение, программа выдаст такой результат

5. Особенности передачи аргументов в функцию. Итоги

Для аргументов, которые передаются в функцию, можно выделить следующие особенности:

1. Если из внешнего кода вызывается функция с передачей ей аргумента, то в теле функции этот аргумент (объект) автоматически присваивается соответствующей локальной переменной функции.

Например. Демонстрируется автоматическое присвоение локальной переменной функции значения аргумента.

2. Аргументы функции – это ссылки на объекты. При передаче аргумента в функцию передается ссылка на объект. Передаваемые ссылки реализованы как указатели в языке C. Поскольку, при передаче в функцию аргумента, копируется ссылка на объект, то сам объект никогда не копируется. Иными словами, не создается автоматическая копия объекта при передаче его в функцию, осуществляется только копия ссылки.

3. Если в теле функции присвоить значение имени переданного параметра, то это не повлияет на значение внешнего аргумента в вызывающем коде. Это связано с тем, что имена аргументов в вызывающем коде становятся новыми именами в области видимости функции.

Например. В примере, в функции Func() изменяется значение параметра D на 25. В вызывающем коде был передан аргумент с таким самым именем D со значением 30. Однако, после вызова функции из вызывающего кода, значение внешнего аргумента D не изменилось, что и надо было доказать.

4. Если в функцию передается аргумент (объект), который есть изменяемым (список, словарь), то изменение этого аргумента внутри функции приведет к изменению аргумента в вызывающем коде. Это касается только изменения составных элементов объекта (отдельный элемент словаря или списка). Если попробовать изменить объект по его общему имени (с помощью операции присваивания = ), то изменений в вызывающем коде не будет (передается ссылка на объект, а именно ссылку изменить нельзя).

Например. В нижеследующем примере объявляются две функции, которые делают попытку изменить входной параметр-список по его имени:

Больше об именованных аргументах — Python: Функции

В этом уроке мы разберем, как получать произвольное количество именованных аргументов, как передавать их в виде коллекции и как объявлять keyword-only аргументы.

Получение именованных аргументов в виде словаря

Позиционные аргументы можно получать в виде *args , причем в произвольном количестве. Для именованных аргументов тоже существует подобная возможность. Только они получаются в виде словаря, что позволяет сохранить имена аргументов в ключах:

По соглашению аргумент, который получает подобный словарь, принято называть kwargs — от словосочетания keyword arguments.

Порядок вызовов смешанных аргументов

Поэкспериментируем с разными комбинациями аргументов, которые можно передавать функциям:

Заметим, что *args всегда указывается перед **kwargs , иначе будет ошибка:

Также при объявлении функций можно комбинировать позиционные аргументы, значения по умолчанию, *args и **kwagrs одновременно. При использовании обычных позиционных аргументов их следует добавлять в начало перед аргументом *args :

Аргументы со значением по умолчанию следует добавлять после аргумента *args , но перед аргументом **kwagrs :

Аргумент *args в определении функции пишется после всех обычных позиционных аргументов, но перед первым аргументом со значением по умолчанию. А **kwargs пишется в самом конце после последнего аргумента со значением по умолчанию.

Согласно этому правилу у нас идет следующий порядок расстановки аргументов:

  1. Обычные позиционные аргументы
  2. Аргумент *args
  3. Аргументы со значением по умолчанию
  4. Аргумент **kwagrs

В реальном коде редко какая функция использует все эти возможности одновременно. Но понимать, как работает каждая форма объявления аргументов, и как такие формы можно сочетать, — очень важно.

Передача именованных аргументов с помощью словаря

Как и в случае позиционных аргументов, именованные можно передавать в функцию пачкой в виде словаря. Для этого перед словарем нужно поставить две звездочки. Пример:

Здесь указан обычный именованный аргумент, а аргументы завернуты в словарь.

Попробуем вызвать функцию с двумя наборами аргументов: для позиционных и для именованных:

В этом примере мы не написали литерал, а вместо этого вызвали функцию dict с несколькими именованными аргументами. Так словарь еще больше похож на сохраненный набор аргументов.

При подстановке аргументов разворачивающиеся наборы аргументов вроде *positional и **named можно указывать вперемешку с аргументами соответствующего типа: *positional — с позиционными, **named — с именованными. При этом все именованные аргументы должны идти после всех позиционных.

Keyword-only аргументы

В Python 3 добавили возможность пометить именованные аргументы функции так, чтобы вызывать функцию можно было только через передачу этих аргументов по именам. Такие аргументы называются keyword-only и их нельзя передать в функцию в виде позиционных. Выглядит функция с подобными аргументами так:

Здесь * выступает разделителем — отделяет обычные аргументы от строго именованных. Такой разделитель можно использовать только один раз в одном определении. Еще его нельзя применять в функциях с *args . Но можно объявлять функции, у которых будут только строго именованные аргументы. Для этого нужно поставить звездочку в самом начале перечня аргументов.

Этот пример демонстрирует подход к описанию аргументов. Первый аргумент — имя файла, который будет открыт. Оно всегда присутствует и связано по смыслу с именем функции. Поэтому этот аргумент можно не именовать. А writable и binary — необязательные аргументы, которые получают значения True / False . Поэтому опции и объявлены так, что могут быть указаны только явно.

При использовании keyword-only аргументов вместе с именованными аргументами ( **kwargs ) возникает проблема. Именованные аргументы могут перехватить значения, которые должны были быть переданы ключевое слово-только аргументам. Это может привести к ошибкам в работе функции.

Рассмотрим следующий пример:

В данном примере аргумент a принимает значение 1 , а keyword-only аргумент b — значение 2 . При этом аргумент c передается в **kwargs , что может привести к ошибке, если c не должен был передаваться этой функции.

Поэтому рекомендуется использовать либо keyword-only аргументы, либо **kwargs , но не оба вместе. Это поможет избежать неожиданного поведения и ошибок в работе функции.

Порядок аргументов при вызове функций

При вызове функций у нас больше свободы, чтобы задать порядок аргументов. Одиночные именованные аргументы могут идти вперемешку с подстановками наборов позиционных. Вот пример такого вызова:

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

Читать:
Tr crypt xpack gen2 что за вирус

Похожие статьи