尝试将以下PHP函数转换为Python但收到以下错误。与以下PHP函数等效的Python工作原理是什么?
第140行,在doDetectBigToSmall中 对于xrange中的比例(start_scale,scale> 1,scale = scale * scale_update): UnboundLocalError:赋值前引用的局部变量'scale'
PHP代码:
protected function doDetectBigToSmall($ii, $ii2, $width, $height)
{
$s_w = $width/20.0;
$s_h = $height/20.0;
$start_scale = $s_h < $s_w ? $s_h : $s_w;
$scale_update = 1 / 1.2;
for ($scale = $start_scale; $scale > 1; $scale *= $scale_update) {
$w = (20*$scale) >> 0;
$endx = $width - $w - 1;
$endy = $height - $w - 1;
$step = max($scale, 2) >> 0;
$inv_area = 1 / ($w*$w);
for ($y = 0; $y < $endy; $y += $step) {
for ($x = 0; $x < $endx; $x += $step) {
$passed = $this->detectOnSubImage($x, $y, $scale, $ii, $ii2, $w, $width+1, $inv_area);
if ($passed) {
return array('x'=>$x, 'y'=>$y, 'w'=>$w);
}
} // end x
} // end y
} // end scale
return null;
}
PYTHON CODE:
def doDetectBigToSmall(self,ii, ii2, width, height):
s_w = width/20.0
s_h = height/20.0
start_scale = s_h if s_h < s_w else s_w
scale_update = 1 / 1.2
for scale in xrange(start_scale, scale > 1,scale = scale* scale_update):
w = (20*scale) >> 0
endx = width - w - 1
endy = height - w - 1
step = max(scale, 2) >> 0
inv_area = 1 / (w*w)
for y in xrange(0,y < endy,y = y + step):
for x in xrange(0, x < endx, x= x + step):
passed = self.detectOnSubImage(x, y, scale, ii, ii2, w, width+1, inv_area)
if (passed):
return {'x': x, 'y': y, 'w': w}
答案 0 :(得分:2)
你不知道xrange()
做了什么;-)所以在再次尝试之前阅读文档。在此期间,请替换:
for scale in xrange(start_scale, scale > 1,scale = scale* scale_update):
与
scale = start_scale
while scale > 1:
并且,在循环结束时,添加:
scale *= scale_update
xrange()
的所有其他用途同样被破坏,但您必须做一些努力来了解它的作用。
答案 1 :(得分:0)
这对我有用:
def strpos_r(haystack, needle):
positions = []
position = haystack.rfind(needle)
while position != -1:
positions.append(position)
haystack = haystack[:position]
position = haystack.rfind(needle)
return positions
此外,函数不应该真正处理输入错误。您通常只返回False或让函数抛出执行错误。
答案 2 :(得分:0)
这种情况正在发生,因为xrange是一个函数,并且您正在向它传递未初始化的值。在运行xrange并返回值之前,不会初始化Scale。 Python通常用于循环迭代列表。我建议使用while循环重写代码。