*args и **kwargs в Python
В программировании на Python мы часто работаем с функциями, которые создаем, чтобы сделать код более пригодным для повторного использования и более понятным.
Если нам нужно выполнить аналогичную операцию несколько раз, вместо копирования и вставки одного и того же кода мы создаем функцию, которую мы вызываем несколько раз с новыми аргументами для выполнения этой операции.
*args и **kwargs позволяют нам передавать в функцию переменное количество аргументов, тем самым расширяя возможности повторного использования созданных нами функций.
Обратите внимание, что использование *args и **kwargs в основном зависит от того, какие операции будут выполнять ваши функции и насколько они гибки, чтобы принимать больше аргументов в качестве входных данных.
*args в Python
Давайте начнем с понимания того, что такое *args
и как его можно использовать!
*args
используется для передачи переменного количества аргументов без ключевых слов с использованием следующего синтаксиса:
def my_func(*args):
#do something
Вы можете использовать *args
, если не уверены, сколько аргументов функция будет получать при каждом использовании.
Например, предположим, что у вас есть функция, которая складывает два числа и возвращает их сумму:
#Define a function
def add(x, y):
#Add two numbers
result = x+y
#Print the result
print(f'Result: {result}')
и если бы вы протестировали эту функцию с примерными значениями:
#Test with sample values
add(3, 5)
вы должны получить:
8
Пока функция add()
работает правильно, так как принимает только 2 аргумента и возвращает результат.
А что, если вы хотите сложить 3 числа вместе?
Вы можете попробовать использовать функцию add()
:
#Test with 3 values
add(3, 5, 9)
но вы получите TypeError:
TypeError: add() takes 2 positional arguments but 3 were given
Это происходит потому, что когда мы определяли функцию add()
, мы специально определили ее с двумя аргументами x и y, поэтому при передаче третьего аргумента она должна возвращать ошибку.
Но как сделать эту функцию более надежной, чтобы она принимала на вход больше аргументов?
Вот где *args
становится удобным!
Давайте перепишем функцию add()
, чтобы она принимала *args
в качестве аргумента:
#Define a function
def add(*args):
#Initialize result at 0
result = 0
#Iterate over args tuple
for arg in args:
result += arg
#Print the result
print(f'Result: {result}')
*args
позволит нам передать переменное количество аргументов, не являющихся ключевыми словами, в функцию add()
. Он будет передан как tuple, что означает, что мы можем перебирать его, используя цикл for
.
Теперь давайте проверим эту функцию с примерными значениями:
#Test with 3 arguments
add(3, 5, 9)
#Test with 5 arguments
add(3, 5, 9, 11, 15)
и вы должны получить:
Result: 17
Result: 43
Теперь мы сделали функцию add()
более пригодной для повторного использования, используя *args
, чтобы заставить ее работать с переменным числом аргументов, не являющихся ключевыми словами.
**kwargs в Python
Давайте начнем с понимания того, что такое *args
и как его можно использовать!
**kwargs
используется для передачи переменного количества аргументов с ключевыми словами, используя следующий синтаксис:
def my_func(**kwargs):
#do something
Вы можете использовать **kwargs
, если не уверены, сколько аргументов будет получать функция при каждом использовании.
Обратите внимание, что основное различие между *args
и **kwargs
заключается в том, что *args
допускает переменное количество аргументов без ключевых слов, тогда как **kwargs
допускает переменное количество аргументов с ключевыми словами.
Например, предположим, что у вас есть функция, которая принимает два аргумента ключевого слова и печатает их значения:
#Define function
def print_vals(name, age):
#Print first argument
print(f'name: {name}')
#Print second argument
print(f'age: {age}')
и если бы вы протестировали эту функцию с примерными значениями:
#Test with sample values
print_vals(name='Mike', age=20)
вы должны получить:
name: Mike
age: 20
Пока что функция print_vals()
работает правильно, так как принимает только 2 аргумента и печатает их.
А что, если вы хотите напечатать 3 значения?
Вы можете попробовать использовать функцию print_vals()
:
#Test with 3 values
print_vals(name='Mike', age=20, city='New York')
но вы получите TypeError:
TypeError: print_vals() got an unexpected keyword argument 'city'
Это происходит потому, что когда мы определяли функцию print_vals()
, мы специально определили ее с двумя аргументами ключевого слова name
и age
, поэтому при передаче третьего аргумента ключевого слова она должна возвращать ошибку.
Но как сделать эту функцию более надежной, чтобы она принимала на вход больше аргументов с ключевыми словами?
Вот где **kwargs
становится удобным!
Давайте перепишем функцию add()
, чтобы она принимала *args
в качестве аргумента:
#Define function
def print_vals(**kwargs):
#Iterate over kwargs dictionary
for key, value in kwargs.items():
#Print key-value pairs
print(f'{key}: {value}')
**kwargs
позволит нам передавать переменное количество аргументов ключевого слова в функцию print_vals()
. Он будет передан как словарь, что означает, что мы можем перебирать его с помощью цикла for
.
Теперь давайте проверим эту функцию с примерными значениями:
#Test with 3 keyword arguments
print_vals(name='Mike', age=20, city='New York')
#Test with 5 keyword arguments
print_vals(name='Mike', age=20, city='New York', height=6.0, weight=180)
и вы должны получить:
name: Mike
age: 20
city: New York
name: Mike
age: 20
city: New York
height: 6.0
weight: 180
Теперь мы сделали функцию print_vals()
более пригодной для повторного использования, используя **kwargs
, чтобы заставить ее работать с переменным количеством аргументов ключевого слова.
Выводы
В этой статье мы рассмотрели *args
и **kwargs
в Python и их использование в функциях с примерами.
Теперь, когда вы знаете основные функции, вы можете попрактиковаться, переписав часть существующего кода в разных проектах и попробовав решить более сложные варианты использования.