2013-10-14 66 views
0

嘗試將以下PHP函數轉換爲Python,但出現以下錯誤。工作Python與下面的PHP函數等效的是什麼?將PHP函數轉換爲Python

線140,在doDetectBigToSmall 在x範圍規模(start_scale,比例> 1,標度=規模* scale_update): UnboundLocalError:分配之前引用的本地變量 '規模'

PHP CODE:

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代碼:

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} 
+2

在盲目編寫Python代碼之前:學習Python,特別是不要使用顯式從未檢查過其sementatics的方法。 –

+0

我沒有檢查語義,但我承認我沒有完全理解For For循環與範圍和Xrange相比,For Next循環如何與我一起工作的其他語言。我正在嘗試學習Python,並沿着我將犯錯的方式授予,並且可能需要一些指針。 – bfalz

回答

2

您不知道什麼xrange()做;-)所以閱讀文檔,你再次嘗試之前。在此期間,替換:

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

scale = start_scale 
while scale > 1: 

,並在循環的末尾,添加:

scale *= scale_update 

你的所有的xrange()其他用途也同樣打破,但你必須讓一些努力學習它做什麼。

+0

感謝您的反饋,是的,我甚至在閱讀文檔之後,對Python中的範圍和xrange缺乏充分的理解,因爲我習慣於在下一個循環中指定像scale> 1的條件來停止循環。不過要了解你在這裏列出的內容,並且會重新使用while。謝謝蒂姆。 – bfalz

+0

使用交互式shell探索語言的位。真的有幫助!例如,輸入'list(xrange(2,10,3))'並且看看你得到了什麼。很高興這個例子有助於:-) –

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或讓該函數執行錯誤。

0

這是發生,因爲x範圍是一個函數,你傳遞一個未初始化的值給它。在xrange運行並返回一個值之前,Scale不會被初始化。 Python通常用於循環遍歷列表。我建議使用while循環重寫你的代碼。