'inject' 是做什么的?

What does 'inject' do?

我一直在将一些 Ruby 代码翻译成 Python,但这让我很困惑。

有人可以分解一下这个 inject 函数的作用吗?

val = (0..seq.size - 2).inject(1.0) do |v, i|
  v * rates[seq[i]][seq[i+1]]
end

相当于

val = 1.0
(0..seq.size - 2).each do |i|
    val = val * rates[seq[i]][seq[i+1]]
end

在伪代码中,给定一个二维数组 "rates" 和一个数组 "seq":

val = 1.0
for each consecutive pair(s,t) of values in seq:
    val = product * rates[s][t]

因此,如果 seq = [1,2,3],这将给出乘积 rates[1][2] * rates[2][3]

在python中:

val = 1.0
for i in range(len(seq)-1):
     val*=rates[seq[i]][seq[i+1]]

reduce(lambda v,i: v*rates[seq[i]][seq[i+1]], range(len(seq)-1), 1.0) 

inject 是 Ruby 中的一个“累加器”方法。如果你是第一次听到这个词,你可以看看 article. Here is the API doc for the method. Also an alias method of inject is reduce - 根据你使用它的上下文,你的代码可能会变得更易读并且有意义。

在您的示例中,1.0 值只是方法累积的起始值。例如,如果您的 seq 的长度为 3 ([1,2,3]),您的循环将执行以下步骤:

  1. 1.0 *= rates[1][2] #=> i = 0
  2. 1.0*rates[1][2] *= rates[2][3] #=> i = 1 = seq.size - 2

在循环结束时将 return 累积的 val 变量。