Как написать функцию, которая ничего не возвращает, только измененяет переданный список?
Задача следующая:
Напишите функцию modify_list(l), которая принимает на вход список целых чисел, удаляет из него все нечётные значения, а чётные нацело делит на два. Функция не должна ничего возвращать, требуется только изменение переданного списка, например:
lst = [1, 2, 3, 4, 5, 6]
print(modify_list(lst)) # None
print(lst) # [1, 2, 3]
modify_list(lst)
print(lst) # [1]
lst = [10, 5, 8, 3]
modify_list(lst)
print(lst) # [5, 4]
Функция не должна осуществлять ввод/вывод информации." Я решил попробовать решить вот так:
def modify_list(l):
for i in l:
if i % 2 == 0:
return int(i / 2)
else:
del i
l = [10, 5, 8, 3]
modify_list(l)
print(l)
Если использовать print внутри самой функции (после первого условия print(int(i / 2)) ответ выдается корректный, но если использовать в конце, то выдается просто лист l без изменений.
В чем проблема моего решения?
Ответы (2 шт):
Объясните пожалуйста, в чем проблема моего решения
По условиям задачи:
Функция не должна ничего возвращать, требуется только изменение переданного списка
А вы используете оператор return, который возвращает значение из функции и завершает ее выполнение на первом встретившемся четном числе.
попробуйте так:
def modify_list(l):
for i in reversed(range(len(l))):
if l[i] % 2 == 0:
l[i] //= 2
else:
del l[i]
PS итерирование по списку выполняем в обратном порядке, чтобы избежать ошибки IndexError: list index out of range, которая практически запрограммирована при удалении элементов из списка во время итерирования по нему.
тесты:
In [20]: l = [1, 12, 5, 6, 100]
In [21]: modify_list(l)
In [22]: l
Out[22]: [6, 3, 50]
Можно так:
def modify_list(l):
l[:] = [x // 2 for x in filter(lambda x: x & 1, l)]
l = [10, 5, 8, 3]
print(l)
modify_list(l)
print(l) # [2, 1]