Python 无法在函数中调用函数
我是python的初学者。我在做一个掷硬币模拟器。 这是我的代码:Python 无法在函数中调用函数,python,python-3.x,Python,Python 3.x,我是python的初学者。我在做一个掷硬币模拟器。 这是我的代码: 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 g
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:第24行未定义名称“doFlip”
你真的不需要上课,但如果你只是想练习,那就好好练习吧!问题是,正如注释中所述,
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
做出了一些重要的改变。首先,我添加了\uuu init\uu
函数,它是Python对象的构造函数。这是您想要定义任何成员变量、初始化事物等的地方。通过以这种方式定义的类,您可以创建多个ToSSimulator
实例,每个实例都将保留自己的分数记录:
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_函数
作为一个参数传递给构造函数。现在,您可以在创建时为tossimulator
的每个实例定义一个特殊的翻转函数,然后get\u 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
使用返回x==y
。它们完全相同,但其中一个更简洁(可能更高效?)。您还可以直接检查函数返回的“真实性”,因此如果self.flip()==True:,则无需使用;如果self.flip():
,您只需使用
您可以进一步了解最后一点,直接检查数值的“真实性”。在Python中,零是False
,所有其他整数都是True
doFlip
未在您调用它的范围内定义;这是tossimulator
类的一种方法。您应该这样调用:obj.getScore(obj.doFlip())
doFlip
不使用tossimulator
的实例,因此应该将其定义为类外的常规函数。getScore
的参数名称具有误导性;你不是在传递一个函数作为参数,而是一个布尔值。而且,如果你是在开始的话,我现在不会使用类。类不会在这里添加任何内容。另外,在我看来,您正在使用一些导师熟悉Java的教程,并教您这些,但是Java和Python的语义在类定义方面是不同的。注意,如果您确实想创建一个类,那么应该创建一个\uuuu init\uuuu
方法,而不是依赖于类变量。