0

我已经看到这个马尔可夫链乱码检测器是为了回答 Stackoverflow 上的另一个问题而编写的,我想将其转换为 PHP,我不是在找人为我做这件事,但我对部分 Python 代码感到困惑我不知道。我查看了 python 文档,但它让我更加困惑。

  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 min(good_probs) > max(bad_probs)
    
  4. Python Pickle,本质上是序列化吗?

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

谢谢你的帮助。


编辑:错别字。

4

2 回答 2

4

1. 什么是 PHP 等效的 yield?

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,本质上是序列化吗?

是的。

于 2011-10-25T07:26:03.110 回答
1
  1. xrange 返回一个迭代器。这与返回列表的范围不同。两者的行为方式基本相同,因此只需像使用范围一样使用它。

  2. 是的

  3. 是的

于 2011-10-25T07:20:55.507 回答