为什么这个程序挂起?Google应用引擎和Python

2024-10-04 03:26:28 发布

您现在位置:Python中文网/ 问答频道 /正文

当数据通过web表单输入时,这个程序应该计算一个数字回文。它只使用python和网页.py框架。但从那以后,我使用webapp2框架将它移植到googleappengine,以便在公共服务器上启动它。当我为这个新框架重构代码时,处理计算的代码行中出现了一些问题。希望有人能帮忙解决这个问题。你知道吗

下面是处理从浏览器获取输入的类。我已经测试过了,它似乎得到了很好的输入。然后它把它发送到compute_palintip,这应该是解决回文(最终数量)。它挂在这里。你知道吗

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

注意事项:

  • 我必须将输入转换成float,以便将它们发送到compute_palintip函数。你知道吗
  • 无法转换为整数,因为它们不允许小数点(与餐厅美元金额相关的这些输入需要美分)。你知道吗
  • 我还必须使用float类型,我很确定,因为字符串和int都不能与同样是float的公式一起操作。Python同样想要它们。你知道吗
  • 然而,由于float和int混合在一起,所以现在的数学似乎有点不稳定,而且它并没有终止。你知道吗

数学是一个同事写的,而我写的是UI类型的东西,这就是为什么我现在不能真正调试它,所以我希望其他人能找到一个我没有看到的解决方案。谢谢。你知道吗


Tags: 代码form框架lenfloatamountnumfinal
3条回答

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

顺便说一句,这段代码的原型应用程序已经在http://third-fire-595.appspot.com/上启动并运行,任何有兴趣使用它的人都可以使用。请随时测试出一些组合,让我知道任何反馈。你知道吗

你输入的数字是多少?有些情况下is_palindrome永远不会返回True。e、 g.1234567890。它将遍历整个字符串,并为每个测试返回False。你知道吗

也许您可以设置一些日志来查看程序的流程。在处理浮点数时,在算术上保持一致,并在每个数字后使用小数: orig_dollar_amount*100.0final_amount/100.0final_amount += 1.0actual_tip_percent*100.0/orig_dollar_amount

此外,您未能将orig_dollar_amount强制转换为浮点

相关问题 更多 >