Возможно ли использовать возвращемое функцией значение в генераторе списка?
Возможно ли использовать возвращаемое функцией значение на следующей итерации генератора списка?
Например, нечто подобное (понимаю, что пример нерабочй):
result = [accum = func(accum, i) for i in mas]
Ответы (2 шт):
В Python 3.8 добавили "Assignment Expressions". Более подробно в PEP-572.
Пример:
items = list(range(1, 10))
[ii-1 for x in items if (ii:=x+1) % 3 == 0]
# NOTE: -------------> ^^^^^^^^^
вывод:
>>> [2, 5, 8]
UPDATE: этот ответ показывает как использовать возвращенное значение на одной итерации генератора. Я не уверен, что "Assignment Expressions" видны на следующей итерации генератора.
Для такой задачи лучше использовать не генератор (он не предназначен для работы с изменяемым состоянием), а свертку с накоплением промежуточных значений.
import itertools
def func(x, y):
return x * y
mas = [2, 3, 4, 5]
result_list = list(itertools.accumulate(mas, func)) # [2, 6, 24, 120]
или простую свертку
import functools
result_int = functools.reduce(func, mas) # 120
В обоих случях (для accumulate - начиная с python 3.8) можно указать начальное значение аккумулятора
result_list = list(itertools.accumulate(mas, func, initial=10)) # [10, 20, 60, 240, 1200]
result_int = functools.reduce(func, mas, 10) # 1200