Python 在类中保留持久变量时遇到问题
我正在尝试编写一个脚本来猜测1-100之间的数字,并根据用户是否说数字太高或太低做出适当的响应,直到它猜到正确的数字。我的代码现在运行(Python2.7),但是猜测没有更新,即使我继续调用一个新的Python 在类中保留持久变量时遇到问题,python,oop,Python,Oop,我正在尝试编写一个脚本来猜测1-100之间的数字,并根据用户是否说数字太高或太低做出适当的响应,直到它猜到正确的数字。我的代码现在运行(Python2.7),但是猜测没有更新,即使我继续调用一个新的make\u guess。我的想法是: 初步估计50 被告知猜测是高、低还是正确 根据2中函数调用返回的答案调整猜测,并更新my_guess变量 继续,直到猜对为止 以下是我目前的代码: class Number_Guesser(object): lower_bound = 1 upp
make\u guess
。我的想法是:
my_guess
变量class Number_Guesser(object):
lower_bound = 1
upper_bound = 100
def initialize(self,lower_bound,upper_bound):
self.lower_bound = lower_bound
self.upper_bound = upper_bound
self.number_of_guesses = 1
def guess_and_adjust(self):
while True:
self.anticheat()
my_guess = self.make_guess()
answer = input('Enter 1 if your number is higher, 2 if it\'s lower, or 3 if I was correct!')
if answer=='1':
self.lower_bound = my_guess + 1
self.number_of_guesses = self.number_of_guesses + 1
elif answer=='2':
self.upper_bound = my_guess - 1
self.number_of_guesses = self.number_of_guesses + 1
elif answer=='3':
print 'Woohoooo! I guessed your number in {0} guesses!'.format(self.number_of_guesses)
def anticheat(self):
if self.lower_bound > self.upper_bound:
print 'You cheated! We\'re done here!'
quit()
def make_guess(self):
self.current_guess = (self.upper_bound + self.lower_bound)/2
print 'my guess is {0}'.format(self.current_guess)
return self.current_guess
n = Number_Guesser()
n.guess_and_adjust()
本质上,我的问题是我的代码哪里出了问题,以至于我的my_guess
变量没有更新?一些要点:
- 您的代码不起作用,因为在Python2(而不是3!)中,内置的
函数调用输入字符串上的input()
(evaluate,也称为将字符串转换为Python对象)。这意味着,如果键入eval()
,结果将不是1[输入]
,而是“1”
。改变这种情况的最好方法是使用1
,它不会计算输入流。您还应该检查输入是否无效raw\u input()
- 从不调用
方法。这是因为在Python中,“构造函数”函数被称为initialize
。因此,调用\uuuu init\uuuu
将调用MyClass(1,2,3)
当且仅当定义了MyClass.\uuu init\uuuuuuuuuuuuuuuuuuuuuself,1,2,3)
MyClass.\uuuuuuu init\uuuuuuuuuuuuuuuuuu
- 由于上述原因,在类内声明
和下限
不是一个好主意。将它们作为参数传递给上限
\uuuu init\uuu
- 您可以说
而不是使用x+=y
模式x=x+y
- 找到正确答案后,您应该退出程序(或重新启动程序)
class Number_Guesser(object):
def __init__(self,lower_bound,upper_bound):
self.lower_bound = lower_bound
self.upper_bound = upper_bound
self.number_of_guesses = 1
def guess_and_adjust(self):
while True:
self.anticheat()
my_guess = self.make_guess()
answer = raw_input('Enter 1 if your number is higher, 2 if it\'s lower, or 3 if I was correct!')
if answer=='1':
self.lower_bound = my_guess + 1
self.number_of_guesses += 1
elif answer=='2':
self.upper_bound = my_guess - 1
self.number_of_guesses += 1
elif answer=='3':
print 'Woohoooo! I guessed your number in {0} guesses!'.format(self.number_of_guesses)
quit()
else:
print 'Hey, that input is invalid!'
def anticheat(self):
if self.lower_bound > self.upper_bound:
print 'You cheated! We\'re done here!'
quit()
def make_guess(self):
self.current_guess = (self.upper_bound + self.lower_bound) / 2
print 'My guess is {0}.'.format(self.current_guess)
return self.current_guess
n = Number_Guesser(1, 100)
n.guess_and_adjust()
你是如何确定你的猜测没有更新的?您能否将示例输出添加到您的问题中,并解释您期望的输出?我注意到
guess\u和
方法中的while
循环永远不会存在,即使猜测是正确的;这将接受用户输入并将其解释为Python表达式。当您在提示下输入1
时,Python会接受该值,将该值解释为Python表达式,并生成整数值1
。但是,您的代码正在测试字符串,因此除非您输入'1'
(带文字引号),否则您的答案
测试将永远无法工作,您将得到一个无限循环。您应该使用原始输入()
,而不是使用输入(),它不尝试将输入解释为Python代码,只返回字符串。您也从未调用Number\u Guesser.initialize()
方法,因此从未设置self.Number\u of\u guesses
,因此,当您输入'1'
或'2'
或'3'
@MartijnPieters时,您会得到一个属性错误:“数字猜测者”对象没有属性“数字猜测者”
异常,您的智慧是无限的。非常感谢你的帮助!非常感谢!我不知道为什么我写了initialize
而不是init。。一定是晚上的时间:P