我是python和编码的新手。我有一个问题,我不认为它正确地使用了操作员。我想知道是否有人可以提供帮助。
index.html
答案 0 :(得分:2)
问题在于以下两行:
q3 = input("Answer: ")
correctAnswer = (q3a,q3operator,q3b)
q3
获取一个字符串。 correctAnswer
获得tuple of strings。当你比较两者时,他们显然永远不会是平等的。
解决此问题的最简单方法是将行更改为以下内容:
q3 = int(raw_input("Answer: ")) # guarantee q3 is treated as an integer
correctAnswer = eval(str(q3a)+q3operator+str(q3b)) # eval treats a string as Python command
这应该可以解决您的问题。
eval
将字符串转换为Python表达式并对其进行求值 - 类似“5 + 3”的内容将转换为实际表达式5 + 3并进行评估,得到8。
我必须将q3a
和q3b
转换为字符串,以便我可以使用eval
- 因此我使用了str(q3a)
和str(q3b)
。< / p>
请注意,raw_input
仅适用于Python 2.7 - input
是在Python 3中使用的正确选项。
eval
如果你无法控制你传递给它的东西也有潜在的危险 - 在这种情况下它很好,但是你必须使用它的事实表明可能有更好的方法来编写这个程序。 :)
编写优秀程序的关键是为它们使用正确的语言结构。
在这种情况下,您可以通过使用两个非常强大的Python功能来改进代码:dictionaries和lambda functions。我会留下你花一些时间阅读他们的所作所为。
以下是一个示例,说明您的程序在这些改进后的样子(为了保持简单,假设您只需要简单的加法和减法问题):
functions = {"plus": lambda x, y : x + y, "minus": lambda x, y: x - y}
operation = random.choice(functions.keys())
a,b = random.randint(1,10), random.randint(1,10)
answer = int(raw_input("What is {0} {1} {2}?".format(a,operation,b))
print("Correct!" if answer == functions[operation](a,b) else "Wrong!")
注意它更短,更清洁,更容易。您可以向functions
添加任意函数,并保证程序的其余部分完美运行。
道德:使用正确的工具来做正确的工作。
答案 1 :(得分:1)
以下是问题的previous solution,包括如何将此问题转化为有多个问题的测验!
在您的示例中,您可以轻松使用python的operator
模块。将q3operator = "+"
替换为q3operator = operator.add
,依此类推(请参阅previous solution)。最后,correctAnswer = (q3a,q3operator,q3b)
变为correctAnswer = q3operator(q3a,q3b)
。
请记住代码顶部的import operator
!
您还需要在某个时候设置score = 0
(在尝试在score = int(score + 1)
的右侧使用它之前。