将Python代码转换为PHP
有没有什么软件可以自动把这段Python代码转换成PHP代码呢?
#!/usr/bin/python
import math
def calcNumEntropyBits(s):
if len(s) <= 0: return 0.0
symCount = {}
for c in s:
if c not in symCount: symCount[c] = 1
else: symCount[c] += 1
entropy = 0.0
for c,n in symCount.iteritems():
prob = n / float(len(s))
entropy += prob * (math.log(prob)/math.log(2))
if entropy >= 0.0: return 0.0
else: return -(entropy*len(s))
def testEntropy(s):
print "Bits of entropy in '%s' is %.2f" % (s, calcNumEntropyBits(s))
testEntropy('hello world')
testEntropy('bubba dubba')
testEntropy('aaaaaaaaaaa')
testEntropy('aaaaabaaaaa')
testEntropy('abcdefghijk')
6 个回答
8
我正在用Python制作一个PHP解释器,已经完成了一半。老实说,我发现有很多复杂的情况,这些情况会导致成千上万种可能性,这让把Python转换成PHP几乎变得不可能。Python的语法比PHP更强大,而且在语言的深度上,Python的标准库在同类语言中可能是最先进的。
我建议你先想想,为什么需要在PHP中使用基于Python的逻辑。与其试图把你的代码转换成PHP,你可以考虑其他方法,比如从PHP调用Python的子进程,或者使用Gearman让Python在后台处理工作,而PHP负责显示逻辑。还有一种更复杂的解决方案,就是在PHP应用和Python服务之间实现一个服务总线或消息队列。
PS. 如果有任何阅读上的问题,抱歉,我刚刚完成了两天的工作。
11
我创建了一个叫做 py2php 的工具,可以把Python代码转换成PHP代码。它可以自动翻译一些基本的逻辑,但你还需要手动调整一些库的调用等内容。目前这个工具还在实验阶段。
下面是根据提问者提供的Python代码自动生成的PHP代码。
<?php
require_once('py2phplib.php');
require_once( 'math.php');
function calcNumEntropyBits($s) {
if ((count($s) <= 0)) {
return 0.0;
}
$symCount = array();
foreach( $s as $c ) {
if (!$symCount.__contains__($c)) {
$symCount[$c] = 1;
}
else {
$symCount[$c] += 1;
}
}
$entropy = 0.0;
foreach( $symCount->iteritems() as $temp_c ) {
$prob = ($n / float(count($s)));
$entropy += ($prob * (math::log($prob) / math::log(2)));
}
if (($entropy >= 0.0)) {
return 0.0;
}
else {
return -($entropy * count($s));
}
}
function testEntropy($s) {
pyjslib_printFunc(sprintf('Bits of entropy in \'%s\' is %.2f', new pyjslib_Tuple([$s, calcNumEntropyBits($s)])));
}
testEntropy('hello world');
testEntropy('bubba dubba');
testEntropy('aaaaaaaaaaa');
testEntropy('aaaaabaaaaa');
testEntropy('abcdefghijk');
不过由于数学库的引入和 __contains__ 的问题,这段代码可能无法正确运行,但这些问题手动修正起来还是比较简单的。
14
我不知道有没有现成的把Python代码转换成PHP代码的工具,但其实这个工作应该很简单,因为这两种语言之间有很多相似之处,很容易就能看出来:
function calcNumEntropyBits($s) {
if (strlen($s) <= 0) return 0.0;
$symCount = array();
foreach (str_split($s) as $c) {
if (!in_array($c,$symCount)) $symCount[$c] = 1;
else $symCount[$c] ++;
}
$entropy = 0.0;
foreach ($symCount as $c=>$n) {
$prob = $n / (float)strlen($s);
$entropy += $prob * log($prob)/log(2);
}
if ($entropy >= 0.0) return 0.0;
else return -($entropy*strlen($s));
}
function testEntropy($s):
printf("Bits of entropy in '%s' is %.2f",$s,calcNumEntropyBits($s));
testEntropy('hello world');
testEntropy('bubba dubba');
testEntropy('aaaaaaaaaaa');
testEntropy('aaaaabaaaaa');
testEntropy('abcdefghijk');
在第一个函数的最后几行,也可以用标准的PHP三元表达式来写:
return ($entropy >= 0.0)? 0.0: -($entropy*strlen($s));