将PHP函数转换为Python

时间:2013-10-14 04:33:49

标签: php python

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

3 个答案:

答案 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循环重写代码。