DevGang
Авторизоваться

*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 и их использование в функциях с примерами.

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

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу