Достаточно универсальным и при этом удобным оператором в Python является оператор * . Давайте рассмотрим его, но для начала вспомним о множественном присваивании в Python.

Оператор звездочка в Python

Достаточно универсальным и при этом удобным оператором в Python является оператор *. Давайте рассмотрим его, но для начала вспомним о множественном присваивании в Python.

Код ниже распределяет значения по переменным в соответствии с их порядком.

a, b, c = 1, 2, 3
print(a,b,c)

То же самое будет и со значением в виде списка.

a, b, c = ["hi", 2, False]
print(a,b,c)

Но если мы добавим четвертый параметр в список, то получим ошибку, то же самое и с меньшим количеством параметров.

a, b, c = ["hi", 2, False, True] #слишком много значений для распаковки. 
a, b, c = ["hi", 2] #слишком мало значений. 

Вот здесь-то нам и пригодится вышеупомянутый оператор *. Просто поставим его перед одной из наших переменных:

a, b, *c = ["hi", 2, False, True, 10, 11]

При этом присваивание произведется по порядку, начиная с первого, а вывод будет следующим:

hi, 2, [True, 10, 11]

В примере выше Python оператор звездочка * - просто упаковал все оставшиеся значения в список, благодаря чему и состоялось присваивание. При другом способе присваивание будет происходить с конца, и оставшиеся значения войдут в список

*a, b, c = ["hi", 2, False, True, 10, 11]

# вывод:
["hi", 2, False, True,], 10, 11

Подобные операции присваивания справедливы для любых объектов последовательностей, в том числе для строк

*a, b, с = "Hello World"
print(a,b,с)

#Также возможно присваивание переменным меньшего количества значений:
*a, b, с = 1, 2

#вывод:
[], 1, 2   # т.е. переменной *a ,был присвоен пустой список.

Минимальное количество значений здесь равно 2, т.е. присваивание одного единственного значения в данном случае вызовет ошибку.

*a, b, с = 1 # недостаточно значений

Еще один пример, но уже с функцией:

def f(a, b, с, d):
    print(a, b, с, d)

f(1, 2, 3, 4)

Но если попытаться передать в функцию список:

a = ["hello", True, 70, [4,6,8]]

f(a) # то выйдет ошибка т.к. требуется передать четыре параметра:


# решение следующее

f(*a) # здесь наш оператор распаковывает массив и передает его элементы по порядку в функцию.

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

def f (*args):
     print(args)

f(1,4,7)

f() # можно вызвать функции без передачи аргументов


#обход элементов кортежа по значению 
def f (*args):
      print(i)


# нахождение суммы чисел в кортеже:
def f (*args):
     s = 0
     for i in args:
         s+=i 
     return s 

print(f(1,2,34,67,7))

Т.о. сегодня мы свами узнали, как с помощью всего одного оператора упростить написание кода.