簡體   English   中英

如何在Python中放入“如果函數已被多次調用”?

[英]How to put “if the function has been called this many times” in Python?

所以我正在設計一個使用Python和Kivy的子手游戲,我想添加一個勝利/失敗選項。

我定義的函數之一是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)

使用裝飾器

例:

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

演示:

>>> for _ in range(4): func(0, 0)
>>> func.count
4
>>> func(0, 0)
0
>>> func.count
5

在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

這是在不涉及全局變量或類的函數中具有靜態變量的方法:

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.

這基本上是一個手動裝飾器,盡管對於您嘗試執行的操作可能有點復雜,但這是對函數進行簿記的一種簡便方法。

的確,執行此操作的正確方法是使用裝飾器,該裝飾器接受您希望函數能夠被調用的次數的參數,然后自動應用上述模式。

編輯:啊! hcwhsa擊敗了我。 他的解決方案是我上面所說的更通用的解決方案。

num_presses = 0
def button_pressed(button):
    global num_presses
    num_presses += 1
    if num_presses > X:
         print "YOU LOSE SUCKA!!!"
    for (letter, label) in CurrentWord:
        if (letter.upper() == button.text): label.text=letter 
    button.text=" " # hide the letter to indicate it's been tried

我會感到驚訝的是,您在不知道如何保存簡單狀態的情況下走了這么遠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM