October 24, 2022

*args & **kwargs

*args применяется, когда необходимо передать в функцию неизвестное кол-во инструментов, которые будут переданы через tuple

def ten_percent_of_product_with_args(*args):
    product = 1
    for number in args:
        product = product * number
    return product * 0.1
print(ten_percent_of_product_with_args(10, 20, 2, 1, 4, 345))

В случае использования позиционного аргумента, он ставится всегда на первое место:

def percent_of_product_with_args(percent, *args):
    product = 1
    for number in args:
        product = product * number
    return product / 100 * percent
    
print(percent_of_product_with_args(20, 10, 20, 2, 1, 4, 345))

В данном случае 20 из кортежа (20, 10, 20, 2, 1, 4, 345) относится к аргументу percent.

В кортеже могут содержаться как цифры так и строковые значения. См. ниже
def test(*args):
    return [i*3 for i in args]
    
print(test('sheep', 'cat', 'dog'))
# вывод: ['sheepsheepsheep', 'catcatcat', 'dogdogdog']

**kwargs

функция с **kwargs возвращает словарь.

def func_with_kwargs(**kwargs):
    print(kwargs)
func_with_kwargs(first=1, second=2, third=3)
# возвращает {'first': 1, 'second': 2, 'third': 3}
Еще примеры:
def hello_with_kwargs(**kwargs):
    if 'name' in kwargs:
        print('Hello! Nice to meet you, {}'.format(kwargs['name']))
    else:
        print('Hello! What is your name?')
        
hello_with_kwargs(gender='male', age=24, name='Jack')

здесь передали аргументами пары значений, которые в функции превратились в словарь. Ниже простой пример, который показывает суть:

def func_with_kwargs(**kwargs):
    print(kwargs)

func_with_kwargs(first=1, second=2, third=3)

# вывод: {'first': 1, 'second': 2, 'third': 3}

Также можно использовать вместе *args и **kwargs:
def func_with_args_and_kwargs(*args, **kwargs):
    print('I would like {} {}'.format(args[0], kwargs['food']))
func_with_args_and_kwargs('one','two',drink='coffee', food='sandwich')

# вывод I would like one sandwich