测试某个值是否不是由i产生的

2024-09-27 21:31:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想测试某个值是否属于使用迭代器生成的数字序列。当然,当值不属于序列时,只要满足该值就可以停止。但当它不存在的时候,我想问题就出现了。你知道吗

但是,可以使用附加信息(例如,序列正在增加)。你知道吗

以斐波那契为例:

class FibonacciIterator(object):
    def __init__(self):
        self.mem = [0, 1]
    def __next__(self):
        curr = self.mem[0]
        new = self.mem[0]+self.mem[1]
        self.mem[0] = self.mem[1]
        self.mem[1] = new
        return curr

class Fibonacci(object):
    def __iter__(self):
       return FibonacciIterator()

如果测试8是否属于序列,则一切正常:

>>> fib = Fibonacci()
>>> 8 in fib
True

但是,如果一个测试10(它不属于序列),那么

>>> 10 in fib
...

永不终止。但是我们可以通过观察8之后是13,很容易确定10不在序列中,因为序列在增加,所以必然是not 10 in fib。你知道吗

Python中有没有一种好的方法来实现in的这种行为,以便10 in fib终止?你知道吗


Tags: inselfnewreturnobjectdef序列数字
1条回答
网友
1楼 · 发布于 2024-09-27 21:31:29

简单的解决方案是实现一个^{}方法,该方法只迭代迭代器的一个副本:

class FibonacciIterator(object):
    def __init__(self):
        self.mem = [0, 1]

    def __iter__(self):
        return self

    def __contains__(self, value):
        testit = FibonacciIterator()
        testit.mem = list(self.mem)  # copy
        for item in testit:
            if item == value:
                return True
            if item > value:
                return False

    def __next__(self):
        curr = self.mem[0]
        self.mem = self.mem[1], sum(self.mem)
        return curr

class Fibonacci(object):
    def __iter__(self):
        return FibonacciIterator()

    def __contains__(self, value):
        return value in iter(self)

然而,还有另一种方法来确定一个数是否是斐波那契数:如果(5*n**2 + 4)(5*n**2 – 4)或两者都是完美平方(整数的平方)。你知道吗

我将使用来自this answer的方法来实现is_square函数:

def is_square(apositiveint):
    # Source: https://stackoverflow.com/a/2489519/5393381
    # Credit: Alex Martelli

    x = apositiveint // 2
    seen = {x}
    while x * x != apositiveint:
        x = (x + (apositiveint // x)) // 2
        if x in seen: 
            return False
        seen.add(x)
    return True

class FibonacciIterator(object):
    def __init__(self):
        self.mem = [0, 1]

    def __iter__(self):
        return self

    def __contains__(self, value):
        if value < self.mem[0]:
            return False
        else:
            # Just check if at least one of both is a perfect square
            value_squared_times_five = 5*value**2
            return is_square(value_squared_times_five + 4) or is_square(value_squared_times_five - 4)

    def __next__(self):
        curr = self.mem[0]
        self.mem = self.mem[1], sum(self.mem)
        return curr

class Fibonacci(object):
    def __iter__(self):
        return FibonacciIterator()

    def __contains__(self, value):
        return value in iter(self)

相关问题 更多 >

    热门问题