Tip:
Highlight text to annotate it
X
让我们以时速88英里的速度回到有限状态机的内容上
这是一个有限状态机,对应的正则表达式是“a+1+”
让我们通过跟踪输入aa1,来验证下这个有限状态机
我们从开始状态开始,还看不到任何东西
我们看到a,来到状态2
再看到a,自循环回到状态2。接着是1,来到状态3
噢!状态3是接受状态,啊!!
令人惊奇的是,这个叫做“用手指跟踪”的超高科技的方法
实际上非常像计算机在内部检查字符串
是否匹配正则表达式或者评估有限状态机
你真的只需要跟踪你在输入的位置和你的状态
其他都不用了
让我们一起来实践下
我们将用Python写一个计算机程序来检查一个有限状态机
是否接受一个字符串
如果我将aa1作为这个有限状态机的输入时
它应该说,正确
如果替换成aa1b,它应该说错误,因为那个字符串不被接受的
但是首要的设计方案是,我们如何表示这个有限状态机?
到目前为止,我们知道了如何给一个Python程序传递一个数字,或者一个字符串,或者一个列表
但是我怎样传递一张图呢?
好的,大概对于状态1,2,3来说,我可以只传递一个状态列表
就是这些边界和这些指向某处的箭头
那是真正需要关心的
从一条边界看,我们真想要知道的是,如果我们在状态1,下一个输入是a
我要到哪里去?
让我们使用Python里的字典或者映射来来实现
我将声明一个叫做edges的Python字典或映射
我只需要将我当前的状态和输入的字母传递进去
最后它将给我新的状态
可在我们深入学习之前,让我们来稍微学习下映射,还有元组
在之前的CS课程里,你可能已经见过它们
但是如果你没有的话,我马上就会说到
在Python里,你要用左大括号和右大括号来
声明一个新的映射或者字典
映射的目的是将一件东西关联到另一件东西上
例如,这里我写了一个映射,它将帮助我记录世界上哪些东西是
花朵,因为我可能很容易就忘记这个重要的知识
我可以更新我的映射,只要说,噢,在isflower字典里,“rose”应该要映射为true
但是'dog'不属于花朵,那么它应该映射为false
那么如果以后我要查找它,isflower字典里的'rose'会返回true
还有另一种方法来声明一个映射
在你用来声明一个新映射的花括号里,你只要将要绑定的内容放进去
'rose'映射为true,然后是冒号,‘Dog’映射为false
在中间有个冒号
现在你可能在思考,名字里是什么?
在这个单词里,'rose'真的很重要,或者说'rose'能用其他名字来替代使用吗?
好吧,我们可能会说同义词,但是Python不会
所以如果我尝试使用isflower[juliet],它没有在这个映射里定义
我们将会得到key error,找不到元素的异常
对Python字典来说,你需要把名字写正确
字典和映射是同义词,它们指的是同一样东西
Python元组是不可改变的列表
不可改变意味着你不能改变它的内容
一旦你声明了它,它就如蚀刻在石头上那样不可改变
例如,我可以声明一个元组来放一些对象的笛卡尔坐标值
可能在网格上我的点在(1,5)
我可以用访问列表的方法来访问它的元素
该点的0th部分是1,1th部分是5
虽然笛卡尔值可能不是很让人兴奋
但是你们中很多人都用过GPS坐标值或者经纬度
来进行导航和长途旅行
泰姬陵是在印度的联合国教科文组织指定的世界级遗址
这些是它实际的GPS坐标值,去看看!