如何避免从迭代器返回 None ?

问题描述 投票:0回答:2

我正在尝试编写一个迭代器,给出给定时间段内的闰年。它按预期返回值,但另外返回 None ,这是我不想返回的。这是我的代码。

class year:
    def __init__(self,start,end):
        self.start = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        value = self.start
        if self.start < self.end:
            if value%4 == 0 and (value%100 !=0 or value%400 == 0):
                self.start+=4
                return value
            else:
                self.start+=1
        else:
            raise StopIteration
y = year(2009,2115)
yiter = iter(y)
for i in y:
    print(i)

它给出以下输出。

====== RESTART: C:\Users\Admin\AI-and-ML-practice\py programs\leapYearWithIterator.py ======
None
None
None
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
2052
2056
2060
2064
2068
2072
2076
2080
2084
2088
2092
2096
None
None
None
None
2104
2108
2112
>>> 

预期产量

2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
2052
2056
2060
2064
2068
2072
2076
2080
2084
2088
2092
2096
2104
2108
2112
>>> 

尝试更改上面的代码并获得预期的输出。

python iterator generator
2个回答
0
投票

将下一个逻辑包装到 while True 循环中。

def __next__(self):
    while True:
        value = self.start
        if self.start < self.end:
            if value%4 == 0 and (value%100 !=0 or value%400 == 0):
                self.start+=4
                return value
            else:
                self.start+=1
        else:
            raise StopIteration

0
投票

我对你的代码做了一些修改,它正在工作。

class Year:
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        value = self.start
        while value <= self.end:
            if value % 4 == 0 and (value % 100 != 0 or value % 400 == 0):
                self.start = value + 4  
                return value
            value += 1

        raise StopIteration

y = Year(2009, 2115)
yiter = iter(y)

for i in y:
    print(I)

© www.soinside.com 2019 - 2024. All rights reserved.