python - python如何处理无法访问的代码烧瓶
问题描述
我正在构建一个网络应用程序。我的代码在 return 语句后停止。事后如何保持代码运行?除了烧瓶我还需要别的东西吗?谢谢!
这是我的 HTML 代码
<!DOCTYPE html>
<html>
<head>
<title>THE QUIZ</title>
</head>
<body>
<h1>QUIZ GAME</h1>
<p>
Welcome
</p>
<h2>Would you like to play</h2>
<form action="/play" method="POST">
Enter your answer: <input type="text" name="answers">
<input type="submit" value="submit">
</form>
</body>
</html>
这是我的python代码
@app.route("/")
def main():
return render_template('app.html')
if request.method == 'POST':
answers = request.form.get('answers')
random.shuffle(questions.qa)
response = quiz(qa, user1, answers)
#this function asks the questions and stores them
return render_template('app.html') + response
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8080, debug=True)
这是我遇到问题的地方。这是第二个功能。一旦我遍历列表并返回列表中的数据,return 语句下面的代码就变得无法访问,并且程序停止执行它应该做的事情。如何从列表中返回数据并让代码继续使用 if 语句。我已经搜索过,但不明白我发现的结果,因为它们更复杂,而且我是使用烧瓶的新手。
def quiz(qa, user, ans):
for rand_q in qa:
return rand_q['question']
if 'yes' in ans:
user.append('yes')
return rand_q.get(ans, '') #this gets 2nd part of question
我的 if 语句变得无法访问,因此无法从 dict 列表中返回第二组值
这是我修改后的代码,但我仍然坚持在客户输入后返回列表字典的第二部分。
def play():
qa = questions.qa #list of dict with questions
user1, user2 = [], [] #containers for each player's answers
if request.method == 'POST':
answers = request.form.get('answers')
random.shuffle(questions.qa)
response = quiz(qa, user1)
return response
def quiz(qa, user):
for rand_q in qa:
i = rand_q['question']
i2 = check_answer(i, user)
#print(rand_q["question"])
return i2
@app.route("/", methods = ['POST', 'GET'])
def check_answer(ans, user):
if request.method == 'POST':
answers = request.form.get('answers')
if 'yes' in answers:
user.append('yes')
i3 = ans.get(answers, '')
return i3 #this should send 2nd part of question/rand_q
解决方案
与几乎任何其他编程语言一样,Python 允许您按顺序执行命令。在操作系统内部,python 创建的程序称为进程。命令执行 A 然后 B 然后 C 等等。当然,有一些命令可以让您选择命令的流程:如果 A 则 B 否则 C。但仍有一系列命令按顺序执行。
现在该return
语句在 python 中做了什么?执行一个函数意味着该函数是从其他一些代码中调用的。然后执行函数的代码,然后执行其他代码中的下一个命令,即在函数调用之后。我们怎么知道这是函数的结束?这是return
声明。该函数只能返回一个变量。一旦你已经设置了返回变量,就不需要等待所有其他代码,因为函数的返回不会改变。所以函数结束并返回你在return
语句中的内容。
有不同的方法可以绕过这个过程,这取决于你想要什么:
1.你要返回多个东西,结果的处理可以等到你计算完所有的结果。在这种情况下,使用 atuple
或 alist
从函数返回。例如:
res = []
res.append(res1)
res.append(res2)
return res
2.您希望在结果之一可用时立即返回它并开始并行处理它以执行随后的代码。
在这种情况下,您处于并行编程领域。您需要一种在不同并行进程/线程之间进行通信的方法。例如,您可以使用队列:
import queue
q = queue.Queue()
def quiz(qa, user, ans, q):
q.put(res1)
q.put(res2)
def worker(q):
while True:
item = q.get()
print(f'Working on {item}')
# turn-on the worker thread
threading.Thread(target=worker, args=(q,)).start()
在这种情况下,您不需要使用 return 并且一个单独的线程正在处理队列中的项目。
当我更详细地查看您的问题时,您似乎希望ans
在执行第一次返回后获得一个。这是不可能的,因为在函数内部,您无法从外部代码接收任何附加信息,因为外部代码没有被执行(并行编程除外)。你真正需要的是有两个功能。一个选择问题,另一个检查答案:
def quiz(qa, user):
return question
def check_answer(user, ans):
if ans == 'yes':
user.append('yes')
return second_part_of_question
程序的流程应该是:
- 向用户发送问题
- 从用户那里得到答案
- 根据答案发送附加信息
您的代码很少分享有关您如何在 Flask 中执行此操作的信息,因此我将仅使用带有控制台 python 应用程序的示例:
question1 = quiz(qa, user)
print(question1)
ans = input()
question2 = check_answer(user, ans)
print(question2)
Flask 中的逻辑是一样的,只是实现方式不同。
推荐阅读
- gradle - 迁移到 jdk11,gradle 多项目构建问题:-source8 中不支持模块
- playframework-2.6 - 由于为 ActorSystem[play-dev-mode] java.lang.StackOverflowError 启用了“akka.jvm-exit-on-fatal-error”,Akka 关闭 JVM 时出错
- function - 结构嵌入、函数输入、多态性
- firebase - 如何使用 Nodemcu 将数据上传到 Firebase?
- ios - 如何在音频停止快速播放后自动更改按钮的背景图像?
- angular - 如果数字大于我分配的某个值,则显示“99+”
- python - 在python3的列表理解中使用if、elif和else
- java - 关于Spring框架中@Lazy注解的问题
- powershell - 将 System.Object 加载到 DataGrid 中
- c++ - 如何将 gmock 函数分配给特定的函数指针?