Статьи

Понимание Args и Kwargs в Python

В этом уроке я сосредоточусь на аргументах ( *args ) и ключевых аргументах ( *kwargs ) в Python.

Я научу вас, что такое args и kwargs и, что наиболее важно, как их использовать — то есть, как принимать неограниченное количество аргументов и аргументов ключевых слов в функциях.

*args используются для передачи аргументов без ключевых слов . Примеры без ключевых слов аргументы fun(3,4), fun("foo","bar") .

*args обычно используются в качестве меры для предотвращения сбоя программы, если мы не знаем, сколько аргументов будет передано функции. Это используется в C ++, а также в других языках программирования.

**kwargs — это словарь ключевых слов. ** позволяет нам передавать любое количество аргументов ключевого слова. Ключевой аргумент — это в основном словарь.

Пример ключевого слова аргумент fun(foo=2,bar=7) .

**kwargs просто как *args за исключением того, что вы объявляете переменные и количество внутри функции аргументы.

Аргументы и kwargs полезны, когда вы хотите:

  • Уменьшите переписывание кода.
  • Сделайте ваш код читабельным.
  • Повторно используйте ваш код

Давайте посмотрим, как kwargs и 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 позволяют передавать аргументы ключевых слов в функцию. Они используются, когда вы не уверены в количестве ключевых аргументов, которые будут переданы в функцию.

Напишите функцию 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 предлагает много информации для дальнейшего изучения. Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для изучения на рынке , и не стесняйтесь задавать любые вопросы и предоставлять ценные отзывы, используя канал ниже.