Предположим, что требуется удалить все нечетные числа из списка. Проблема со следующим кодом должна быть довольно очевидной:
odd = lambda x: bool(x % 2) # функция проверки числа на нечетностьnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]for i in range(10): if odd(numbers[i]): del numbers[i] # удаление элемента из списка во время итерации по нему# Output:Traceback (most recent call last): if odd(numbers[i]):IndexError: list index out of rangeУдаление элемента из списка во время его итерации – это проблема, которая хорошо известна любому опытному разработчику.
К счастью, Python включает в себя ряд элегантных парадигм программирования, которые при правильном использовании могут привести к значительному упрощению и оптимизации кода. Одна из таких парадигм – list comprehensions. Генераторы списков часто используют именно для решения подобных проблем, что и показывает реализация кода ниже:
odd = lambda x: bool(x % 2) # функция проверки числа на нечетностьnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]numbers = [n for n in numbers if not odd(n)] # генератор нового спискаprint(numbers)# Output:[2, 4, 6, 8, 10]