将Ruby翻译为Python

3 投票
3 回答
4596 浏览
提问于 2025-04-17 11:07

我正在把一些代码从Ruby语言重写成Python语言。这段代码是关于一个叫做感知器的东西,具体在聪明算法:自然启发的编程食谱的8.2.6节中提到。我之前从来没有用过Ruby,所以有些地方我不太明白:

def test_weights(weights, domain, num_inputs)
  correct = 0
  domain.each do |pattern|
    input_vector = Array.new(num_inputs) {|k| pattern[k].to_f}
    output = get_output(weights, input_vector)
    correct += 1 if output.round == pattern.last
  end
  return correct
end

这里有一些解释:num_inputs是一个整数(在我的例子中是2),而domain是一个数组的列表:[[1,0,1], [0,0,0], 等等]

我不太明白这一行:

input_vector = Array.new(num_inputs) {|k| pattern[k].to_f}

这行代码创建了一个包含2个值的数组,每个值|k|存储的是pattern[k].to_f,但是pattern[k].to_f到底是什么呢?

3 个回答

0

我不是Ruby方面的专家,但我觉得在Python中大概是这样的:

def test_weights(weights, domain, num_inputs):
    correct = 0
    for pattern in domain:
        output = get_output(weights, pattern[:num_inputs])
        if round(output) == pattern[-1]:
            correct += 1
    return correct

这里有很多优化的空间:如果num_inputs总是比domain中列表的长度少一个,那么你可能根本不需要这个参数。

要小心从一种语言逐行翻译到另一种语言:这样做通常不会得到好的结果,无论涉及到什么语言。

编辑:因为你说你觉得不需要转换成浮点数,所以你可以直接从域值中切出所需数量的元素。我已经相应地更新了我的代码。

2
pattern[k].to_f

pattern[k] 转换成一个浮点数。

4

试试这个:

input_vector = [float(pattern[i]) for i in range(num_inputs)]

撰写回答