当前位置:嗨网首页>书籍在线阅读

09-项目_乘法测验

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.3 项目:乘法测验

PyInputPlus 的功能对于创建定时的乘法测验很有用。通过为 pyip.inputStr() 设置 allowRegexesblockRegexestimeoutlimit 关键字参数,你可以用PyInputPlus实现大部分功能。你需要编写的代码越少,编写程序的速度就越快。让我们创建一个程序,向用户提出10个乘法问题,其中有效的输入是问题的正确答案。打开一个新的文件编辑器窗口,然后将文件另存为multiplicationQuiz.py。

首先,导入 pyinputplusrandomtime 。我们将利用变量 numberOfQuestionscorrectAnswers ,跟踪程序问了多少个问题以及用户给出了多少正确答案。 for 循环将反复产生10个随机乘法问题:

import pyinputplus as pyip 
import random, time
numberOfQuestions = 10
correctAnswers = 0
for questionNumber in range(numberOfQuestions):

for 循环内,程序将选择两个个位数相乘。我们将使用这些数字,为用户创建一个 #QN×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 块可以跟随 ifelif 块一样,它们可以有选择地跟随上一个 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具有足够的灵活性,你可以在需要用户使用键盘输入的各种程序中使用它,如本章中的程序所示。