根据用户输入在循环中创建新的 类

creating new classes in a loop according to user input

所以我正在尝试制作一个素数筛子,它将制作一个 class 对象,该对象存储最多用户提供的数字的素数。但我想 运行 在一个循环中,用户可以在其中继续创建新对象并存储质数列表,并让他们选择继续这样做。

如果他们两次输入相同的数字,我只想打印存储在之前创建的对象中的先前结果,而不是通过设置计算替换之前的对象和 运行ning建立一个全新的列表。

  1. 我认为我唯一挂断的是如何不断地创建新的 class 对象并每次都给对象新的名称而不是我第一次做的,将对象存储在变量 'c' 中。

如果你看我的代码,筛子会正常工作,我只是不知道如何在不将对象存储在变量中的情况下创建对象'c'

history={}
class Eratosthenes(object):

    def __init__(self,b):
        self.limitn=int(b)+1
        self.not_prime = [False]*self.limitn
        self.primes = []

    def do_primes_sieve(self):
        for i in range(2, self.limitn):
            if self.not_prime[i]:
                continue
            for f in xrange(i**2, self.limitn, i):
                self.not_prime[f] = True
            self.primes.append(i)

    def get_primes_til(self):
        for i in self.primes:
            print (i)
    def get_num_of_primes(self):
        print (len(self.primes))

a = True
while a:
    b = raw_input("How far are you going to search?: ")
    if b in history.keys():
        c = history[b]
        c.get_num_of_primes
    else:
        c = Eratosthenes(b)
        history[b] = c
        c.do_primes_sieve()
        c.get_primes_til()
    d = raw_input("Continue? (type 'yes' or 'no'): ")
    if d == "yes":
        continue
    elif d == "no":
        a=False
    else:
        print "This is a 'yes' or 'no' question. We're done here."
        a=False

您可以声明一些 class 变量(又名静态变量),例如名为 history 的字典,它将存储结果:

class Eratosthenes(object):

    history = {}

    def __init__(self,b):
        self.limitn=int(b)+1
        self.not_prime = [False]*self.limitn
        self.primes = []

    def do_primes_sieve(self):
        if self.limitn-1 in Eratosthenes.history.keys():
            self.primes = Eratosthenes.history[self.limitn-1]
        else:
            for i in range(2, self.limitn):
                if self.not_prime[i]:
                    continue
                for f in xrange(i**2, self.limitn, i):
                    self.not_prime[f] = True
                self.primes.append(i)
            Eratosthenes.history[self.limitn-1] = self.primes

然后,您可以修改 do_primes_sieve 方法,这样,如果 history 词典中存在先前的答案,Eratosthenes 的当前实例的 primes将从字典中提取。

根据下面的讨论,将 history 视为全局的更新答案:

history = {}

class Eratosthenes(object):


    def __init__(self,b):
        self.limitn=int(b)+1
        self.not_prime = [False]*self.limitn
        self.primes = []

    def do_primes_sieve(self):
        for i in range(2, self.limitn):
            if self.not_prime[i]:
                continue
            for f in range(i**2, self.limitn, i):
                self.not_prime[f] = True
            self.primes.append(i)

    def get_primes_til(self):
        for i in self.primes:
            print i 
    def get_num_of_primes(self):
        print len(self.primes)
a = True
while a:
    b = raw_input("How far are you going to search?: ")
    if b in history.keys():
        c = history[b]
        c.get_num_of_primes()
    else:
        c = Eratosthenes(b)
        history[b] = c
        c.do_primes_sieve()
        c.get_primes_til()
    d = raw_input("Continue? (type 'yes' or 'no'): ")
    if d == "yes":
        continue
    elif d == "no":
        a=False
    else:
        print "This is a 'yes' or 'no' question. We're done here."
        a=False