[英]Python3 list comprehensions not working as expected
我目前正在 Python 中實現插值多項式的拉格朗日形式。
它由我開始使用的多項式的總和組成。 給定要擬合的點 (x, y) 列表,我使用以下代碼計算這些分量多項式中的第一個:
def f(x):
return x**2 - 1
def product(l):
from functools import reduce
return reduce(lambda x,y: x*y, l)
xs = [2,3,5]
ys = [f(x) for x in xs]
p0 = lambda x: product([(x - xj)/(xs[0] - xj) for xj in xs if xs[0] != xj])
到目前為止,一切正常,因為:
p0(2) = 1.0
p0(3) = 0.0
p0(5) = 0.0
正如理論所說。 以自然的方式,我試圖將其概括為將每個分量多項式計算為一個列表。 為了實現這一點,我用另一個列表推導式包圍了 lambda 表達式,用xi
替換每次出現的對xs
的索引訪問,並在xs
迭代xi
:
p = [lambda x: product([(x - xj)/(xi - xj) for xj in xs if xi != xj]) for xi in xs]
看到這段代碼,我非常有信心地同意這個列表的第一個元素與 p0 相同。 然而,事實證明:
p[0](2) = 0.0
p[0](3) = 0.0
p[0](5) = 1.0
這同樣適用於 p 的所有元素。 我一定在列表推導式或 lambda 表達式中遺漏了一些東西。 那是什么? 提前感謝您的幫助。
您面臨的問題被稱為后期綁定閉包,基本上所有函數都使用最后一個xi
,一個可能的解決方案是使用默認參數:
def f(x):
return x ** 2 - 1
def product(l):
from functools import reduce
return reduce(lambda x, y: x * y, l)
xs = [2, 3, 5]
ys = [f(x) for x in xs]
p0 = lambda x: product([(x - xj) / (xs[0] - xj) for xj in xs if xs[0] != xj])
p = [lambda x, xi=xi: product([(x - xj) / (xi - xj) for xj in xs if xi != xj]) for xi in xs]
print(p[0](2))
print(p[0](3))
print(p[0](5))
輸出
1.0
0.0
0.0
更遠
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.