09-项目_乘法测验
8.3 项目:乘法测验
PyInputPlus
的功能对于创建定时的乘法测验很有用。通过为 pyip.inputStr()
设置 allowRegexes
、 blockRegexes
、 timeout
和 limit
关键字参数,你可以用PyInputPlus实现大部分功能。你需要编写的代码越少,编写程序的速度就越快。让我们创建一个程序,向用户提出10个乘法问题,其中有效的输入是问题的正确答案。打开一个新的文件编辑器窗口,然后将文件另存为multiplicationQuiz.py。
首先,导入 pyinputplus
、 random
和 time
。我们将利用变量 numberOfQuestions
和 correctAnswers
,跟踪程序问了多少个问题以及用户给出了多少正确答案。 for
循环将反复产生10个随机乘法问题:
import pyinputplus as pyip
import random, time
numberOfQuestions = 10
correctAnswers = 0
for questionNumber in range(numberOfQuestions):
在 for
循环内,程序将选择两个个位数相乘。我们将使用这些数字,为用户创建一个 #Q
: N×N =
提示,其中 Q
是问题编号(1~10), N
是要相乘的两个数字:
# Pick two random numbers:
num1 = random.randint(0, 9)
num2 = random.randint(0, 9)
prompt = '#%s: %s x %s = ' % (questionNumber, num1, num2)
pyip.inputStr()
函数将实现这个测验程序的大多数功能。我们传入的 allowRegexes
参数是一个列表,包含正则表达式字符串 '^%s $'
,其中 %s
被替换为正确的答案。 ^
和 $
字符可确保答案以正确的数字开始和结束,尽管 PyInputPlus
会从用户响应的开始和结束处消除所有空格,以防他们无意间按了空格键。我们传入的 blocklistRegexes
参数是一个列表,包含 ('.*', 'Incorrect!')
。元组中的第一个字符串是与每个可能的字符串匹配的正则表达式。因此,如果用户的回答与正确答案不符,该程序将拒绝他们提供的答案。在这种情况下,将显示字符串 'Incorrect!'
,并提示用户再次回答。另外,传入8作为 timeout
、3作为 limit
,将确保用户只有8秒和3次机会来提供正确答案:
try:
# Right answers are handled by allowRegexes.
# Wrong answers are handled by blockRegexes, with a custom message.
pyip.inputStr(prompt, allowRegexes=['^%s$' % (num1 * num2)],
blockRegexes=[('.*', 'Incorrect!')],
timeout=8, limit=3)
如果用户在8秒后回答,即使回答正确, pyip.inputStr()
也会引发 TimeoutException
异常。如果用户错误地回答了3次以上,则会引发 RetryLimitException
异常。这两种异常类型都在 PyInputPlus
模块中,因此需要在它们前面添加 pyip
.:
except pyip.TimeoutException:
print('Out of time!')
except pyip.RetryLimitException:
print('Out of tries!')
请记住,就像 else
块可以跟随 if
或 elif
块一样,它们可以有选择地跟随上一个 except
块。如果 try
块中没有引发异常,则后面的 else
块中的代码将运行。在我们的例子中,这意味着如果用户输入正确的答案,代码就会运行:
else:
# This block runs if no exceptions were raised in the try block.
print('Correct!')
correctAnswers += 1
无论显示“Out of time!”“Out of try!”或“Correct!”这3个消息中的哪一个,我们都在 for
循环的末尾放置1秒的暂停时间,以使用户有时间阅读消息。在程序问了10个问题并且for循环完成之后,向用户展示他们提供了多少正确答案:
time.sleep(1) # Brief pause to let user see the result.
print('Score: %s / %s' % (correctAnswers, numberOfQuestions))
PyInputPlus具有足够的灵活性,你可以在需要用户使用键盘输入的各种程序中使用它,如本章中的程序所示。