Python - Class.function()。function()

时间:2016-04-07 13:18:16

标签: python function class

我在codewars.com上遇到了这个问题:First n Primes数字。 虽然我没有定义类Primes()和Primes.first(n1)的问题,但我需要在表单下找到最后的素数:Primes.first(n1).last(n2)。而且我不知道如何定义last(n2)而不会出错。

    import math
    class Primes():
       def first(self):
           primes = []
           count = 1
           prime = True
           while len(primes) != self:
               for i in range(2, int(math.sqrt(count)) + 1):
                   if count % i == 0:
                   prime = False
                   break
           if prime:
               primes.append(count)
           prime = True
           count += 1
           return primes

       def last(self):
           pass

如果我尝试使用Primes.first(5).last(3)我得到:AttributeError:'list'对象没有属性'last'。

1 个答案:

答案 0 :(得分:0)

...首先返回一个list.last()试图在列表中调用名为last的函数。列表没有名为last的函数。

我想你想要这个。

class Primes(list):
    def first(self, amount):
        count = 1
        while len(self) < amount:
            prime = True
            for i in range(2, int(math.sqrt(count)) + 1):
                if count % i == 0:
                    prime = False
                    break
            if prime:
                self.append(count)
            count += 1
        return self # Note: self is Primes object which has a last method.

    def last(self, amount):
        ...
        return self

p = Primes()
p.first(5)
p.last(3)
# same as p = Primes().first(5).last(3) because it returns self
# Primes now inherits from list, so it works like a list but has a last method

我修复了代码中的标签。

从它的外观来看,你根本不需要最后一种方法。如果您只想获取最后5个值,请使用[-5:]。

# Your old way edited
class Primes():
    @staticmethod
    def first(amount):
       primes = []
       count = 1
       while len(primes) < amount:
            prime = True
            for i in range(2, int(math.sqrt(count)) + 1):
                if count % i == 0:
                    prime = False
                    break
            if prime:
                primes.append(count)
            count += 1
       return primes

p = Primes.first(20)
print(p)
print(p[-5:]) # This will give you the last 5