0

我正在尝试制作一个分支预测器:

这是我在 app.py 中的代码:

import web
urls = (
'/hello','index'
)

app = web.application(urls,globals())

render = web.template.render('templates/', base='layout')

class index(object):
    def GET(self):
        return render.hello_form()

    def POST(self):
        form=web.input(name='nobody', rank=0)
        branch=None
        if form.rank<=4613:
            branch = 'COE, ECE,IT,ICE,MPAE,BT'
        if int(form.rank)<=7471 & int(form.rank)>4613:
            branch='ECE,IT,ICE,MPAE,BT'
        if int(form.rank)<=11325 & int(form.rank)>7471:
            branch = 'IT,ICE,MPAE,BT'
        if int(form.rank)<=16565 & int(form.rank)>11325:
            branch='ICE,MPAE,BT'
        if int(form.rank)<=17955 & int(form.rank)>16565:
            branch='MPAE,BT'
        if int(form.rank)<=20714 & int(form.rank)<17955:
            branch='BT'
        return render.index(branch=branch) 

if __name__=='__main__':
    app.run()

这是我的 html 文件 hello_form.html 中的代码

<h1>NSIt Branch Predictor for First Round</h1>
<form action='hello' method ='POST'>
Your Name: <input type = 'text' name = 'name'>
<br>
AIEEE Rank: <input type = 'text' name ='rank'>
<input type='submit'>

这是我在 index.html 中的代码:

$def with (branch)
branch: $branch

我有 layout.html 如下:

$def with (content)
<html>
<head>
<title> first python website</title>
</head>
<body>
$:content
</body>
</html>

但在输出中我得到:

branch:
4

1 回答 1

2

我从未使用过您正在使用的应用程序框架,但是您的POST方法存在很多问题。这是它应该看起来的样子。然后我将讨论这些问题和一些替代解决方案。

def POST(self):
    form = web.input(name='nobody', rank='0')
    rank = int(form.rank)
    if rank <= 4613:
        branch = 'COE, ECE,IT,ICE,MPAE,BT'
    elif rank <= 7471:
        branch = 'ECE,IT,ICE,MPAE,BT'
    elif rank <= 11325:
        branch = 'IT,ICE,MPAE,BT'
    elif rank <= 16565:
        branch = 'ICE,MPAE,BT'
    elif rank <= 17955:
        branch = 'MPAE,BT'
    elif rank <= 20714:
        branch = 'BT'
    else:
        branch = None
    return render.index(branch=branch) 

第一个问题是您的第一次比较是在字符串和整数之间进行的:if form.rank<=4613。那应该是if int(form.rank)<=4613。比较字符串和数字很少能达到您的预期。

>>> rank = '4613'
>>> rank <= 4613
False
>>> rank > sys.maxint
True

接下来,您使用的是按位和运算符&而不是布尔and运算符。例如,int(form.rank)<=7471 & int(form.rank)>4613应该是int(form.rank)<=7471 and int(form.rank)>4613

您可以通过使用运算符链接而不是这些and东西来改进这一点:

if rank <= 4613:
    branch = 'COE, ECE,IT,ICE,MPAE,BT'
if 4613 < rank <= 7471:
    branch = 'ECE,IT,ICE,MPAE,BT'
if 7471 < rank <= 11325:
    branch = 'IT,ICE,MPAE,BT'

最终,除非您想使用某种基于区间的数据结构,否则最好将您所拥有的内容表示为ifand语句链。elif对于这么简单的事情,这些if语句可以正常工作。

快乐的 Pythoning!

于 2012-06-23T12:12:33.033 回答