2012-01-16 3 views
4

안녕하세요. 함수를 가져와 해당 인수 함수를 실행할 함수를 반환해야하는 함수가 필요합니다. 1000 번씩 매번 평가 해 봅니다. 나는 이런 일이 :다른 인수를 사용하여 파이썬 함수를 여러 번 실행하십시오.

def runner(f): 
    def inner(*args): 
     for i in xrange(1000): 
      f(*args) 
    return inner 

를하지만이 같은 것을 호출 보인다 같은 인수를 1000 배 F runner(f)(random.randint(1,UPPER_BOUND)) 실행됩니다. 그것을 올바르게하는 방법?

답변

7

발생하는 문제는 runner()에 의해 반환 된 inner() 함수가 호출 될 때 random.randint(1,UPPER_BOUND)이 한 번 평가된다는 것입니다. 필요한 것은 나중에 평가를 연기하는 것입니다.

당신은 이런 식으로 뭔가를 시도 할 수 : callable는 원래의 함수 f 호출 할 때마다 호출

>>> def runner(f, callable): 
... def inner(): 
...  for i in xrange(1000): 
...  f(*callable()) 
... return inner 
... 
>>> runner(f, lambda: (random.randint(1, 1000),))() 
603 
385 
321 
etc. 

하는 것으로. 또한 callable은 튜플 또는 목록과 같은 시퀀스 유형을 반환해야합니다.

편집 : 당신이 f에 다른 인수를 전달해야하는 경우 당신은 이런 식으로 뭔가 함께 할 수

>>> def runner(f, callable): 
... def inner(*args, **kwds): 
...  for i in xrange(1000): 
...  pos = list(callable()) 
...  pos.extend(args) 
...  f(*pos, **kwds) 
... return inner 
... 
>>> def f(a, b, c, d = 3): 
... print a, b, c, d 
... 
>>> runner(f, lambda: (random.randint(1,1000),))(3, 5, d = 7) 
771 3 5 7 
907 3 5 7 
265 3 5 7 
1
당신은 함수 (고화질)로 random.randint 당신의 계산을 이동해야합니다

다음 @here 경우에 읽을 수있는 장식 구문

예를 들어,이 같은, 당신은 시작할 수 있어야입니다 당신은 그것에 익숙하지 않습니다. 뻔뻔하게 다른 게시물에서 헬로우 예를 훔쳐 :

import random 

UPPER_BOUND = 1000 

def runner(fn): 
    def wrapped(): 
     for i in range(0,10): 
      stuff = random.randint(1,UPPER_BOUND) 
      print(str(stuff) + ': ' + fn()) 
    return wrapped 

@runner 
def hello(): 
    return 'hello world' 


if __name__=='__main__': 
    hello() 

편집 : 함수는 같은 인수마다 시간을 가져옵니다 이유 또한 인 당신의 random.randint이 (정의시) 한 번만 실행됩니다 이유를 이해하기 위해 here 참조 .

1

당신은 루프 내부의 random.randit 통화를 보류 할 수 있습니다

def runner(function): 
    def inner(callable, args=()): 
     for i in xrange(1000): 
      function(callable(*args)) 
    return inner 

그리고 러너에게 전화 할 수 있습니다.

runner(f)(random.randint, args=(1, UPPER_BOND)) 

이것은 당신이하려고했던 것 같았습니다. (그리고 못생긴 람다를 포함하지 않습니다.)

관련 문제