Комментарии к вашему вопросу уже ясно дают понять, что не так с вопросом.
Но чтобы ответить «почему использование генератора [..] лучше?», По крайней мере, в тех случаях, когда это может быть - поскольку ни одно решение не всегда является лучшим, независимым от контекста: генераторы
- могут передаваться и иметь состояние, циклы не могут и не имеют (не по умолчанию в любом случае; вы можете добавить его, но вы бы строили самогонные генераторы); генераторы
- могут быть скомпонованы и (если написано правильно для этого), при этом все равно использовать преимущества параллелизма, циклы могут делать это только в том случае, если известна полная функциональная композиция заранее - или вы пишете l oop в функции генератора, в этом случае вы все равно строите генератор.
И «почему использование [..] map superior?», по крайней мере, в случаи, когда это может быть - так как ни одно решение не всегда является лучшим, независимым от контекста:
map
- правильный выбор, когда у вас уже есть функция и итерация, и Вы просто должны написать генератор, который сделал то же самое;
то есть map(sqrt, xs)
против (sqrt(x) for x in xs)
map
имеет некоторую функциональность, которая берет на себя работу и запутывает то, что вы пытаетесь сделать, если у вас есть несколько итеративные входы, из которых выбираются входы для функции.
например, map(pair, [1, 2, 3, 4, 5], ['a', 'b', 'c'])
(где pair
принимает два аргумента)
И, в общем, решение, которое легче понять и поддерживать Как правило, это лучшее решение, даже если другое решение может работать немного лучше. Это увеличение производительности по сравнению с увеличением удобства обслуживания - это компромисс, который вы должны учитывать.