2016-06-12 2 views
2

루프에서 함수를 한 번 호출하려면 lambda 코드를 사용합니다.하지만 이제는 루프에서 3 번 같은 특정 시간 동안 함수를 호출하려고합니다. 그것과 몇 가지 해결책을 찾았지만 루프가 없다면 특정 시간 동안 함수를 호출합니다. 루프에서 시도 할 때 아무 것도 변경되지 않습니다. 이 작업을 수행하는 효율적인 방법이 있습니까?루프에서 두 번 이상 함수를 호출합니다

이 코드는 루프로 작동하며 한 번만 인쇄됩니다. 3 번이나 해보고 싶다.

이 코드는 아무 것도 바뀌지 않으며 루프에 있으면 영원히 계속 인쇄됩니다. 작동하지 않으면 계속 인쇄됩니다.

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)'을 루프에 넣고 실행했다. 그리고 지정한 횟수만큼 실행했다가 멈췄다. '램다 '로 그 행동을하려고합니까? – 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" 
관련 문제