簡體   English   中英

Python3 列表推導式無法按預期工作

[英]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

更遠

  1. Python lambda 與本地值的綁定

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM