簡體   English   中英

Python迭代器返回不需要的“無”

[英]Python iterator returning unwanted 'None'

為什么我的迭代器在輸出中返回額外的“無”。 對於下面的參數/示例,我得到的是[None,4,None]而不是所需的[4]誰能解釋為什么我得到了額外的None以及如何解決它? 打印出的“返回”僅出現一次,因此我假設僅應在返回的調用函數中附加一項。

碼:

class Prizes(object):
    def __init__(self,purchase,n,d):
        self.purchase = purchase
        self.length = len(purchase)
        self.i = n-1
        self.n = n
        self.d = d

    def __iter__(self):
        return self

    def __next__(self):
        if self.i < self.length:
            old = self.i
            self.i += self.n
            if (self.purchase[old])%(self.d) == 0:
                print("returning")
                return old+1
        else:
            raise StopIteration

def superPrize(purchases, n, d):
    return list(Prizes(purchases, n, d))

purchases = [12, 43, 13, 465, 1, 13]
n = 2
d = 3
print(superPrize(purchases, n, d))

輸出:

returning
[None, 4, None]

如果您沒有顯式的return語句,則函數將返回None 這是在發生什么__next__if (self.purchase[old])%(self.d) == 0:是不是真的。 您要留在__next__直到它有返回值。

class Prizes(object):
    def __init__(self,purchase,n,d):
        self.purchase = purchase
        self.length = len(purchase)
        self.i = n-1
        self.n = n
        self.d = d

    def __iter__(self):
        return self

    def __next__(self):
        while self.i < self.length:
            old = self.i
            self.i += self.n
            if (self.purchase[old])%(self.d) == 0:
                return old+1
        raise StopIteration

def superPrize(purchases, n, d):
    return list(Prizes(purchases, n, d))

purchases = [12, 43, 13, 465, 1, 13]
n = 2
d = 3
print(superPrize(purchases, n, d))

正如評論中的人們指出的那樣,您的行if (self.purchase[old])%(self.d) == 0:導致函數返回而沒有任何返回值。 如果沒有提供返回值,則表示None 在返回或引發StopIteration之前,您需要某種方式來遍歷列表,直到通過此測試的下一個可用值。 一種簡單的方法是簡單地添加一個額外的else子句,以在測試失敗時再次調用self.__next__()

def __next__(self):
        if self.i < self.length:
            old = self.i
            self.i += self.n
            if (self.purchase[old])%(self.d) == 0:
                print("returning")
                return old+1
            else:
                return self.__next__()
        else:
            raise StopIteration

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM