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

我是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 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
方法,而不是依赖于类变量。