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具有足够的灵活性,你可以在需要用户使用键盘输入的各种程序中使用它,如本章中的程序所示。