Конечно, разница между следующими двумя:
[f(x) for x in list]
и это:
(f(x) for x in list)
заключается в том, что первый сгенерирует список в памяти, а второй - новый генератор с отложенной оценкой.
Итак, вместо этого просто напишите «нефильтрованный» список как генератор. Вот ваш код с встроенным генератором:
def myFunction(x):
print("called for: " + str(x))
return x * x
originalList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
limit = 10
result = [C2 for C2 in ((myFunction(C), C) for C in originalList) if C2[0] < limit]
# result = [C2 for C2 in [(myFunction(C), C) for C in originalList] if C2[0] < limit]
Обратите внимание, что вы не увидите отличий в распечатке от двух, но если посмотреть на использование памяти, второе закомментированное утверждение будет использовать больше памяти.
Чтобы внести простые изменения в свой код в своем вопросе, перепишите нефильтрованное, как это:
unfiltered = [ (myFunction(C),C) for C in originalList ]
^ ^
+---------- change these to (..) ---------+
|
v
unfiltered = ( (myFunction(C),C) for C in originalList )