Python 在与链接列表交互时打印“无”而不是“无”

Python 在与链接列表交互时打印“无”而不是“无”,python,python-3.x,list,loops,Python,Python 3.x,List,Loops,我有一个链表,在这个链表中,我在一个范围内迭代,并返回这个范围内可以表示为整数的所有平方数。与其只返回可以执行此操作的数字,它将返回中间的None,例如9,None,None…,16,None,None…,25我希望它只返回9,16,25等 class Squares: def __init__(self, start, end): self.__start = start - 1 self.__end = end -1 def __iter__

我有一个链表,在这个链表中,我在一个范围内迭代,并返回这个范围内可以表示为整数的所有平方数。与其只返回可以执行此操作的数字,它将返回中间的
None
,例如
9,None,None…,16,None,None…,25
我希望它只返回
9,16,25等

class Squares:
    def __init__(self, start, end):
        self.__start = start - 1
        self.__end = end -1

    def __iter__(self):
        return SquareIterator(self.__start, self.__end)

class SquareIterator:
    def __init__(self, start, end): 
        self.__current = start
        self.__step = 1
        self.__end = end

    def __next__(self):
        if self.__current > self.__end:
            raise StopIteration 
        else:
            self.__current += self.__step 
        x = self.__current - self.__step + 1
        self.__current - self.__step + 1
        if str(x).isdigit() and math.sqrt(x) % 1 == 0:
            return x

您需要使
\uuuuuuuuuuuuuuuuuuuuuuuuuu下一步\uuuuuuu
函数继续循环,直到达到目标值:

def __next__(self):
    # We're just going to keep looping. Loop breaking logic is below.
    while True:
        # out of bounds
        if self.__current > self.__end:
             raise StopIteration

        # We need to get the current value
        x = self.__current
        # increase the state *after* grabbing it for test
        self.__current += self.__step 

        # Test the value stored above
        if math.sqrt(x) % 1 == 0:
             return x

你应该先存储x,然后再递增的原因是,不管发生什么,你都必须递增,即使你没有一个完美的正方形。

不清楚你为什么要把事情复杂化;有一个简单的方法:

import math

class Squares:
    def __init__(self, start, end):
        self.__start = start
        self.__end = end
        self.__step = 1

    def __iter__(self):
        for x in range(self.__start, self.__end, self.__step):
            if math.sqrt(x) % 1 == 0:
                yield x

s = Squares(0, 100)
for sq in s:
    print(sq, end=' ')
输出: 从评论中: 请注意,避免这种情况可能会容易得多 迭代器类,只需将正方形的
\uuuu iter\uuu
实现为生成器 功能。Explicit
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
管理层认为Python做得很差,而且不那么容易遵循;
\uuuu iter\uuuu
作为生成器函数通常非常简单;每次你达到一个收益率,就像是下一个收益率,但是所有的 您的状态是本地函数,不涉及特殊对象(生成器 注意保存和恢复所述的当地州暗影游侠>

它甚至可能不需要一个正方形类。生成函数 命名的方块会做需要做的事情;通过它开始,停止和步骤和 将它们用作局部变量,而不是某些变量的属性 不必要的自我。这门课唯一的真正优势是它可以 反复迭代而不重建,这可能是一种不常见的用法 案例


请注意,避免使用专用的迭代器类可能会容易得多,只需将
iter\uuu
作为生成器函数实现。Explicit
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu<代码>\uuuu iter\uuuuu
作为生成器函数通常非常简单;每次你点击一个
yield
,就像
\uuuuu next\uuuuu
中的
返回值一样,但是你的所有状态都是函数本地的,不涉及特殊对象(生成器负责保存和恢复所说的本地状态),我可以看出它甚至不需要
Squares
类。名为
squares
的生成器函数将执行所需的操作;传递它
开始
停止
步骤
,并将它们用作局部变量,而不是一些不必要的
自身
的属性。该类的唯一真正优点是可以重复迭代而不重建它,这可能是一个不常见的用例;我们不知道的是该代码的最终目的;也许OP为他的课程考虑了其他功能?我会在回答中加上你的话,因为这很有道理。旁注:你认为这里的链表是什么?你在这里所做的事情没有一件与链表相关。你是否误解了链表和迭代器这两个术语?
0 1 4 9 16 25 36 49 64 81 
def squares_from(start, stop, step=1):
    """returns a generator function for the perfect squares 
    in the range comprised between start and stop, iterated over using step=step
    """
    for x in range(start, stop, step):
        if math.sqrt(x) % 1 == 0:
            yield x

for sq in squares_from(0, 100):
    print(sq, end=' ')