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

时间:2012-12-04 16:57:11

标签: 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)))))
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)    

1 个答案:

答案 0 :(得分:3)

他们发出的问题是你的count函数没有返回任何内容。在Python中与返回None相同。

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

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

另外,我建议避免map当你只想运行一个函数但不关心结果时。相反,写一个明确的for循环。这在Python 3中很重要,其中map返回一个生成器(在迭代它之前它不会执行任何操作)。