Тот факт, что первый может вернуть объект, а затем неявно изменить его после того, как он был возвращен, является ОГРОМНЫМ запахом кода для меня, независимо от того, какой язык вы используете (т.е. это не проблема того, чтобы быть "пифоническим"). «). Кроме того, зачем вам нужна функция, которая выдает итератор для одного и того же значения снова и снова, изменяя между выходами? Мне кажется, очень не интуитивно.
Если вы используете значения, тогда кортежи, созданные myGenerator2
, не являются мусором. Если вы используете их по одному, все они никогда не будут существовать в одно и то же время, и ваша программа почти наверняка будет выполнять много других операций выделения / освобождения памяти. В отличие от списка, возвращаемого range(howMany)
, который создаст 1000 целых чисел, которые вы фактически никогда не используете (если только вы не на Python3, в этом случае range
возвращает генератор, а не список).
Если есть какая-либо вероятность того, что вызывающая сторона может захотеть удержаться за ссылкой на что-то, возвращаемое вашим генератором (и программисты Python обычно ожидают, что, когда дан генератор, он сможет пойти items = list(generator)
если им нужно использовать их более одного раза), то второе намного лучше.