HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>* и **-операторы в<strong>вызовах</strong>функций<strong>синтаксически</strong>идентичны им в определениях, но выполняют<strong>обратное</strong>действие. Посмотрим на примере функции sum():</p>
1 <p>* и **-операторы в<strong>вызовах</strong>функций<strong>синтаксически</strong>идентичны им в определениях, но выполняют<strong>обратное</strong>действие. Посмотрим на примере функции sum():</p>
2 <p>Вызовем sum(), применив *-оператор к списку аргументов:</p>
2 <p>Вызовем sum(), применив *-оператор к списку аргументов:</p>
3 <p>Здесь, знакомый нам *-оператор, уже<strong>распаковывает</strong>список на аргументы. Количество полученных аргументов равно количеству элементов массива. По сути, код выше преобразуется в вызов:</p>
3 <p>Здесь, знакомый нам *-оператор, уже<strong>распаковывает</strong>список на аргументы. Количество полученных аргументов равно количеству элементов массива. По сути, код выше преобразуется в вызов:</p>
4 <p>Как и в случае с определением функций, *-оператор может использоваться совместно с позиционными аргументами:</p>
4 <p>Как и в случае с определением функций, *-оператор может использоваться совместно с позиционными аргументами:</p>
5 <p>В отличие от оператора упаковки в определении функций, оператор распаковки не обязательно должен быть последним, он может располагаться в любой позиции:</p>
5 <p>В отличие от оператора упаковки в определении функций, оператор распаковки не обязательно должен быть последним, он может располагаться в любой позиции:</p>
6 <p>Более того, может быть любое количество операторов распаковки и в любом порядке:</p>
6 <p>Более того, может быть любое количество операторов распаковки и в любом порядке:</p>
7 <h3>Распаковка именованных аргументов</h3>
7 <h3>Распаковка именованных аргументов</h3>
8 <p>По аналогии с оператором распаковки позиционных аргументов работает и оператор распаковки именованных - **-оператор.</p>
8 <p>По аналогии с оператором распаковки позиционных аргументов работает и оператор распаковки именованных - **-оператор.</p>
9 <p>Важно, что в примере выше, если мы забудем распаковать словарь, то получим ошибку. Ведь функция принимает не словарь, а любое количество именованных аргументов. Уже в вызове функции (func(**d)) **-оператор<strong>распаковывает</strong>переданный словарь в именованные аргументы вида a=42, b='python'. Затем оператор<strong>упаковки</strong>в определении функции (func(**kwargs)), собирает их в словарь kwargs, который мы и обрабатываем в функции.</p>
9 <p>Важно, что в примере выше, если мы забудем распаковать словарь, то получим ошибку. Ведь функция принимает не словарь, а любое количество именованных аргументов. Уже в вызове функции (func(**d)) **-оператор<strong>распаковывает</strong>переданный словарь в именованные аргументы вида a=42, b='python'. Затем оператор<strong>упаковки</strong>в определении функции (func(**kwargs)), собирает их в словарь kwargs, который мы и обрабатываем в функции.</p>
10 <p>Оператор ** упаковки-распаковки удобно использовать в функциях, принимающих неограниченное количество опций, например, функциях конфигурации:</p>
10 <p>Оператор ** упаковки-распаковки удобно использовать в функциях, принимающих неограниченное количество опций, например, функциях конфигурации:</p>
11 <h2>Итог</h2>
11 <h2>Итог</h2>
12 <p>Оба оператора упаковки и распаковки обозначаются символами * и **. Чтобы их не путать при работе с функциями, нужно следовать следующим принципам:</p>
12 <p>Оба оператора упаковки и распаковки обозначаются символами * и **. Чтобы их не путать при работе с функциями, нужно следовать следующим принципам:</p>
13 <ul><li>оператор упаковки используется при создании функций. Он позволяет собрать, упаковывать, остаточные аргументы функции</li>
13 <ul><li>оператор упаковки используется при создании функций. Он позволяет собрать, упаковывать, остаточные аргументы функции</li>
14 <li>оператор распаковки используется при вызове функций. Он извлекает элементы из коллекции и заполняет ими параметры функции при вызове</li>
14 <li>оператор распаковки используется при вызове функций. Он извлекает элементы из коллекции и заполняет ими параметры функции при вызове</li>
15 </ul><p>Сочетая эти операторы мы можем создавать функции работающие с любым числом аргументов.</p>
15 </ul><p>Сочетая эти операторы мы можем создавать функции работающие с любым числом аргументов.</p>