0

尝试将以下 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;  
}  

蟒蛇代码:

 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}
4

3 回答 3

2

你不知道是什么xrange();-) 所以在你重试之前阅读文档。同时,更换:

for scale in xrange(start_scale, scale > 1,scale = scale* scale_update):

scale = start_scale
while scale > 1:

并且,在循环结束时,添加:

    scale *= scale_update

您的所有其他用途xrange()都同样被破坏,但您必须付出一些努力才能了解它的作用。

于 2013-10-14T04:42:33.257 回答
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 或让函数抛出执行错误。

于 2013-10-14T04:38:22.990 回答
0

发生这种情况是因为 xrange 是一个函数,并且您将未初始化的值传递给它。直到 xrange 运行并返回一个值之后,Scale 才会被初始化。Python 通常使用 for 循环来迭代列表。我建议使用 while 循环重写你的代码。

于 2013-10-14T04:50:15.733 回答