itertools.groupby()源代码中的循环停止会导致什么情况

时间:2019-06-01 13:56:52

标签: python itertools

我在这里看到了这段代码:https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby

class groupby:
    # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
    def __init__(self, iterable, key=None):
        if key is None:
            key = lambda x: x
        self.keyfunc = key
        self.it = iter(iterable)
        self.tgtkey = self.currkey = self.currvalue = object()
    def __iter__(self):
        return self
    def __next__(self):
        self.id = object()
        while self.currkey == self.tgtkey:
            self.currvalue = next(self.it)    # Exit on StopIteration
            self.currkey = self.keyfunc(self.currvalue)
        self.tgtkey = self.currkey
        return (self.currkey, self._grouper(self.tgtkey, self.id))
    def _grouper(self, tgtkey, id):
        while self.id is id and self.currkey == tgtkey:
            yield self.currvalue
            try:
                self.currvalue = next(self.it)
            except StopIteration:
                return
            self.currkey = self.keyfunc(self.currvalue)

while self.id is id and self.currkey == tgtkey:的情况下,我想知道哪种情况会导致self.id is id变成False

1 个答案:

答案 0 :(得分:0)

条件while self.id is id and self.currkey == tgtkey:的大致含义是:“当用户没有再次致电next时,我们就在同一组中:”。 self.id__next__设置的属性。本地引用id_grouperself.id被调用时的引用。由于每次对next的调用都会产生一个新的object,因此检查等同于询问自__next__开始以来是否已调用grouper

请记住,groupby对象不必对存储的序列进行操作。输入可以是惰性生成器。请注意,函数始终会预先读取以确保下一项在当前组中,并且只有在当前项才产生。 __next__的第一部分将消耗迭代器的剩余部分,直到下一组开始为止,以完全履行合同的这一部分,以防您在消耗当前一组之前请求下一组。