. або як використовувати змінну кількість аргументів на Python
Щоб отримати відповідь на питання в заголовку, розділимо його на дві частини:- Що таке args і kwargs? (Найбільш нетерплячі можуть підглянути відповідь =))
- Що позначають зірочки?
Примітка: Якщо функції передається список, то його елементи повинні слідувати в строго обумовленому заздалегідь порядку, або, іншими словами, на своїх позиціях (інакше як ми дізнаємося, що собою представляє певний елемент списку?). Наприклад, якщо функція sign_up () чекає від нас список [name, age, gender]. то ми повинні строго дотримуватися цей порядок; ми не можемо викликати функцію sign_up (age, name, gender). Такі аргументи називаються неіменованого або позиційними. Якщо ж в якості аргументу функції передається словник, то порядок проходження може бути довільний, тому що елементи словника передаються з ключами, їх вже не переплутаєш. Такі аргументи називаються іменованих.
Продовжуючи приклад в примітці, позначимо наш список через змінну: А змінну передамо в функцію: При цьому, щоб функція сприйняла як аргумент не один об'єкт (а колекції також є об'єктами як і взагалі все в Python), а кілька, колекцію потрібно розпакувати. Якраз це і роблять зірочки. Записи такого типу (з однією або двома зірочками) в Python використовуються в двох випадках: при виклику (як ми зробили тільки що) і при визначенні функції.
* Args і ** kwargs при визначенні функції
Аргументи функції в Python, що позначаються * і ** при визначенні або виклику, називаються невизначену кількість позиційних або іменованих аргументів. Дуже дивно. Насправді це колекції - списки, кортежі або словники. Перші два передають позиційні аргументи, словники - іменовані аргументи. Щоб передати функції кілька аргументів у вигляді колекції, колекцію треба розпакувати. Це робиться однією або двома зірочками. Задамо функцію з одним формальним (позиційним) аргументом і невизначеною кількістю додаткових позиційних аргументів (тут, два). Функція з іменованими аргументами задається так:
Так що ж таке args і kwargs.
Тепер ви готові засвоїти всю правду про це :)
Імена args і kwargs по негласної угоди прийнято використовувати в документації Python. Насправді ніхто не забороняє брати будь-які інші валідниє імена змінних. Наприклад, для словників поряд c ** kwargs іноді використовують ** options.
Застосування * і ** при виконанні функції
Тепер подивимося як викликати функцію з позиційними аргументами (вже демонстрували вище). Тут вже менше сенсу в args і kwargs, буде краще вибрати більш інформативні імена (хоча в наступному прикладі ми не далеко в цьому просунулися =)): Аргументи можна передавати і так:
Наступний приклад показує виклик функції з іменованими аргументами:
Те ж саме з літералом:
висновок
Отже, якщо коротко підсумувати вищесказане, то зірочки в Python використовують в наступних випадках:
- При визначенні функції, якщо функція приймає невизначену кількість аргументів.
- При виконанні функції, коли їй потрібно передати кілька об'єктів у вигляді колекції. Зверніть увагу, не об'єкт колекції, а об'єкти, що містяться в колекції. Таким чином, позначення * args і ** kwargs розпаковують колекцію і передають її елементи в функцію.