Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个程序挂起?googleappengine和Python_Python_Google App Engine_Math_Webapp2_Palindrome - Fatal编程技术网

为什么这个程序挂起?googleappengine和Python

为什么这个程序挂起?googleappengine和Python,python,google-app-engine,math,webapp2,palindrome,Python,Google App Engine,Math,Webapp2,Palindrome,当通过web表单输入数据时,该程序应该计算一个数字回文。它只使用python和web.py框架就可以在本地主机环境中正常运行。但从那时起,我使用webapp2框架将它移植到谷歌应用程序引擎,这样我就可以在公共服务器上启动它。当我为这个新框架重构代码时,处理计算的代码行中出现了一些问题。希望有人能帮助解决这个问题 下面是处理从浏览器获取输入的类。我已经测试过了,它似乎得到了很好的输入。然后,它将其发送到计算回文数,这将解决回文数的最终数量。它挂在这里 class result(webapp2.Re

当通过web表单输入数据时,该程序应该计算一个数字回文。它只使用python和web.py框架就可以在本地主机环境中正常运行。但从那时起,我使用webapp2框架将它移植到谷歌应用程序引擎,这样我就可以在公共服务器上启动它。当我为这个新框架重构代码时,处理计算的代码行中出现了一些问题。希望有人能帮助解决这个问题

下面是处理从浏览器获取输入的类。我已经测试过了,它似乎得到了很好的输入。然后,它将其发送到计算回文数,这将解决回文数的最终数量。它挂在这里

class result(webapp2.RequestHandler):

    def post(self):
        form = self.request.get_all('entries', default_value = None)
        if form[0]:
            if form[1]:
                orig_dollar_amount = cgi.escape(form[0])
                tip_percent = cgi.escape(form[1])
                final_amount = compute_palintip(float(orig_dollar_amount),
                                                float(tip_percent))
                actual_tip_percent = final_amount - orig_dollar_amount
                actual_tip_percent = actual_tip_percent*100/orig_dollar_amount
这是compute_palintip代码及其辅助函数:

def compute_palintip(orig_dollar_amount, tip_percent):

    orig_amount_cents = orig_dollar_amount*100
    final_amount = orig_amount_cents*(1.0 + tip_percent/100.0)
    while(is_palindrome(final_amount) == False): 
        final_amount += 1
    final_amount = final_amount/100
    final_amount = round(final_amount, 2)
    return final_amount

def is_palindrome(num):

    num_str = str(num)
    num_str_len = len(num_str)
    for i in range(num_str_len):
        if num_str[i] != num_str[num_str_len-i-1]:
            return False
    return True
请注意:

我必须将输入转换成浮点数,以便将它们发送到compute_palintip函数。 无法转换为整数,因为它们不允许小数位数。与餐厅美元金额相关的这些输入需要美分。 我还必须使用float类型,因为字符串和int都不能使用同样是float的公式。Python希望它们都一样。 然而,由于float和int被混合在一起,所以现在的数学似乎是不可靠的,而且它并没有终止。
数学是一位同事写的,而我写的是UI类型的东西,这就是为什么我现在不能真正调试它,所以我希望其他人能找到我没有看到的解决方案。谢谢。

也许您可以设置一些日志来查看程序的流程。在处理浮点数时,请在算术上保持一致,并在每个数字后使用小数: 原始美元金额*100.0 最终金额/100.0 最终金额+=1.0 实际小费百分比*100.0/原美元金额


此外,您未能将原始美元金额转换为浮动金额

您输入的数字是多少?在某些情况下,is_回文永远不会返回True。e、 g.1234567890。它将遍历整个字符串,每次测试都返回False。

我解决了问题,感谢大家的帮助。小数点必须精确,为了得到正确的结果,我必须确保在每个位置选择是否使用int/float/string等。逐行调试、测试各种示例并逐一纠正缺陷是唯一的方法


顺便说一句,这段代码的原型应用程序已经启动并运行,供有兴趣使用它的人使用。请随时测试一些组合,并让我知道任何反馈。

此外,这是该程序从中提取输入数据的网络表单,以防有用:原始餐费金额:目标小费百分比:应用程序无法挂起appengine。请求将在60秒后终止,死线超出错误。请检查您的日志,查看错误是什么,以及堆栈跟踪。然后您可能会得到一个有用的答案。它是否在本地使用?在本地计算机上调试可能比在AppEngine上调试容易。请检查控制台中的应用程序日志。我的猜测是,您得到了一个“预期浮动,得到字符串”错误,特别是在实际小费百分比=实际小费百分比*100/原币时_amount@MishaBrukman这很有帮助,非常感谢。我在appengine devserver中运行了它,它让我可以一步一步地浏览每一行。我现在已经隔离了这个问题,因为compute_palintip中的while循环,它反过来调用is_palindrome中的for循环,并且从不停止。Thx。我相信我在最新版本中修复了将原始美元金额转换为浮点的问题,但该错误仍然存在于compute_palintip函数中,因为它试图增加最终美元金额,直到它成为一个回文,但陷入了一个无限循环。这是值得注意的,但我通过将浮点转换为int,然后转换为字符串解决了这个问题,在is_回文函数中。递增是在十进制级别上完成的,然后在int级别上测试结果数字,以便它总是找到下一个回文。将浮点转换为int可以去掉美分。你确定这就是你想要的行为吗?此外,您从未处理过字符串中的小数点,这将永远不会与回文测试匹配。所以,当一个字符串是浮点数时,做一个.replace'',去掉小数点,但留下美分。我仍然说有些值会挂起,因为is_回文测试永远不会返回True。正如前面提到的,它已经完全解决了,单元测试正在通过。整数转换是在乘以100后完成的,因此在任何情况下,美分都会被保留,然后再转换回十进制形式并取整。这样就可以考虑小数点,因为它是为了回文检查而删除的,而为了显示而重新添加的。is_回文现在看起来是这样的:def is_回文:num_str=strintnum num_str_len=lennum_str,用于rangenum_str len中的i:
如果数量[i]!=num_str[num_str_len-i-1]:返回False返回TrueYes,因为浮点总是有一个小数位。123.45 * 100.0 = 12345.0. 这就是为什么强制转换为int可以解决这个问题。或者,您可以删除字符串中的小数点。但是,我仍然认为你的逻辑是错误的。你把报税表缩进真的了吗?我无法从您的内联代码示例中判断。具有偶数位数的数字(如123456)在以前的代码中永远不会返回True。具有奇数位数的数字最终将始终返回True,因为中心数字将始终与其自身匹配。return True的缩进长度不会超过for,因此它位于if语句之外。当num_str[i]=num_str[num_str_len-i-1]时返回True。数字数量的奇偶性对于is_回文返回真还是假并不重要,因为它与数字数量无关;它只是检查条件是否满足。请记住,原始金额改变了小数点后的位置,所以我们交易的是数百便士,而不是一美元。在我所知道的所有情况下,都要亲自查看,并对其进行彻底测试。