限制Python中嵌套函数调用的数量

限制Python中嵌套函数调用的数量,python,lambda,functional-programming,Python,Lambda,Functional Programming,只是一个警告,这个代码很难看。我知道有更好的方法,但这只是一个练习 我正在研究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))))) m

只是一个警告,这个代码很难看。我知道有更好的方法,但这只是一个练习

我正在研究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))
我收到一条错误消息,指出我的类型不匹配;最后一次对range()的调用为float和None::TypeError:不支持*:“NoneType”和“float”的操作数类型

当我做以下事情时:

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)    

您遇到的问题是,
count
函数不返回任何内容。在Python中,这与返回
None
相同

因此,当您运行长嵌套语句时,您将从最内层的
map
调用返回一个
None
值列表:
map(count,range(0,LEN))
。然后,当第一个
None
值传递给最内层的lambda表达式并尝试将其乘以浮点值时,会导致异常

因此,您要么需要使用其他内容作为大型嵌套结构的最内层值,要么需要修复
count
以返回内容。我不清楚你打算重复什么,所以我不能提供一个可靠的建议。也许是
频率


另外,我建议,当您只想运行一个函数很多次而不关心结果时,不要使用
map
。相反,为循环编写一个显式的
。这在Python 3中很重要,在Python 3中,
map
返回一个生成器(在您对它进行迭代之前,它不会执行任何操作)。

始终包含准确的错误消息。如果没有准确的错误消息,很难说它可能重复。我知道您警告过丑陋的代码,但是请记住,仅仅因为您使用的是函数式编程技术,这并不意味着您必须这样嵌套。您可以定义函数以保持代码更干净。我添加了错误消息,对此表示抱歉。我省略了count,因为它又大又丑,但是,count也使用常量LEN。如果我设置
count=lambda x:1
NUM=1.0
,以及
entropy=np.array([0]*LEN)
,那么代码运行良好。您需要发布足够的代码,以便有人能够重现您的错误。