Функция itertools.repeat
ленива;он использует только память, необходимую для одного элемента.С другой стороны, идиомы (a,) * n
и [a] * n
создают n копий объекта в памяти.Для пяти элементов идиома умножения, вероятно, лучше, но вы можете заметить проблему с ресурсами, если вам придется что-то повторять, скажем, миллион раз.
Тем не менее, трудно представить себе много статических использует для itertools.repeat
.Однако тот факт, что itertools.repeat
является функцией , позволяет использовать ее во многих функциональных приложениях.Например, у вас может быть некоторая библиотечная функция func
, которая работает с повторяемым вводом.Иногда у вас могут быть заранее составленные списки различных предметов.В других случаях вы можете просто работать с единым списком.Если список большой, itertools.repeat
сэкономит вам память.
Наконец, repeat
делает возможной так называемую "алгебру итераторов", описанную в документации itertools
.Даже сам модуль itertools
использует функцию repeat
.Например, следующий код дан как эквивалентная реализация itertools.izip_longest
(хотя реальный код, вероятно, написан на C).Обратите внимание на использование repeat
семи строк снизу:
class ZipExhausted(Exception):
pass
def izip_longest(*args, **kwds):
# izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
fillvalue = kwds.get('fillvalue')
counter = [len(args) - 1]
def sentinel():
if not counter[0]:
raise ZipExhausted
counter[0] -= 1
yield fillvalue
fillers = repeat(fillvalue)
iterators = [chain(it, sentinel(), fillers) for it in args]
try:
while iterators:
yield tuple(map(next, iterators))
except ZipExhausted:
pass