#php #python #markov-chains
#php #python #markov-chains
Вопрос:
Я видел этот детектор тарабарщины цепочки Маркова, написанный в ответ на другой вопрос о Stackoverflow, и я хотел бы преобразовать его в PHP, я не ищу кого-то, кто сделал бы это за меня, но меня смущают части кода Python, о которых я ничего не знаю. Я просмотрел документы python, но это еще больше меня смущает.
- Что такое PHP-эквивалент yield?
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])
- Что именно такое 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)
- Что делает assert? Это эквивалент создания исключения?
assert min(good_probs) > max(bad_probs)
- Python Pickle, это по сути сериализация?
pickle.dump({'mat': counts, 'thresh': thresh}, open('gib_model.pki', 'wb'))
Спасибо за любую помощь.
Редактировать: опечатки.
Ответ №1:
1. Что такое PHP-эквивалент yield?
В PHP нет эквивалента yield
. yield
используется в функциях генератора — специальном классе функций, который возвращает результат, но сохраняет его состояние.
Например:
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. Что делает assert? Это эквивалент выброса и исключения?
ДА. Будьте осторожны — это не то же самое, что PHP assert
, что является действительно интересным вектором для атак на ваше программное обеспечение.
4. Python Pickle, это по сути сериализация?
ДА.
Комментарии:
1. Что касается вашего ответа на вопрос 1. Я вижу, что вы также можете использовать статическое значение $start = 0;, установленное в функции php.
2. @buggedcom:
static
Что касается генераторов: Нет, вы не можете использоватьstatic
для этого. То есть, если вы не хотите ограничиться только одним экземпляром, не подлежащим сбросу , для всего процесса . Несколько сохраненных строк редко, если вообще когда-либо, стоят того.
Ответ №2:
- xrange возвращает итератор. Это отличается от range, который возвращает список. Оба ведут себя в основном одинаково, поэтому просто используйте его так, как вы используете range.
- ДА
- ДА
Комментарии:
1. @buggedcom: исходный код ответа подразумевает «да» (первый элемент пронумерован 2). Для лучшего или для wrose, markdown игнорирует такие «ошибки» нумерации и просто отображает
1..3
вместо2..4
.