习题48 更复杂的用户输入

这篇博客探讨了如何编写一个扫描器,接受用户的输入并解析其含义。作者介绍了如何使用Python的元组处理句子,以及如何处理不在预定义词汇表中的单词。文章提到了异常处理,特别是处理数字转换时可能出现的错误,并引入了测试驱动开发的策略,通过编写测试用例来指导代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面的各种文字小游戏要求用户必须一字不差输入命令,才能正确执行。

但是我们希望允许用户多样化地输入,比如简写、大小写之类的。

所以最好的开始方式是先搞定如何得到用户输入的单词并且判断出这是干什么的。



我们的游戏语汇

我在游戏里创建了如下单词的语汇表:

  • 方向词: north, south, east, west, down, up, left, right, back
  • 动词: go, stop, kill, eat
  • 修饰词: the, in, of, from, at, it
  • 名词: door, bear, princess, cabinet
  • 数字: 0到9构成的数字
断句

我们已经有了单词的语汇表,为了分析句子的意思,要找到一种断句的方法。我们对于句子的定义是:空格隔开的单词。

所以有:

stuff = raw_input('> ')
words = stuff.split()
目前就够了,其中 stuff.split() 中的 split() 函数意思是“通过指定分隔符给字符串切片”,这里分隔符就是空格。


语汇元组

一旦我们知道了如何把句子断为单词,剩下的就是逐一检查这些单词,看它们是什么类型的。

这里,我们要用到一种Python的数据结构,叫做“元组”(tuple)。

元组就是一个不能修改的列表。创建它的方法和创建列表差不多,成员之间需要用逗号隔开,不过方括号要换成圆括号 ()  。

first_word = ('direction', 'north')
second_word = ('verb', 'go')
sentence = [first_word,second_word]
这样就创建了一个 (TYPE, WORD) 组,让你识别出单词,并且对其执行指令。

简要地说,就是接收用户输入(句子),然后 用 split() 分割成单词,然后分析识别,最后重新组成句子。


扫描输入

        现在要写的是扫描器,这里 Zed 没有给出代码,而是要自己写出来。

        这个扫描器会将用户输入的字符串当做参数,然后返回由多个 (TOKEN, WORD) 组成的一个列表,这个列表实现类似句子的功能。如果一个单词不在预定的单词语汇表中,那它返回时 WORD 应该还在,但 TOKEN 应该设置成一个专门的错误标记。这个标记告诉用户哪里出错了。



异常和数字

Zed 这里要帮助我做一个数字转换。这里要使用“异常”(exception)来做。“异常”是运行某个函数时候得到的错误。

函数在遇到错误的时候,就会“引发”(raise)一个“异常”,然后你就要去“处理”(handle)这个异常。

例如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值