如何在Python中输入“如果函数被调用了很多次”?

2024-09-28 05:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在用Python和Kivy设计一个hangman游戏,我想添加一个输赢选项。在

我定义的一个函数是Button_pressed,如果按钮被按下,它会隐藏它,但是我希望函数man_is_hung()有这样的内容:“如果按钮被按下了6次,显示“游戏结束”

有人能帮帮我吗?在

 def button_pressed(button):
        for (letter, label) in CurrentWord:
            if (letter.upper() == button.text): label.text=letter 
        button.text=" " # hide the letter to indicate it's been tried

def man_is_hung():
    if button_pressed(button)

Tags: 函数text游戏ifisdefbutton按钮
3条回答

下面是一种在不涉及全局或类的函数中使用静态变量的方法:

def foobar():
    foobar.counter = getattr(foobar, 'counter', 0)
    foobar.counter += 1
    return foobar.counter

for i in range(5):
    print foobar()

可以将按钮存储为一个类,如下所示:

class button_pressed(Object):
    def __init__(self):
        self.num_calls = 0

    def __call__(self, button):
        self.num_calls += 1
        if self.num_calls > 6:
            print "Game over."
            return None
        else:
           # Your regular function stuff goes here.

这基本上是一个手动的装饰器,虽然它可能有点复杂,但这是一个简单的方法来做一个函数的簿记。在

实际上,做这种事情的正确方法是使用一个decorator,它根据您希望函数能够被调用的次数接受一个参数,然后自动应用上面的模式。在

编辑:啊!hcwhsa击败了我。他的解决方案是我上面所说的更一般的解决方案。在

使用decorator

示例:

class count_calls(object):
    def __init__(self, func):
        self.count = 0
        self.func = func
    def __call__(self, *args, **kwargs):
        # if self.count == 6 : do something
        self.count += 1
        return self.func(*args, **kwargs)

@count_calls
def func(x, y):
    return x + y

演示:

^{pr2}$

在py3.x中,您可以使用nonlocal来使用函数而不是类来实现相同的功能:

def count_calls(func):
    count = 0
    def wrapper(*args, **kwargs):
        nonlocal count
        if count == 6:
            raise TypeError('Enough button pressing')
        count += 1
        return func(*args, **kwargs)
    return wrapper

@count_calls
def func(x, y):
    return x + y

演示:

>>> for _ in range(6):func(1,1)
>>> func(1, 1)
    ...
    raise TypeError('Enough button pressing')
TypeError: Enough button pressing

相关问题 更多 >

    热门问题