-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))

我收到一条错误消息,指出我的类型不匹配;最后一次调用 range() 的 float 和 None:TypeError: unsupported operand type(s) for *: 'NoneType' and '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)    
4

1 回答 1

3

他们的问题是你的count函数没有返回任何东西。在 Python 中,这与返回None.

所以当你运行你的长嵌套语句时,你会None从最里面的map调用中得到一个值列表:map(count, range(0, LEN)). 然后,当第一个None值被传递到最里面的 lambda 表达式并且您尝试将它乘以一个浮点数时,它会导致异常。

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

另外,我建议避免map当您只想多次运行一个函数但不关心结果时。相反,编写一个显式for循环。这在 Python 3 中很重要,它map返回一个生成器(在你迭代它之前它不会做任何事情)。

于 2012-12-04T20:24:27.057 回答