В этом уроке я сосредоточусь на аргументах ( *args
) и ключевых аргументах ( *kwargs
) в Python.
Я научу вас, что такое args и kwargs и, что наиболее важно, как их использовать — то есть, как принимать неограниченное количество аргументов и аргументов ключевых слов в функциях.
Какие арги?
*args
используются для передачи аргументов без ключевых слов . Примеры без ключевых слов аргументы fun(3,4), fun("foo","bar")
.
*args
обычно используются в качестве меры для предотвращения сбоя программы, если мы не знаем, сколько аргументов будет передано функции. Это используется в C ++, а также в других языках программирования.
Что такое Kwargs?
**kwargs
— это словарь ключевых слов. **
позволяет нам передавать любое количество аргументов ключевого слова. Ключевой аргумент — это в основном словарь.
Пример ключевого слова аргумент fun(foo=2,bar=7)
.
**kwargs
просто как *args
за исключением того, что вы объявляете переменные и количество внутри функции аргументы.
Где использовать Args и Kwargs
Аргументы и kwargs полезны, когда вы хотите:
- Уменьшите переписывание кода.
- Сделайте ваш код читабельным.
- Повторно используйте ваш код
Использование Args и Kwargs в функциях
Давайте посмотрим, как kwargs и args используются в функциях.
Args
Функция ниже принимает три аргумента. Три аргумента были определены явно, поэтому любой более или менее вызовет ошибку в программе.
1
2
3
4
|
def add(a, b,c):
print(a+b+c)
print add(2,3,4)
|
Давайте запустим функцию. Функция добавит три числа, давая следующий вывод:
1
2
3
|
Output
9
|
Что если мы передадим в функцию четыре аргумента вместо требуемых трех? Мы получим ошибку, как показано ниже.
Это потому, что только три параметра были определены в функции, но мы передали четыре позиционных аргумента при вызове функции.
1
2
3
4
|
def add(a, b,c):
print(a+b+c)
print add(2,3,4,5)
|
1
2
3
|
Output
TypeError: add() takes 3 positional arguments but 4 were given
|
Во втором примере ниже, *
для аргументов без ключевых слов и передается в функцию. Вместо определения аргументов мы заменяем a
, b
и c
одним параметром ( *args
).
Обратите внимание, что использование *args
позволяет легко использовать любое количество аргументов без необходимости изменения кода. *args
обеспечивают большую гибкость вашего кода, поскольку в будущем вы можете иметь столько аргументов, сколько пожелаете.
1
2
3
4
5
6
|
def add(*args):
total = 0
for arg in args:
total+=arg
print total
|
1
2
3
4
5
|
Scenario 1
print add(1,2,5)
Output
8
|
1
2
3
4
5
|
Scenario 2
print add(1,2,5,6)
output
14
|
1
2
3
4
5
|
Scenario 3
print add(1,2,5,8)
Output
16
|
Больше примеров
Создайте простую функцию, как показано:
1
2
3
4
5
|
def func(*args):
# *args means for however many arguments you take in, it will catch them all
for arg in args:
print arg
|
Протестируйте функцию, используя комбинацию целых чисел и строк:
1
2
3
4
5
6
7
|
def func(*args):
# *args means for however many arguments you take in, it will catch them all
for arg in args:
print arg
print func(11,3,4,5,»tuts»)
|
1
2
3
4
5
6
7
|
Output
11
3
4
5
tuts
|
Что если мы передадим список в качестве аргумента? Протестируйте функцию со списком, заменив предыдущие аргументы списком, l = [11,3,4,5,"tuts]
.
01
02
03
04
05
06
07
08
09
10
|
def func(*args):
# *args means for however many arguments you take in, it will catch them all
for arg in args:
print arg
l = [11,3,4,5,»tuts»]
print func(l)
|
1
2
3
4
5
6
|
This prints the list as a whole,
This is because its interpreting the list as one item.
Output
[11,3,4,5,»tuts]
|
В приведенном выше примере вы также можете использовать *args
для распаковки аргументов, которые уже находятся в списке или кортеже, чтобы все элементы в списке передавались как разные параметры.
Используя ту же функцию:
1
2
3
4
5
6
7
8
9
|
def func(*args):
# *args means for however many arguments you take in, it will catch them all
for arg in args:
print(arg)
l = [11,3,4,5,»tuts»]
print(func(*l))
|
1
2
3
4
5
6
7
8
9
|
The * will unpack the list and output each individual list item.
Output
11
3
4
5
tuts
|
Kwargs
Kwargs позволяют передавать аргументы ключевых слов в функцию. Они используются, когда вы не уверены в количестве ключевых аргументов, которые будут переданы в функцию.
Напишите функцию my_func
и передайте (x= 10, y =20)
качестве ключевого слова аргументы как показано ниже:
1
2
|
def my_func(x=10,y=20):
print x,y
|
1
2
3
4
5
|
This prints out the values of x and y
Output
10,20
|
Kwargs можно использовать для распаковки словарных ключей, пар значений. Это делается с использованием двойной звездочки ( **
). Важно отметить, что каждый ключ должен соответствовать значению.
Вот типичный пример того, как это делается. Функция ниже принимает страны в качестве ключей и их столицы в качестве значений. Затем он выводит инструкцию, которая перебирает kwargs и отображает каждое ключевое слово на присвоенное ему значение.
1
2
3
4
5
6
7
|
def capital_cities(**kwargs):
# initialize an empty list to store the result
result = []
for key, value in kwargs.items():
result.append(«The capital city of {} is {} .format (key,value)
return result
|
Вы можете вызывать функцию с любыми аргументами, которые вы хотите.
1
2
3
4
5
6
7
8
|
def capital_cities(**kwargs):
# initialize an empty list to store the result
result = []
for key, value in kwargs.items():
result.append(«The capital city of {} is {} .format (key,value)
return result
print capital_city(China = «Beijing»,Cairo = «Egypt»,Rome = «Italy»))
|
1
2
3
|
output
[‘The capital city of China is Beijing’, ‘The capital city of Cairo is Egypt’,’The capital city of Rome is Italy’]
|
Для более сложного примера, предположим, у нас есть модель для клиента, которая выглядит примерно так:
1
2
3
4
5
6
|
class Customer( models.Model ):
first_name = models.CharField(max_length = 100, null = True)
last_name = models.CharField(max_length = 100)
username =models.Charfield(max_length =100)
email = models.EmailField(max_length = 100)
password = models.CharField(max_length =100)
|
Вы можете использовать kwargs как для ввода данных, так и для запросов данных от объектов модели. Давайте напишем функциональное представление, чтобы создать нового клиента.
1
2
3
4
5
6
|
kwargs = {«first_name»:»John»,»last_name»:»Doe»,
«username’: «johndoe»,»email»[email protected]»,
«password»:»1234″}
new_user = User(**kwargs)
new_user.save()
|
Вот как выполнить запрос клиента, которого мы только что создали, используя kwargs.
1
2
3
4
5
6
|
filter_customer = {
’email’:[email protected],
‘username’: johndoe,
}
Customer.objects.filter(**filter_customer)
|
Использование аргументов и аргументов в функции
При использовании аргументов args и kwargs в одном и том же определении функции, *args
должен встречаться до **kwargs
.
1
2
3
4
5
6
7
8
|
class MyFunction(Foo):
def __init__(self, *args, **kwargs):
print ‘my function’
super(MyFunction, self).__init__(*args, **kwargs)
|
Пример:
1
2
3
4
5
6
|
def Func(*args,**kwargs):
for arg in args:
print arg
for item in kwargs.items():
print item
|
Помните, что args
должны предшествовать kwargs
.
1
2
3
4
5
6
7
8
|
def Func(*args,**kwargs):
for arg in args:
print arg
for item in kwargs.items():
print item
print Func(1,x=7,u=8)
|
1
2
3
4
5
|
Output
1
(‘x’, 7)
(‘u’, 8)
|
Вывод
Я надеюсь, что этот урок помог вам понять арги и кварги.
Ниже приведены некоторые советы, которые следует помнить при использовании args и kwargs:
-
*args
и**kwargs
— это специальный синтаксис, который используется в функциях для передачи переменной числа аргументов функции. -
*args
встречаются перед**kwargs
в определении функции. -
*args
и**kwargs
лучше всего использовать в ситуациях, когда количество входов останется относительно небольшим. - Вы можете использовать любое имя, какое захотите;
args
иkwargs
только по соглашению и не являются обязательными. Например, вы можете использовать*foo
вместо*args
или**foo
вместо**kwargs
.
Официальная документация Python предлагает много информации для дальнейшего изучения. Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для изучения на рынке , и не стесняйтесь задавать любые вопросы и предоставлять ценные отзывы, используя канал ниже.