В этом уроке я сосредоточусь на аргументах ( *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»johndoe@gmail.com»,
«password»:»1234″}
new_user = User(**kwargs)
new_user.save()
|
Вот как выполнить запрос клиента, которого мы только что создали, используя kwargs.
|
1
2
3
4
5
6
|
filter_customer = {
’email’:johndoe@gmail.com,
‘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 предлагает много информации для дальнейшего изучения. Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для изучения на рынке , и не стесняйтесь задавать любые вопросы и предоставлять ценные отзывы, используя канал ниже.