2016-06-12 3 views
2

Я использую следующий код: lambda для вызова функции один раз в цикле, он работает, но теперь я пытаюсь вызвать функцию в течение определенного времени, например 3 раза в цикле, я искал он и нашел некоторые решения, но они вызывают функцию для определенных времен, если нет цикла, когда я пытаюсь в цикле, ничего не меняется. Есть ли эффективный способ сделать это?Вызов функции дважды или более в цикле

Эта работа работает в цикле и печатается только один раз. Я хочу что-то подобное сделать 3 раза.

def once(): 
    print "Do function once" 
    once.func_code = (lambda:None).func_code 

once() 

Этот код, приведенный ниже, не меняет ничего, и он продолжает печатать навсегда, если он находится в цикле, если он не работает.

def repeat_fun(times, f): 
    for i in range(times): f() 

def do(): 
    print 'Do function for 3 times' 

repeat_fun(3, do) 

Также добавление счетчика вне цикла помогает, но я думаю, что для этого должно быть лучшее решение.

+0

Может быть, я не правильно понимайте свою проблему, но второй фрагмент кода работает правильно для меня. Я даже поставил 'repeat_fun (3, do)' в цикле и запустил его, и он запустил число раз, которое я указал, а затем остановился. Вы пытаетесь получить это поведение с помощью lambda? – coralvanda

+0

Я попробовал еще раз, он не работает в цикле. 'while True: repeat_fun (3, do)', он сохраняет печать навсегда. 'lambda' решение будет лучше, но любой эффективный способ сделать это тоже. – hzleonardo

+0

'пока True печатает навсегда', поэтому ваша проблема заключается в том, что вы создаете бесконечный цикл, который работает вечно? – polku

ответ

6

Вы должны работать с декоратором, что делает его ясно, что вы собираетесь делать:

class call_three_times(object): 
    def __init__(self, func): 
     self.func = func 
     self.count = 0 

    def __call__(self, *args, **kw): 
     self.count += 1 
     if self.count <= 3: 
      return self.func(*args, **kw) 

@call_three_times 
def func(): 
    print "Called only three times" 

func() # prints "Called only three times" 
func() # prints "Called only three times" 
func() # prints "Called only three times" 
func() # does nothing 
+0

Да, это то, что я искал, это работает как шарм. Спасибо. – hzleonardo

+0

Почему бы не добавить параметр 'max', а затем проверить, что' self.count <= self.max' перед вызовом. – TheLazyScripter

5

Другой подход заключается в использовании функции вместо класса:

def call_three_times(func, *args, **kwargs): 
    def wrapper(*args, **kwargs): 
     wrapper.called += 1 
     return func(*args, **kwargs) if wrapper.called <= 3 else None 
    wrapper.called = 0 
    return wrapper 


@call_three_times 
def func(): 
    print "Called only three times" 
Смежные вопросы