2012-12-04 3 views
-2

경고입니다.이 코드는 추악합니다. 나는 이것을하는 더 좋은 방법이 있다는 것을 알고 있습니다. 그러나 이것은 단지 운동입니다.Python에서 중첩 된 함수 호출 수 제한

나는 파이썬의 기능 프로그래밍면 주위에 파고 있어요,하지만 난 시도하고 둥지 기능의 수를 호출 할 때 나는 오류가 발생 유지 :

LEN = 4 
def calcentropy(i): 
    entropy[i] = -1 * reduce(lambda x,y: x+y, map(lambda x: x*np.log2(x), map(lambda x: x * (float(1)/float(NUM)), map(count, range(0,LEN))))) 
map(calcentropy, range(0,LEN)) 

나는 오류 메시지가 나는이 없다는 얻을 유형 들간의 불일치;) (떠 마지막 호출 없음 범위는 없습니다 : 형식 오류를 : 지원되지 않는 피연산자 유형 (들) *에 대한 'NoneType'와 '부동'

을 나는 같은 것을 할 때 :

LEN = 4 
def calcFreqs(i): do stuff to freqs 
map(calcFreqs, range(0, LEN) 
def calcentropy(i): 
    entropy[i] = -1 * reduce(lambda x,y: x+y, map(lambda x: x*np.log2(x), map(lambda x: x * (float(1)/float(NUM)), freqs)))) 
map(calcentropy, range(0,LEN)) 

내가 돈을 ' 어떤 문제가 있습니다.

저는 LEN이 더 이상 range() 호출 범위에 없다고 생각합니다. 이 문제를 해결할 수있는 방법이 있습니까? 아니면 일종의 제한을 초과 했습니까? 그렇다면 무엇입니까? 충분한 코드를 추가하지 죄송합니다

, 내 실수 :

import numpy as np 
LEN = 4 
freqs = np.zeros(4 * LEN, dtype = np.float64) 
sites = np.array([0,1,2,3,0,1,2,3,0,1,2,3], dtype = np.int8) 
A = np.int8(0) 
C = np.int8(1) 
G = np.int8(2) 
T = np.int8(3) 
def count(i): 
    freqs[i * LEN + A] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN])) 
    freqs[i * LEN + C] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN])) 
    freqs[i * LEN + G] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN])) 
    freqs[i * LEN + T] = E + reduce(lambda x,y:x+y, map(lambda x: 1 if x==A else 0, sites[i::LEN])) 
entropy = np.zeros(LEN, dtype = np.float64) 
def calcentropy(i): 
    entropy[i] = -1 * reduce(lambda x,y: x+y, map(lambda x: x*np.log2(x), map(lambda x: x * (float(1)/float(NUM)), map(count, range(0,LEN))))) 
map(calcentropy, range(0,LEN)) 
print entropy 
info = map(lambda x: 2-x, entropy)  
+0

항상 ** exact ** 오류 메시지가 포함됩니다. – jordanm

+0

[최대 재귀 수준?] (http://stackoverflow.com/questions/3323001/maximum-recursion-depth)의 중복 가능성이 있습니다. 정확한 오류 메시지 없이는 말하기가 어렵습니다. –

+1

'count'는 무엇을합니까? –

답변

3

그들은 당신이 겪고있는 문제는 당신 count 기능이 아무것도 반환하지 않습니다. 파이썬에서는 None을 반환하는 것과 같습니다.

따라서 긴 중첩 문을 실행하면 전화 번호 (map(count, range(0, LEN)))에서 None 값 목록이 다시 나타납니다. 첫 번째 None 값은 가장 안쪽의 람다 식으로 전달되면 예외가 발생하고 float로 곱하려고 시도합니다.

따라서 중첩 된 구조의 가장 안쪽 값으로 다른 것을 사용해야하거나 무언가를 반환하려면 count을 수정해야합니다. 반복 할 의도가 무엇인지 분명하지 않아서 솔리드 제안을 실제로 제공 할 수 없습니다. 아마도 freqs일까요?

또한 나는 번만의 기능을 실행하기 만하면되지만 결과는 신경 쓰지 않으려면 map을 피하는 것이 좋습니다. 대신 명시적인 for 루프를 작성하십시오. 이것은 파이썬 3에서 중요합니다. map은 생성자를 반환합니다 (반복 할 때까지 아무 것도하지 않습니다).

관련 문제