[python] 파이썬에서 함수를 전달할 수 있습니까?

파이썬에서 함수를 전달할 수 있습니까? cmp선언하기 전에 내 함수를 사용하여 목록을 정렬하고 싶습니다 .

print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])

cmp_configs호출 후 메소드 정의를 넣도록 코드를 구성했습니다 . 이 오류로 실패합니다.

NameError: name 'cmp_configs' is not defined

cmp_configs메소드를 사용하기 전에 “선언”하는 방법이 있습니까? 내 코드가 더 깨끗해 보일까요?

일부 사람들은이 문제가 없도록 코드를 재구성해야한다고 말하고 싶어합니다. 그러나 불가피한 경우가있을 수 있습니다 (예 : 일부 재귀 형식을 구현할 때). 이 예제 마음에 들지 않으면, 나는 그것의하는 경우가 있다고 가정 정말 함수를 선언 전달하는 것이 필요합니다.

파이썬에서 함수를 앞으로 선언하는 것이 필요한 경우를 생각해보십시오.

def spam():
    if end_condition():
        return end_result()
    else:
        return eggs()

def eggs():
    if end_condition():
        return end_result()
    else:
        return spam()

경우 end_conditionend_result이전에 정의되어있다.

코드를 재구성하고 항상 호출 전에 정의를 넣는 유일한 솔루션입니까?



답변

함수 사용 하기 전에 정의하지 않고 나중에 정의하는 것이 불가능 하다면 다른 모듈에서 정의하는 것은 어떻습니까?

기술적으로는 여전히 먼저 정의하지만 깨끗합니다.

다음과 같이 재귀를 만들 수 있습니다.

def foo():
    bar()

def bar():
    foo()

파이썬의 함수는 값이 익명 인 것처럼 익명이지만 이름에 바인딩 될 수 있습니다.

위의 코드 foo()에서 이름이 foo 인 함수를 호출하지 않고 호출 foo시점에서 이름 에 바인딩되는 함수를 호출합니다 . foo다른 곳 에서 재정의 bar한 다음 새 함수를 호출 할 수 있습니다.

선언되지 않은 변수를 요청하는 것과 같기 때문에 문제를 해결할 수 없습니다.


답변

당신이 할 수있는 일은 호출을 자체 기능으로 감싸는 것입니다.

그래서

foo()

def foo():
    print "Hi!"

깨지 겠지만

def bar():
    foo()

def foo():
    print "Hi!"

bar()

제대로 작동합니다.

일반적인 규칙 Python은 함수가 코드에서 더 높게 정의되어야한다는 것이 아닙니다 (Pascal ), 그러나 그것의 사용 전에 정의되어야한다.

희망이 도움이됩니다.


답변

다음을 통해 스크립트를 시작하면 :

if __name__=="__main__":
   main()

“포워드 선언”과 같은 것에 대해 걱정할 필요가 없습니다. 인터프리터는 모든 함수를로드 한 다음 main () 함수를 시작합니다. 물론 모든 수입품도 올바른지 확인하십시오 😉

그것을 생각해 보니, 파이썬에서 “앞으로 선언”과 같은 것을 들어 본 적이 없지만 다시는 틀릴 수도 있습니다. 😉


답변

cmp_configs에 대한 호출이 자체 함수 정의 내에 있으면 괜찮습니다. 예를 들어 보겠습니다.

def a():
  b()  # b() hasn't been defined yet, but that's fine because at this point, we're not
       # actually calling it. We're just defining what should happen when a() is called.

a()  # This call fails, because b() hasn't been defined yet, 
     # and thus trying to run a() fails.

def b():
  print "hi"

a()  # This call succeeds because everything has been defined.

일반적으로 코드를 함수 (예 : main ())에 넣으면 문제가 해결됩니다. 파일 끝에서 main ()을 호출하십시오.


답변

이 글을 소생시킨 것에 대해 사과드립니다 만, 여기서 논의되지 않은 전략이 있습니다.

리플렉션을 사용하면 선언을 전달하는 것과 비슷한 작업을 수행 할 수 있습니다. 예를 들어 다음과 같은 코드 섹션이 있다고 가정 해보십시오.

# We want to call a function called 'foo', but it hasn't been defined yet.
function_name = 'foo'
# Calling at this point would produce an error

# Here is the definition
def foo():
    bar()

# Note that at this point the function is defined
    # Time for some reflection...
globals()[function_name]()

따라서 이런 방식으로 실제로 정의하기 전에 어떤 함수를 호출 할 것인지, 실제로는 선언을 결정했습니다. 파이썬에서 문은 globals()[function_name]()동일 같은 foo()경우 function_name = 'foo'파이썬을 호출하기 전에 각각의 기능을 조회해야하기 때문에 이유를 들어, 위에서 언급. timeit모듈 을 사용 하여이 두 명령문을 비교하는 방법을 살펴보면 계산 비용이 정확히 같습니다.

물론 여기 예제는 매우 쓸모가 없지만 함수를 실행 해야하는 복잡한 구조를 가지고 있지만 이전에 선언 해야하는 경우 (또는 구조적으로는 나중에 의미가 거의 없음) 문자열을 저장하고 나중에 함수를 호출하십시오.


답변

파이썬에는 순방향 선언과 같은 것이 없습니다. 함수가 필요하기 전에 선언되어 있는지 확인하면됩니다. 함수 본문은 함수가 실행될 때까지 해석되지 않습니다.

다음 예제를 고려하십시오.

def a():
   b() # won't be resolved until a is invoked.

def b():
   print "hello"

a() # here b is already defined so this line won't fail.

함수 본문은 함수를 호출하면 해석되는 다른 스크립트 일 뿐이라고 생각할 수 있습니다.


답변

아니요, 파이썬에서 함수를 전달할 방법이 없다고 생각합니다.

당신이 파이썬 인터프리터라고 상상해보십시오. 라인에 도착하면

print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])

cmp_configs가 무엇인지 알거나 알 수 없습니다. 계속하려면 cmp_configs를 알아야합니다. 재귀가 있는지는 중요하지 않습니다.