日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python输入print跳到documentation-习题 48: 更复杂的用户输入

發布時間:2023/12/2 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python输入print跳到documentation-习题 48: 更复杂的用户输入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

習題 48: 更復雜的用戶輸入?

你的游戲可能一路跑得很爽,不過你處理用戶輸入的方式肯定讓你不勝其煩了。每一個房間都需要一套自己的語句,而且只有用戶完全輸入正確后才能執行。你需要一個設備,它可以允許用戶以各種方式輸入語匯。例如下面的機種表述都應該被支持才對:

open door

open the door

go THROUGH the door

punch bear

Punch The Bear in the FACE

也就是說,如果用戶的輸入和常用英語很接近也應該是可以的,而你的游戲要識別出它們的意思。為了達到這個目的,我們將寫一個模組專門做這件事情。這個模組里邊會有若干個類,它們互相配合,接受用戶輸入,并且將用戶輸入轉換成你的游戲可以識別的命令。

英語的簡單格式是這個樣子的:

單詞由空格隔開。

句子由單詞組成。

語法控制句子的含義。

所以最好的開始方式是先搞定如何得到用戶輸入的詞匯,并且判斷出它們是什么。

我們的游戲語匯?

我在游戲里創建了下面這些語匯:

表示方向: 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()

目前做到這樣就可以了,不過這招在相當一段時間內都不會有問題。

語匯元組?

一旦我們知道了如何將句子轉化成詞匯列表,剩下的就是逐一檢查這些詞匯,看它們是什么類型。為了達到這個目的,我們將用到一個非常好使的 Python 數據結構,叫做”元組(tuple)”。元組其實就是一個不能修改的列表。創建它的方法和創建列表差不多,成員之間需要用逗號隔開,不過方括號要換成圓括號 () :

first_word = ("direction", "north")

second_word = ("verb", "go")

sentence = [first_word, second_word]

這樣我們就創建了一個 (TYPE, WORD) 組,讓你識別出單詞,并且對它執行指令。

這只是一個例子,不過最后做出來的樣子也差不多。你接受用戶輸入,用 split

將其分隔成單詞列表,然后分析這些單詞,識別它們的類型,最后重新組成一個句子。

掃描輸入?

現在你要寫的是詞匯掃描器。這個掃描器會將用戶的輸入字符串當做參數,然后返回由多個 (TOKEN, WORD) 組成的一個列表,這個列表實現類似句子的功能。如果一個單詞不在預定的詞匯表中,那它返回時 WORD 應該還在,但 TOKEN 應該設置成一個專門的錯誤標記。這個錯誤標記將告訴用戶哪里出錯了。

有趣的地方來了。我不會告訴你這些該怎樣做,但我會寫一個“單元測試(unit test)”,而你要把掃描器寫出來,并保證單元測試能夠正常通過。

“異常”和數字?

有一件小事情我會先幫幫你,那就是數字轉換。為了做到這一點,我們會作一點弊,使用“異常(exceptions)”來做。“異常”指的是你運行某個函數時得到的錯誤。你的函數在碰到錯誤時,就會“提出(raise)”一個“異常”,然后你就要去處理(handle)這個異常。假如你在Python 里寫了這些東西:

~/projects/simplegame $ python

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)

