为啥这个 python 闭包不起作用?
Posted
技术标签:
【中文标题】为啥这个 python 闭包不起作用?【英文标题】:Why doesn't this python closure work?为什么这个 python 闭包不起作用? 【发布时间】:2013-10-31 23:46:30 【问题描述】:试图让工作函数 evaluate_poly(poly,x_n) 和 compute_deriv2(poly,x_n) 在函数 compute_root(poly,x_n,epsilon) 内工作
代码运行,没有抛出任何错误,但没有返回任何内容。 这是代码
# 6.00 Problem Set 2
#
# Successive Approximation
#
def evaluate_poly(poly, x_n):
"""
Computes the polynomial function for a given value x. Returns that value.
Example:
>>> poly = (0.0, 0.0, 5.0, 9.3, 7.0) # f(x) = 7x^4 + 9.3x^3 + 5x^2
>>> x = -13
>>> print evaluate_poly(poly, x) # f(-13) = 7(-13)^4 + 9.3(-13)^3 + 5(-13)^2
180339.9
poly: tuple of numbers, length > 0
x: number
returns: float
"""
valHolder=0
for i in range((0),(len(poly))):
valHolder=valHolder+(poly[i])*(x_n** i)
return float(valHolder)
def compute_deriv(poly):
"""
Computes and returns the derivative of a polynomial function. If the
derivative is 0, returns (0.0,).
Example:
>>> poly = (-13.39, 0.0, 17.5, 3.0, 1.0) # x^4 + 3x^3 + 17.5x^2 - 13.39
>>> print compute_deriv(poly) # 4x^3 + 9x^2 + 35^x
(0.0, 35.0, 9.0, 4.0)
poly: tuple of numbers, length > 0
returns: tuple of numbers
"""
newList=list(poly)
for i in range((0),(len(poly))):
##if i > 0.0:
a=newList[i]
b=i
if b == 0:
continue
else:
derivedNumber=a*b
newList.append(derivedNumber)
finishedTuple=tuple(newList)
return finishedTuple[len(poly):]
print "FINISHED TUPLE IS= ",finishedTuple
def compute_deriv2(poly,x_n):
"""
Similar to first compute_deriv, this time takes a value for x
"""
newList=list(poly)
for i in range((0),(len(poly))):
##if i > 0.0:
a=newList[i]
b=i
if b == 0:
continue
else:
derivedNumber=a*b
newList.append(derivedNumber)
finishedTuple=tuple(newList[len(poly):])
derivedValue=0
for g in range((0),len(finishedTuple)):
c=finishedTuple[g]
d=g
derivedValue+=c*(x_n**d)
return derivedValue
def compute_root(poly, x_n, epsilon):
"""
Uses Newton's method to find and return a root of a polynomial function.
Returns a tuple containing the root and the number of iterations required
to get to the root.
Example:
>>> poly = (-13.39, 0.0, 17.5, 3.0, 1.0) #x^4 + 3x^3 + 17.5x^2 - 13.39
>>> x_0 = 0.1
>>> epsilon = .0001
>>> print compute_root(poly, x_0, epsilon)
(0.80679075379635201, 8.0)
poly: tuple of numbers, length > 1.
Represents a polynomial function containing at least one real root.
The derivative of this polynomial function at x_0 is not 0.
x_0: float
epsilon: float > 0
returns: tuple (float, int)
"""
evaluate_poly(poly,x_n)
compute_deriv2(poly,x_n)
newList=list(poly)
这是我使用的输入。
>>>>compute_root((-13.39,0.0,17.5,3.0,1.0),0.1,0.0001)
当我自己调用它们时,所有单独的函数都可以工作,除了 compute_root 一个。知道我应该如何关闭它以使其工作吗?我是否必须在 compute_root 函数中再次定义它们?
【问题讨论】:
你不应该用compute_root返回一些东西吗? “没有返回任何内容”可能是因为compute_root
没有返回语句...
其实None is returned
应该是正确答案。
这和闭包有什么关系?
这里没有闭包。
【参考方案1】:
compute_root 中没有返回
e = evaluate_poly(poly,x_n)
c = compute_deriv2(poly,x_n)
newList=list(poly)
return e, c # or whatever you want
【讨论】:
酷。确保您选择一个答案作为您接受的答案。【参考方案2】:是的,不会引发任何错误,但您不会在 compute_root
中返回任何内容。这意味着这些函数的返回值:
evaluate_poly(poly,x_n)
compute_deriv2(poly,x_n)
被简单地忽略。此外,由于默认情况下不返回任何内容的函数会返回 None
,因此请执行以下操作:
print compute_root(...)
将不可避免地打印None
。
要解决此问题,请在 compute_root
中添加一个返回语句,以返回您想要的结果。我不知道这到底是什么,但可以举个例子:
a = evaluate_poly(poly,x_n)
b = compute_deriv2(poly,x_n)
c = newList=list(poly)
return a, b, c
【讨论】:
以上是关于为啥这个 python 闭包不起作用?的主要内容,如果未能解决你的问题,请参考以下文章