2011-10-25 41 views
0

的一些等效功能我見過這個馬爾可夫鏈亂碼檢測器是爲了響應another question on Stackoverflow而編寫的,我想將它轉換爲PHP,我不想找人爲我做這個,但我對我不瞭解的Python代碼部分感到困惑。我已經看過python文檔,但它讓我更加困惑。將馬爾可夫鏈Python腳本轉換爲PHP。不知道什麼是PHP

  1. 什麼是收益率的PHP等值?

    def ngram(n, l): 
    """ Return all n grams from l after normalizing """ 
    filtered = normalize(l) 
    for start in range(0, len(filtered) - n + 1): 
        yield ''.join(filtered[start:start + n]) 
    
  2. xrange究竟是什麼?有一個PECL擴展,但我更喜歡純PHP實現?這可能嗎?

    counts = [[10 for i in xrange(k)] for i in xrange(k)] 
    
    for i, row in enumerate(counts): 
    s = float(sum(row)) 
    for j in xrange(len(row)): 
        row[j] = math.log(row[j]/s) 
    
  3. assert是做什麼的?這是拋出異常的等價物嗎?

    assert min(good_probs) > max(bad_probs) 
    
  4. Python Pickle,是基本上序列化?

    pickle.dump({'mat': counts, 'thresh': thresh}, open('gib_model.pki', 'wb')) 
    

感謝您的幫助。


編輯:打字錯誤。

回答

4

1.什麼是PHP等值收益率的?

在PHP中沒有等效於yieldyield用於生成器函數 - 一種特殊的函數類,返回結果但保留其狀態。

例如:

def simple_generator(start=0, end=100): 
    while start < end: 
     start += 1 
     yield start 
gen = simple_generator() 
gen() # 1 
gen() # 2 
gen() # 3 

你可以做類似像這樣的東西在PHP中:

class simple_generator { 
    private $start; 
    private $end; 
    function __construct($start=0, $end=100) { 
     $this->start = $start; 
     $this->end = $end; 
    } 
    function __call() { 
     if($this->start < $this->end) { 
      $this->start++; 
      return $start; 
     } 
    } 
} 
gen = simple_generator(); 
gen(); // 1 
gen(); // 2 

2.到底是什麼的xrange?

xrange的行爲就像range,但使用生成器函數。這是一個性能調整,用於處理非常大的列表或內存很緊時。

3.斷言是做什麼的?它是否等同於拋出和異常?

是的。注意 - 這與PHP的assert不一樣 - 這是一個真正的樂趣矢量攻擊您的軟件。

4. Python Pickle,基本上是序列化?

是的。

+0

非常感謝Hamish。 – buggedcom

+0

關於您對問題1的回答。我發現您也可以使用靜態$ start = 0;在php函數中設置的值。 – buggedcom

+0

@buggedcom:關於發電機的'靜態':不,你不能使用'靜態'。也就是說,除非你想限制自己只有一個*單一的,而不是可復位*實例*的整個過程*。保存的幾行很少,如果有的話,值得。 – delnan

1
  1. xrange返回一個迭代器。這與返回列表的範圍不同。兩者的表現大都是相同的,所以就像使用範圍一樣使用它。

+0

感謝您的回覆,但問題編號1 = 2,2 = 3,3 = 4? – buggedcom

+0

@buggedcom:答案的源代碼意味着是(第一項編號爲2)。爲了更好或者更好,markdown忽略了這樣的編號「錯誤」,只顯示「1..3」而不是「2..4」。 – delnan