学习Python3:20171031
簡介
本次作業繼承于上一次的交互問題(用戶屏幕輸入輸出),額外內容為文件在硬盤上的讀取與存儲.是為了之后的簡易版本的自然語言處理任務做鋪墊.
題目
""" 本次的問題很簡單,文件讀取,與,簡單的人機交互,以及異常處理答題程序特殊要求,問題一共十個,問題和回答都需要存儲到硬盤中(最起碼保留一次),并可以計算分數.提示:open操作 + 自定義解析器,或者使用numpy,或者pandas的保存功能.交卷時間:2017/10/31/ 10:50問題分析:我們可以問題分解將原問題簡單化首先是原問題可分解為硬盤讀入內存,程序人機交互,內存寫入硬盤.那么問題也就分解為了 人機交互部分 與 硬盤讀取寫入操作 """問題分解
這次與之前的內容不同之處就在于,我們這一次將開發一個完整的程序.相信對于大一的萌新的這恐怕是第一次.
那么在這個問題中,你們首先會面對什么問題呢?首先是問題的復雜性,第一眼看上去這確實是一個復雜的程序.那么面對復雜的程序我們應該怎么辦呢?
我們應該做的就是將復雜問題簡單化,復雜問題簡單化一般有兩種常用措施:第一,問題分解,將復雜性問題分解為數個簡單問題,第二,問題轉化,將復雜問題轉化為簡單問題.對于這個工程而言,第二種方法是難以實現的,很難從問題轉化的角度進行復雜問題簡單化.我們首先應該考慮的是第一個方案,問題拆分.
分解問題
這個問題如何分解,首先從技術角度來看,我們之前已經使用過簡單的人機交互x = input("請在屏幕上輸入文字"),在昨天的試卷答案中,我們已經給出了該語法,將屏幕輸入的文字存儲為字符串變量.
那么也就是說,我們已經可以獲取用戶輸入的字符串變量,并存儲在內存中.然后這個時候我們可以考慮其他我們沒有編寫過得部分,第一計算分數,第二存儲到硬盤.
第一個計算分數,我們要做的是用戶的回答是否與我們的答案一致,那么在我們常接觸的試卷中?有什么問題是可以利用我們已有的知識直接進行處理的呢?那肯定是有標準答案的判斷題,選擇題,以及答案唯一的填空題.此處我選擇填空題兩個,選擇題一個編寫示例程序
第二個是硬盤存儲,提示關鍵詞是 open() ,既然給了關鍵詞只需要直接百度 python open 即可,很多教程寫的非常清楚.亦或者是登陸我之前給說的python網站去查找相應api.對應部分為python3 file文件操作.
編程
獲取用戶輸入,并將其存儲到list中,當然用十個變量也可以
# # 首先是最簡單的人機交互 # # 問題既可以使用十個變量進行存儲也可以使用list進行存儲. question = ["問題一", "問題二"] answer = input(question[0] + '\n') # # 同樣,我們也可以使用list存儲答案answer_list = []answer_list.append(answer)不過還有更好的實現方式for循環,順便以同樣的方式打印出來,檢查一下
# 更好的代碼實現方式for i in question: answer_list.append(input(i + "\n"))# 打印問題與答案,進行人工檢查 for i in range(len(question)): print(question[i], '\n', answer_list[i], '\n')計算分數的問題
# 計算分數的問題,需要問題與答案有一定的格式# 比如 question = ["1+1 = ?", "2+2 =?", "下列最大的水果是:1,西瓜,2,蘋果"] key1 = ["2", "4", "1"] key1_test = [2, "4", "1"] key2 = [2, 4, "1"]# 要注意鏈表中每個元素的數據類型,不同的數據類型除了布爾類型判斷時可以進行自動轉換外,其他變量并沒有該功能 #所以對于計算題而言,必須將input方法返回的str變量轉化為與答案一致的變量類型才行. #當然反之依然,我們需要的僅僅是讓他們的類型一致,以便進行判斷.# 轉化代碼如下: for i in question: answer_list.append(int(input(i + "\n")))# 此時我們就可以改卷子了,使用for循環進行判斷,順便封裝以便調用 def GetScore(key, answer):Score = 0for i in range(len(key)):if int(key[i]) == int(answer[i]): # 注意此處判斷條件,int?str?或者賦予回答與答案一樣的數據類型.Score += 1return Scoreprint(GetScore(key1, key1_test)) # 在屏幕輸出成績第三個問題,python中的文件操作
本出我們使用的是python中的文件操作,open方法.
因為之前我們存儲問題,用戶回答,以及答案的變量都市list,而list在open操作中的行寫入或者行讀取,存在一定問題,我們這里直接使用list==>str,與str===>list的方式進行硬盤到內存的讀寫與轉換.
方法如下:
# 存儲 file = open(file="/home/fonttian/Data/17_DS_AI/open_file.txt", mode="w")file.write(" ".join(key1)) # file.write(str(key1)) file.close()# 讀取 file = open(file="/home/fonttian/Data/17_DS_AI/open_file.txt", mode="r") key_str = file.read() file.close() key_list = key_str.split(" ") print(key_list) # 輸出但是以上的代碼存在兩個明顯的不足之處,第一list與str轉化過程中使用的分個符號是” “,空格,而空格可能存在于我們的問題或者用戶答案中,所以我們需要使用更難被使用的分隔符號,比如六個星號"******"
同時為了避免用戶在答案中使用六個星號,我們在讀取數據后,可以在增加一個過濾字符串的操作,(除去六個星號).(過濾字符串請參考正則表達式部分)
第二個問題是,python中用更好的文件操作的方式,with,利用with我們可以自動關閉文件IO流,增加了安全性,減少了代碼量,同時也讓代碼更加結構化.
如同之前的提示:使用其他類庫也是可以的:
# 利用第三方類庫 import numpy as npnp_key1 = np.array([int(i) for i in key1]) print(np_key1) np.savetxt("/home/fonttian/Data/17_DS_AI/np_key1.txt", np_key1) np_key1 = np.loadtxt("/home/fonttian/Data/17_DS_AI/np_key1.txt") print(np_key1) # 格式轉化為 np.float封裝代碼
# 封裝def GetScore_Examples(key, answer):Score = 0for i in range(len(key)):if int(key[i]) == int(answer[i]): # 注意此處判斷條件,int?str?或者賦予回答與答案一樣的數據類型.Score += 1return Scoredef FileIO_Examples(filename, list=None, save=False):if save == False:with open(file=filename, mode="r") as file:return file.read().split("******")else:with open(file=filename, mode="w") as file:file.write("******".join(list))def Main_Examples():question = FileIO_Examples("/home/fonttian/Data/17_DS_AI/question.txt", save=False)key1 = FileIO_Examples("/home/fonttian/Data/17_DS_AI/key1.txt", save=False)answer_list = []for i in question: answer_list.append(input(i + "\n"))score = GetScore_Examples(key1, answer_list)print("your score :", score)FileIO_Examples(filename="/home/fonttian/Data/17_DS_AI/answer_list.txt", list=answer_list, save=True)Main_Examples()總結
以上是生活随笔為你收集整理的学习Python3:20171031的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9.3 Trains and Evalu
- 下一篇: Python中斐波那契数列的四种写法