你可以使用itertools模块让它完全懒惰,像这样
>>> from itertools import repeat, chain, islice
>>> def trimmer(seq, size, filler=0):
... return islice(chain(seq, repeat(filler)), size)
...
>>> list(trimmer([1, 2, 3], 4))
[1, 2, 3, 0]
>>> list(trimmer([1, 2, 3, 4, 5], 4))
[1, 2, 3, 4]
在这里,我们将实际序列与具有filler 值的无限中继器链接起来。然后我们将链式迭代器切片为size。
因此,如果序列的元素数量少于size,chain 将开始使用repeat。如果序列至少有size 元素,那么chain 甚至不必使用repeat。
这种方法的主要优点是,除非请求,否则不会在内存中创建完整的修剪或填充列表。所以,如果你要做的只是迭代它,那么你可以像这样简单地迭代它
>>> for item in trimmer([1, 2, 3, 4, 5], 4):
... print(item * 2)
...
...
2
4
6
8
或者,如果您想将它与另一个修剪或填充的列表一起使用,那么您仍然可以在不创建实际列表的情况下这样做,就像这样
>>> for item in chain(trimmer([1, 2, 3], 4), trimmer([1, 2, 3, 4, 5], 4)):
... print(item, item * 2)
...
...
1 2
2 4
3 6
0 0
1 2
2 4
3 6
4 8
懒惰摇滚 ;-)