이런 종류의 작업을 수행하는 데는 여러 가지 방법이 있습니다.
"언어를 벗어나서"설명 할 수없는 경우 블렌더의 대답처럼 로컬 함수를 정의하고 반환 할 수 있습니다.
def make_func(a, b):
def f(n):
return n**a + b
return f
때때로, 당신은 더 나은 수행 및 데이터로 기능을 나타낼 수 : 이것은 당신이 (블렌더의 예를 빌리는) 새로운 함수를 정의 할 필요가 있다고 생각하면 당신이 원하는 것을 보통이다. 예를 들어, 임의의 다항식 함수를 어떻게 생성합니까? 글쎄, 당신은 필요가 없습니다; 계수 및 값의 목록을 취하여이를 평가하는 다항식 함수를 가질 수 있습니다. 그럼 당신이해야 할 일은 계수 목록을 만드는 것뿐입니다.
사실, 여기가 당신이 원하는 것 같아요. 당신이 말하는대로 :
2 * f (n-1) - 4 * f (n-2) - 5 * f (n-3) + 15 * f * (n-4) (n-1) + f (n-2) + f (n-2) + f (n-3) + f 5 * f (n-5) 내가 필요로하는 것에 따라.
이
확실히 계수의리스트로 표현 될 수있다 :
def make_recursive_func(coefficients, baseval):
def f(n):
if n < len(coefficients): return baseval[n]
return sum(coefficient * f(n-i-1) for i, coefficient in enumerate(coefficients))
return f
그러나 당신이 이제까지 반환 된 기능을 할거야 모든 통화 인 경우, 하나의 eval_recursive_func(coefficients, baseval)
를 작성하는 아마 간단 즉시 그것을 잊어 버려라.
가끔씩은 아니지만 절대로 실제로 코드를 실행해야합니다. Himanshu가 말하듯이 eval
및 exec
과 친구들이이를 수행하는 방법입니다. 예를 들면 : 당신은 그냥 할 것입니다 정확히 것처럼
newcode = '''
def f(n):
if n<=3: return [0, 0, 6, 12][n]
return 2*f(n-1) - 4*f(n-2) - 5*f(n-3) + 15*f(n-4)
'''
exec(newcode)
이제 f
기능은 정의 된이 :
def f(n):
if n<=3: return [0, 0, 6, 12][n]
return 2*f(n-1) - 4*f(n-2) - 5*f(n-3) + 15*f(n-4)
이 Py2보다 Py3에서 조금 다른, 그리고에 따라 차이가 있습니다 어떤 컨텍스트를 실행할지, 아니면 실행이나 평가, 컴파일 또는 가져 오기와 같은 대우 등을 원하는지 등이 있습니다. 그러나 이것이 기본 개념입니다.
두 번째 대신 첫 번째 글자를 쓰고 싶은 이유를 생각할 수 없다면이 필요가 없습니다.
그리고 올바른 문자열을 생성하는 방법을 알아낼 수 없다면이 작업을해서는 안됩니다.
Ignacio Vazquez-Abrams가 지적했듯이 이러한 기능을 사용자 입력으로 구축 할 수 있다면 대개 반복적으로 컴파일하고 AST를 따라 가면서 안전하다는 것을 확인해야합니다.
마지막으로 훨씬 더 적은 수의 다른 함수 객체 (또는 손으로 제작 한 바이트 코드)에서 바로 새 함수 객체를 만들 때 new
모듈 (및/또는 inspect
)을 사용해야합니다. 그러나 당신이 그것을하는 방법을 알 필요가 있다면, 당신은 아마 이미 방법을 알고 있습니다.
달성하고자하는 것은 _metaprogramming입니다. _ –
언제이 기능을 만들 수 있습니까? 런타임 중에 "사용자 입력"에서? 또는 동적으로 당신이 시작될 때 많은 함수들을로드 할 플러그인 모듈을 제공합니까? – jdi
당신은 더 구체적이어야합니다. 이러한 함수를 어떻게 작성하고 있습니까? 로컬로 정의 된 함수 (또는 람다) 나 다른 함수를 구동하는 데이터가 아닌 프로그램 텍스트 형식이어야합니까? 즉석에서 텍스트를 평가할 필요가 있다면 직접 작성해야 할 방법이 있습니다 (직접 컴파일 된 바이트 코드로 함수를 만드는 방법조차 있습니다 ...). 가능하면 그렇게하지 마십시오. 대개 잘못된 답입니다. 파이썬. – abarnert