[GCC 4.4.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>int("hell")

Traceback (most recent call last):

File "", line 1, in

ValueError: invalid literal for int() with base 10: "hell"

>>

這個 ValueError 就是 int() 函數拋出的一個異常。因為你給 int() 的參數不是一個數字。 int() 函數其實也可以返回一個值來告訴你它碰到了錯誤,不過由于它只能返回整數值,所以很難做到這一點。它不能返回 -1,因為這也是一個數字。

int() 沒有糾結在它“究竟應該返回什么”上面,而是提出了一個叫做 ValueError

的異常,然后你只要處理這個異常就可以了。

處理異常的方法是使用 try 和 except 這兩個關鍵字:

def convert_number(s):

try:

return int(s)

except ValueError:

return None

你把要試著運行的代碼放到 try 的區段里,再將出錯后要運行的代碼放到 except

區段里。在這里,我們要試著調用 int() 去處理某個可能是數字的東西,如果中間出了錯,我們就抓到這個錯誤,然后返回 None。

在你寫的掃描器里面,你應該使用這個函數來測試某個東西是不是數字。做完這個檢查,你就可以聲明這個單詞是一個錯誤單詞了。

你應該測試的東西?

這里是你應該使用的測試文件 tests/lexicon_tests.py :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46from nose.tools import *

from ex48 import lexicon

def test_directions():

assert_equal(lexicon.scan("north"), [("direction", "north")])

result = lexicon.scan("north south east")

assert_equal(result, [("direction", "north"),

("direction", "south"),

("direction", "east")])

def test_verbs():

assert_equal(lexicon.scan("go"), [("verb", "go")])

result = lexicon.scan("go kill eat")

assert_equal(result, [("verb", "go"),

("verb", "kill"),

("verb", "eat")])

def test_stops():

assert_equal(lexicon.scan("the"), [("stop", "the")])

result = lexicon.scan("the in of")

assert_equal(result, [("stop", "the"),

("stop", "in"),

("stop", "of")])

def test_nouns():

assert_equal(lexicon.scan("bear"), [("noun", "bear")])

result = lexicon.scan("bear princess")

assert_equal(result, [("noun", "bear"),

("noun", "princess")])

def test_numbers():

assert_equal(lexicon.scan("1234"), [("number", 1234)])

result = lexicon.scan("3 91234")

assert_equal(result, [("number", 3),

("number", 91234)])

def test_errors():

assert_equal(lexicon.scan("ASDFADFASDF"), [("error", "ASDFADFASDF")])

result = lexicon.scan("bear IAS princess")

assert_equal(result, [("noun", "bear"),

("error", "IAS"),

("noun", "princess")])

記住你要使用你的項目骨架來創建新項目,將這個測試用例寫下來(不許復制粘貼!),然后編寫你的掃描器,直至所有的測試都能通過。注意細節并確認結果一切工作良好。

設計的技巧?

集中一次實現一個測試項目,盡量保持項目簡單,只要把你的 lexicon.py 詞匯表中所有的單詞放那里就可以了。不要修改輸入的單詞表,不過你需要創建自己的新列表,里邊包含你的語匯元組。另外,記得使用 in 關鍵字來檢查這些語匯列表,以確認某個單詞是否在你的語匯表中。

加分習題?

改進單元測試,讓它覆蓋到更多的語匯。

向語匯列表添加更多的語匯,并且更新單元測試代碼。

讓你的掃描器能夠識別任意大小寫的詞匯。更新你的單元測試以確認其功能。

找出另外一種轉換為數字的方法。

我的解決方案用了 37 行代碼,你的是更長還是更短呢?

總結

以上是生活随笔為你收集整理的python输入print跳到documentation-习题 48: 更复杂的用户输入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91av欧美| 伊人网在线播放 | 欧美整片第一页 | 91国内精品视频 | jizz18国产| www.性欧美 | 欧美乱色| 高h喷汁呻吟3p | 91入囗 | 最近中文在线观看 | 五月av综合av国产av | 欧美精品免费在线观看 | 婷婷啪啪| 国产一区二区免费视频 | 免费观看黄色的网站 | 三级黄色小视频 | 91视频精选| 亚洲第五页 | 激情欧美一区二区 | 99国产精品一区二区 | 操女网站 | 午夜精品久久久久久久99热浪潮 | www.youjizz.com视频 | 无遮挡在线观看 | 亚洲av无码片一区二区三区 | 懂色av蜜臀av粉嫩av分 | 极品超粉嫩尤物69xx | 香蕉黄视频 | 爱情岛亚洲首页论坛小巨 | 胖女人做爰全过程 | 国产伦精品一区二区三区88av | 亚洲自拍偷拍精品 | 久久国产精品精品国产色婷婷 | 欧美一级淫片bbb一84 | 捆绑无遮挡打光屁股 | 哪里可以看毛片 | 男人天堂综合网 | 免费高清黄色 | 久久久久久久亚洲精品 | 欧美福利视频导航 | 91黄在线看 | 亚洲人人爱| 成年人免费视频观看 | 亚洲精品视频在线观看免费 | 国产一区二区在线免费观看视频 | 在线免费观看高清视频 | 麻豆国产一区二区三区四区 | 噜噜噜久久久 | 性久久久久 | 国产欧美日韩精品在线观看 | 91在线观看欧美日韩 | 国产精品国产精品国产专区不卡 | 麻豆精品久久久久久久99蜜桃 | 91视频 - 88av | 天天躁日日躁狠狠很躁 | 快色视频在线观看 | 少妇又紧又色又爽又刺激 | 欧美久操 | 国产精品一二三区 | 春色导航 | 求欧美精品网址 | 夜夜躁狠狠躁 | 极品国产91在线网站 | 黄色在线视频网址 | 中文字幕丰满孑伦无码专区 | 一区二区三区视频在线观看 | 69精品一区二区 | 人妖ts福利视频一二三区 | 亚洲天堂h| 成人免费高清在线观看 | 欧美精品成人 | 小妹色播影院 | 国产精品无码999 | 国产一级视频免费观看 | 4444亚洲人成无码网在线观看 | 免费污污视频在线观看 | 黄色中文视频 | 国产福利一区二区视频 | 国产精品久久久久久久久借妻 | 丰满少妇在线观看资源站 | 欧美大片免费高清观看 | 日本黄色电影网址 | 看黄色一级 | 森泽佳奈在线播放 | 好吊色一区二区 | 成人欧美一区 | 国产一区二区三区精品在线观看 | www.天天干.com| 精品嫩模一区二区三区 | 亚洲一区二区三区四区五区午夜 | 日韩天天干 | 日本丰满bbwbbw厨房 | 丁香花电影免费播放在线观看 | 综合网亚洲 | 一区二区导航 | 日本欧美国产 | 亚洲精品视频一区二区 | 亚洲精品久久久久av无码 | 国产伦子伦对白视频 |