无法在函数内调用函数

时间:2017-10-03 15:49:52

标签: python python-3.x

我是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行定义

1 个答案:

答案 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,所有其他整数都是TrueA summary of what values are true and what values are false can be found here