python 中迭代器的最后编号

Last number of iterator in python

请问如何编辑同时给出序列中最后一个数字的迭代器?我的意思是一般来说,不是为了这么简单的序列。使用 < 而不是 == 不是一个选项。

class P():
    def __init__(self, n0):
        self.n = n0

    def __iter__(self):
        return self
    
    def __next__(self):
        if self.n == 1:
            raise StopIteration
        num = self.n
        self.n = self.n // 2 if self.n % 2 == 0 else 3 * self.n + 1
        return num

nmax = 1000
PP = P(nmax)

PPP = []

for j in PP:
    PPP.append(j) 

print(PPP)

当前输出:

[10, 5, 16, 8, 4, 2]

期望的输出:

[10, 5, 16, 8, 4, 2, 1]

在您的 class 中使用局部变量来确定您获得下一个的次数:

class P():
    i = 0
    def __init__(self, n0):
        self.i=n0-1
        self.n = n0

    def __iter__(self):
        return self
    
    def __next__(self):
        self.i=self.i-1
        if self.i == 1:
            raise StopIteration
        num = self.n
        self.n = self.n // 2 if self.n % 2 == 0 else 3 * self.n + 1
        return num

nmax = 10
PP = P(nmax)

PPP = []

for j in PP:
    PPP.append(j) 

print(PPP)

注意:通常写 if self.i <= 1: 然后 if self.i == 1: 更安全。在将来的某些更改中,您可能会更改 i 的值,并开始将其递减 2,然后 == 变体将失败。

编辑:当你想在前一个值等于1时停止,你可以这样做:

class P():
    previous_value = 0
    def __init__(self, n0):
        self.i=n0-1
        self.n = n0

    def __iter__(self):
        return self
    
    def __next__(self):
        if self.previous_value == 1:
            raise StopIteration
        num = self.n
        self.n = self.n // 2 if self.n % 2 == 0 else 3 * self.n + 1
        self.previous_value = num
        return num

nmax = 20
PP = P(nmax)

PPP = []

for j in PP:
    PPP.append(j) 

print(PPP)