我是python的初学者。我正在制作一个Toss Simulator。 这是我的代码:
import random
class TossSimulator():
heads = 0
tails = 0
def doFlip(self):
x = random.randint(0,1)
if(x == 0):
return True
else:
return False
def getScore(self, flip_function):
if flip_function is True:
self.heads+=1
else:
self.tails+=1
obj = TossSimulator()
obj.getScore(doFlip())
我收到的错误是:
NameError:名称'doFlip'未在第24行定义
答案 0 :(得分:1)
你真的不需要上课,但如果你只是想练习,那就练好吧!问题是,如评论中所述,doFlip
在您尝试调用它的范围内不存在。将一些评论包含在一个解决方案中,以说明一些不错的功能:
import random
class TossSimulator():
def __init__(self, flip_function):
"""
Args:
flip_function: function that returns True (heads) or False (tails)
"""
self.heads = 0
self.tails = 0
self.flip = flip_function
def get_score(self):
if self.flip(): # call stored flip function
self.heads += 1
else:
self.tails += 1
print('Heads: {}\tTails: {}'.format(self.heads, self.tails))
def do_flip():
return random.randint(0, 1) == 0 # skip the middle man
obj = TossSimulator(do_flip)
obj.get_score() # prints the running total heads and tails
# Heads: 0 Tails: 1
进行了一些重要的改变。首先,我添加了__init__
函数,它是Python对象的构造函数。这是您要定义任何成员变量,初始化事物等的地方。通过这种方式定义的类,您可以创建TossSimulator
的多个实例,并且每个实例都会记录自己的分数:< / p>
obj1 = TossSimulator(do_flip)
obj2 = TossSimulator(do_flip)
obj1.getScore() # Heads: 1 Tails: 0
obj1.getScore() # Heads: 1 Tails: 1
obj2.getScore() # Heads: 0 Tails: 1 (scored separately)
obj2.getScore() # Heads: 0 Tails: 2
其次,我将flip_function
作为传递给构造函数的参数。现在,您可以在创建TossSimulator
的每个实例时为其定义一个特殊的翻转函数,然后get_score
每次调用时都会使用为该实例定义的的翻转函数它:
def always_heads():
return True
obj1 = TossSimulator(do_flip)
obj2 = TossSimulator(always_heads)
obj1.getScore() # Heads: 0 Tails: 1
obj1.getScore() # Heads: 1 Tails: 1 (random flips)
obj2.getScore() # Heads: 1 Tails: 0
obj2.getScore() # Heads: 2 Tails: 0 (always will be heads)
第三,我清理了几件事。例如,您可以替换这样的内容:
if x == y:
return True
else:
return False
return x == y
。它们完全相同,但一个更简洁(可能效率更高一些?)。您还可以直接检查函数返回的“真实性”,因此您不需要使用if self.flip() == True:
;你可以使用if self.flip():
。
您可以更进一步,直接检查数值的“真实性”。在Python中,零是False
,所有其他整数都是True
。 A summary of what values are true and what values are false can be found here