我尝试过这个,但它给了我一个错误"赋值前引用的局部变量'l'
def likelihood(N,n,k):
"""
Call:
l = likelihood(N,n,k)
Input argument:
N: integer (array)
n: integer (array)
k: integer (array)
Output argument:
l: float (array)
Example:
likelihood(6,10,5)
=>
1.190748e-05
"""
if isinstance(N,list): # N is array
l = zeros(len(N))
for i, I in enumerate(N):
l[i]=exp(log_factorial(I)-log_factorial(I-k)-n*log(I))
else: # N is scalar
l= exp(log_factorial(N)-log_factorial(N-k)-n*log(N))
return(l)
我错在哪里?还是有其他方法可以解决它?
您
会收到错误,因为l
是在if
块的作用域内定义的,因此当您尝试返回它时,函数likelihood
没有定义l
变量。
给l
一个默认值,它应该没问题。
def likelihood(N,n,k):
""" documentation trimmed"""
l = []
if isinstance(N,list): # N is array
pass # rest of function here
return l
如果你调用 N 而不是 list 的函数,那么它不会进入 if
子句。因此,l
不是在达到return
时定义的。但是,实际的错误是 else
子句缩进。这可能是您想要的:
from numpy import zeros, exp, log
from scipy.special import gammaln
log_factorial = lambda z:gammaln(z+1)
def likelihood(N,n,k):
if isinstance(N,list): # N is array
l = zeros(len(N))
for i, I in enumerate(N):
l[i]=exp(log_factorial(I)-log_factorial(I-k)-n*log(I))
else: # N is scalar
l= exp(log_factorial(N)-log_factorial(N-k)-n*log(N))
return l
likelihood([6],10,5)
likelihood(6,10,5)