Не могу понять почему ошибка: unsupported operand type(s) for %: 'tuple' and 'int'

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

def sum_num_even(*numbers):
  sum=0
  for i in numbers:
    if i%2 == 0:
      sum += i
  return sum

И вроде бы все работает если в функцию записываю числа через запятую:

sum_num_even( 1,5,6,4,3,8,9,5,6,6,6,4,3,2,1,9,9,7)
  # На выходе получается: 42

Однако если создаю переменную с типом tuple or list, и вставляю ее в качестве входных данных функции, то получаю ошибку: TypeError: unsupported operand type(s) for %: 'tuple' and 'int'

numbers = 1,5,6,4,3,8,9,5,6,6,6,4,3,2,1,9,9,7
sum_num_even(numbers)

Почему так происходит? Ведь по факту, если я запулливаю числа в функцию без использования переменной, то это тот же tuple.

def sum_num_even(*numbers):
  print(type(numbers))
  sum=0
  for i in numbers:
    if i%2 == 0:
      sum+=i
  return sum
sum_num_even( 1,5,6,4,3,8,9,5,6,6,6,4,3,2,1,9,9,7)
  # На выходе получается: <class tuple> и  42


Ответы (1 шт):

Автор решения: yaroslavsokolov

С помощью *numbers мы берем значения итерируемого объекта или их присваимваем. В случае

def sum_num_even(*numbers):
    ...
numbers = 1,5,6,4,3,8,9,5,6,6,6,4,3,2,1,9,9,7
sum_num_even(numbers)

Вы распаковываете все аргументы в кортеж. Получается, что вы передали в функцию не числа, а итерируемый объект, который не получится проверить на четность.

Решение

Брать в качестве аргумента кортеж

`def sum_num_even(numbers): # просто берем кортеж`

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

def sum_num_even(*numbers):
    ...
numbers = 1,5,6,4,3,8,9,5,6,6,6,4,3,2,1,9,9,7
sum_num_even(*numbers) # *numbers - мы распаковали кортеж, теперь это равносильно простой передаче аргументов sum_num_even(1,5,6,4,3,8,9,5,6,6,6,4,3,2,1,9,9,7)
→ Ссылка