2016-10-10 2 views
-1

매개 변수가없는 함수를 실행하는 방법을 알고있었습니다. 이 경우 임의의 순서로 매개 변수가있는 함수를 실행하고 싶습니다.Python 3 : 매개 변수가있는 함수를 임의의 순서로 실행하는 방법은 무엇입니까?

결과는 무작위가 아니며 약간의 오류가 있습니다. 제 코드를 수정하는 데 도움주세요. 고마워요 :)

+3

'기능 = [('요') 안녕하세요, howold ('20 : functools.partial()

from functools import partial functions = [partial(hi, 'John'), partial(howold, '20', 'John'), partial(howmuch, '50')] random.shuffle(functions) for i in functions: i() 
여기

공식 문서, 예를 들어 사용 ','John '), howmuch ('50')]'. 메시지를 인쇄하고 None을 반환합니다. 그러면 목록이 [없음, 없음, 없음]이고 None()을 호출하려고 시도하지만 작동하지 않습니다. –

+1

@ S.deMelo 잘 잡으세요. 웬일인지 나는 그 방법을 붙잡지 않았다. 원래 함수가 문자열과 비교되는 것처럼 보였습니다. – idjaw

+0

@ S.deMelo 답변으로 대답 – idjaw

답변

1

이 줄을 실행 :

functions = [hi('John'),howold('20', 'John'),howmuch('50')] 

파이썬이 점에서 다음 3 개 기능 hi(), howold()howmuch()를 호출합니다 주문한 다음 결과를 functions이라는 목록에 저장하십시오. 따라서 모든 은 그 시점에서 실행됩니다. 그래서 당신이 말했듯이, "결과는 보여 주지만 무작위는 아닙니다"입니다. 모든 함수가 아무 것도 반환하지 않으므로 functions[None, None, None]과 같습니다.

다음 코드 :

random.shuffle(functions) 
for i in functions: 
    i() 

은 (없음을 실행하지하려고합니다). 그러면 "오류가 있습니다"라는 오류 메시지가 표시됩니다.이 오류는 TypeError: 'NoneType' object is not callable입니다.

해결 방법 : https://docs.python.org/2/library/functools.html#functools.partial 귀하의 기능이 라인에서 직접 호출하는

-1

루프에서 나는 함수이고 문자열이 아니므로, 문자열을 실용적으로 비교하면 다른 것으로 끝납니다.

functions = [(hi, ['John']), (howold, ['20', 'John']), (howmuch, ['50'])] 

random.shuffle(functions) 
for func, args in functions: 
    func(*args) 
3

시도의 것을 사용 .

이 같은 인수없이 새로운 기능을 생산하는 람다를 사용할 수 있습니다

functions = [lambda: hi('John'), 
      lambda: howold('20', 'John'), 
      lambda: howmuch('50')] 
random.shuffle(functions) 

for f in functions: 
    f() 
2

귀하의 functions 목록은 루프에서 이미 평가 기능의 결과를 인수하지 부분적으로 적용 기능 (당신이 i() 그들을 호출 할 수 있도록)가 포함되어 대신 같은 if i.__name__ == 'hi

관련 문제