Что делает инъекция? - PullRequest
       7

Что делает инъекция?

0 голосов
/ 06 июня 2018

Я переводил некоторый код Ruby на Python, но это поставило меня в тупик.

Может кто-нибудь объяснить, что делает эта inject функция?

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

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

В псевдокоде, с учетом двумерного массива "rate" и одного массива "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]

Inпитон:

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) 
0 голосов
/ 06 июня 2018

inject - это метод "накопления" в Ruby.Если вы слышите это слово впервые, вы можете взглянуть на эту статью .Вот API doc для метода.Также метод псевдонима из inject равен reduce - в зависимости от контекста, в котором вы его используете, ваш код может стать более читабельным и значимым.

В вашем примере 1.0 value - это только начальное значение метода, на котором будет накапливаться.Если, например, ваша 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

В конце цикл вернет накопленную переменную val.

0 голосов
/ 06 июня 2018

Это эквивалентно

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