根据用户输入在循环中创建新的 类
creating new classes in a loop according to user input
所以我正在尝试制作一个素数筛子,它将制作一个 class 对象,该对象存储最多用户提供的数字的素数。但我想 运行 在一个循环中,用户可以在其中继续创建新对象并存储质数列表,并让他们选择继续这样做。
如果他们两次输入相同的数字,我只想打印存储在之前创建的对象中的先前结果,而不是通过设置计算替换之前的对象和 运行ning建立一个全新的列表。
- 我认为我唯一挂断的是如何不断地创建新的 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
所以我正在尝试制作一个素数筛子,它将制作一个 class 对象,该对象存储最多用户提供的数字的素数。但我想 运行 在一个循环中,用户可以在其中继续创建新对象并存储质数列表,并让他们选择继续这样做。
如果他们两次输入相同的数字,我只想打印存储在之前创建的对象中的先前结果,而不是通过设置计算替换之前的对象和 运行ning建立一个全新的列表。
- 我认为我唯一挂断的是如何不断地创建新的 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