Не могу понять почему ошибка: 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 шт):
С помощью *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)